diff --git a/app/build.gradle b/app/build.gradle
index d919594..3debf66 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,80 +1,93 @@
-plugins {
-    id 'com.gladed.androidgitversion' version '0.4.9'
-}
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
-
-android {
-    compileSdkVersion 28
-    defaultConfig {
-        applicationId "com.supwisdom.posa711"
-        minSdkVersion 22
-        targetSdkVersion 28
-        versionName androidGitVersion.name()
-        versionCode androidGitVersion.code()
-        ndk {
-            abiFilters "arm64-v8a"
-        }
-        multiDexEnabled true
-    }
-    signingConfigs {
-        release {
-            storeFile file("$rootDir/keys-app.jks")
-            storePassword "123456"
-            keyAlias "sup"
-            keyPassword "123456"
-            v1SigningEnabled true
-            v2SigningEnabled true
-        }
-    }
-    buildTypes {
-        release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
-            signingConfig signingConfigs.release
-        }
-    }
-    compileOptions {
-        sourceCompatibility 1.8
-        targetCompatibility 1.8
-    }
-    packagingOptions {
-        exclude 'META-INF/DEPENDENCIES'
-        exclude 'META-INF/LICENSE'
-        exclude 'META-INF/LICENSE.txt'
-        exclude 'META-INF/license.txt'
-        exclude 'META-INF/NOTICE'
-        exclude 'META-INF/NOTICE.txt'
-        exclude 'META-INF/notice.txt'
-        exclude 'META-INF/ASL2.0'
-    }
-}
-
-dependencies {
-//    implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61'
-    implementation group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: '1.3.61'
-    implementation 'com.android.support:appcompat-v7:28.0.0'
-    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
-    testImplementation 'junit:junit:4.12'
-    androidTestImplementation 'com.android.support.test:runner:1.0.2'
-    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
-
-//    compile 'com.alibaba:fastjson:1.1.70.android'
-    implementation 'com.google.code.gson:gson:2.8.6'
-    implementation 'com.nineoldandroids:parent:2.4.0'
-    implementation 'com.squareup.okhttp3:okhttp:4.2.2'
-    implementation 'net.java.dev.jna:jna:5.5.0@aar'
-    implementation 'com.koushikdutta.async:androidasync:2.2.1'
-    implementation group: 'com.android.support', name: 'recyclerview-v7', version: '28.0.0'
-    implementation 'org.apache.commons:commons-lang3:3.9'
-    implementation 'com.android.support:multidex:1.0.3'
-    implementation 'org.jetbrains.kotlin:kotlin-reflect:1.3.61'
-    implementation 'org.springframework.android:spring-android-core:1.0.1.RELEASE'
-    implementation 'org.apache.httpcomponents:httpcore:4.4.13'
-    implementation("com.beust:klaxon:0.30") {
-        exclude group: 'org.jetbrains'
-    }
-    compile files('libs/zxinglibsl.jar')
-}
+plugins {
+    id 'com.gladed.androidgitversion' version '0.4.9'
+}
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+    compileSdkVersion 28
+    defaultConfig {
+        applicationId "com.supwisdom.posa711"
+        minSdkVersion 22
+        targetSdkVersion 28
+        versionName androidGitVersion.name()
+        versionCode androidGitVersion.code()
+        ndk {
+            abiFilters "arm64-v8a"
+        }
+        multiDexEnabled true
+    }
+    signingConfigs {
+        release {
+            storeFile file("$rootDir/keys-app.jks")
+            storePassword "123456"
+            keyAlias "sup"
+            keyPassword "123456"
+            v1SigningEnabled true
+            v2SigningEnabled true
+        }
+        sign {
+            storeFile file("$rootDir/keys-sign.jks")
+            storePassword "123456"
+            keyAlias "sup"
+            keyPassword "android"
+            v1SigningEnabled true
+            v2SigningEnabled true
+        }
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+            signingConfig signingConfigs.release
+        }
+        debug {
+            signingConfig signingConfigs.sign
+        }
+    }
+    compileOptions {
+        sourceCompatibility 1.8
+        targetCompatibility 1.8
+    }
+    packagingOptions {
+        exclude 'META-INF/DEPENDENCIES'
+        exclude 'META-INF/LICENSE'
+        exclude 'META-INF/LICENSE.txt'
+        exclude 'META-INF/license.txt'
+        exclude 'META-INF/NOTICE'
+        exclude 'META-INF/NOTICE.txt'
+        exclude 'META-INF/notice.txt'
+        exclude 'META-INF/ASL2.0'
+    }
+}
+
+dependencies {
+//    implementation fileTree(dir: 'libs', include: ['*.jar'])
+    implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61'
+    implementation group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: '1.3.61'
+    implementation 'com.android.support:appcompat-v7:28.0.0'
+    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+
+//    compile 'com.alibaba:fastjson:1.1.70.android'
+    implementation 'com.google.code.gson:gson:2.8.6'
+    implementation 'com.nineoldandroids:parent:2.4.0'
+    implementation 'com.squareup.okhttp3:okhttp:4.2.2'
+    implementation 'net.java.dev.jna:jna:5.5.0@aar'
+    implementation 'com.koushikdutta.async:androidasync:2.2.1'
+    implementation group: 'com.android.support', name: 'recyclerview-v7', version: '28.0.0'
+    implementation 'org.apache.commons:commons-lang3:3.9'
+    implementation 'com.android.support:multidex:1.0.3'
+    implementation 'org.jetbrains.kotlin:kotlin-reflect:1.3.61'
+    implementation 'org.springframework.android:spring-android-core:1.0.1.RELEASE'
+    implementation 'org.apache.httpcomponents:httpcore:4.4.13'
+    implementation("com.beust:klaxon:0.30") {
+        exclude group: 'org.jetbrains'
+    }
+    implementation files('libs/zxinglibsl.jar')
+    implementation files('libs/codelib_3.0.2_release.jar')
+    implementation files('libs/bcprov-jdk16-145.jar')
+}
diff --git a/app/libs/bcprov-jdk16-145.jar b/app/libs/bcprov-jdk16-145.jar
new file mode 100644
index 0000000..38685d5
--- /dev/null
+++ b/app/libs/bcprov-jdk16-145.jar
Binary files differ
diff --git a/app/libs/codelib_3.0.2_release.jar b/app/libs/codelib_3.0.2_release.jar
new file mode 100644
index 0000000..0ae8e33
--- /dev/null
+++ b/app/libs/codelib_3.0.2_release.jar
Binary files differ
diff --git a/app/src/main/java/com/supwisdom/activities/SPApplication.kt b/app/src/main/java/com/supwisdom/activities/SPApplication.kt
index 781fd44..c8cf58f 100644
--- a/app/src/main/java/com/supwisdom/activities/SPApplication.kt
+++ b/app/src/main/java/com/supwisdom/activities/SPApplication.kt
@@ -1,69 +1,86 @@
-package com.supwisdom.activities
-
-import android.content.Context
-import android.content.Intent
-import android.support.multidex.MultiDex
-import android.support.multidex.MultiDexApplication
-import com.supwisdom.db.Pos
-import com.supwisdom.utils.CommonUtil
-import com.supwisdom.utils.PublicDef
-
-/**
- ** create by zzq on 2019/7/23
- ** @desc
- **/
-class SPApplication : MultiDexApplication() {
-    private var mPos: Pos? = null
-    @Volatile
-    private var epayLinking: Boolean = false //链路状态 true 联机
-
-    companion object {
-        @Volatile
-        private var mInstance: SPApplication? = null
-
-        fun getInstance(): SPApplication {
-            return mInstance!!
-        }
-    }
-
-    fun getPos(): Pos {
-        if (mPos == null) {
-            synchronized(SPApplication::class.java) {
-                if (mPos == null) {
-                    mPos = Pos(applicationContext)
-                }
-            }
-        }
-        return mPos!!
-    }
-
-    fun setEpayLinking(isOnline: Boolean) {
-        epayLinking = isOnline
-    }
-
-    fun isOnline(): Boolean {
-        return epayLinking
-    }
-
-    override fun onCreate() {
-        super.onCreate()
-        mInstance = this
-        startService()
-        CrashHandler.getInstance().init(applicationContext)
-    }
-
-    override fun attachBaseContext(base: Context) {
-        super.attachBaseContext(base)
-        MultiDex.install(this)
-    }
-
-    private fun startService() {
-        if (!CommonUtil.isServiceWork(this, PublicDef.BG_SERVICE_NAME)) {
-            startService(Intent(this, ServiceDemo::class.java))
-        }
-    }
-
-    fun stopService() {
-        stopService(Intent(this, ServiceDemo::class.java))
-    }
+package com.supwisdom.activities
+
+import android.content.Context
+import android.content.Intent
+import android.support.multidex.MultiDex
+import android.support.multidex.MultiDexApplication
+import com.supwisdom.db.Pos
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.PublicDef
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+class SPApplication : MultiDexApplication() {
+    private var mPos: Pos? = null
+
+    @Volatile
+    private var epayLinking: Boolean = false //链路状态 true 联机
+    private var synoCodeActive: Boolean = false // true-激活
+
+    companion object {
+        @Volatile
+        private var mInstance: SPApplication? = null
+
+        fun getInstance(): SPApplication {
+            return mInstance!!
+        }
+    }
+
+    fun getPos(): Pos {
+        if (mPos == null) {
+            synchronized(SPApplication::class.java) {
+                if (mPos == null) {
+                    mPos = Pos(applicationContext)
+                }
+            }
+        }
+        return mPos!!
+    }
+
+    fun isSynoCodeActive(): Boolean {
+        return synoCodeActive
+    }
+
+    fun setSynoCodeActive(active: Boolean) {
+        this.synoCodeActive = active
+    }
+
+    fun setEpayLinking(isOnline: Boolean) {
+        epayLinking = isOnline
+    }
+
+    fun isOnline(): Boolean {
+        return epayLinking
+    }
+
+    private val startime: String = DateUtil.getNowDateTime()
+
+    fun getStartime(): String {
+        return startime
+    }
+
+    override fun onCreate() {
+        super.onCreate()
+        mInstance = this
+        startService()
+        CrashHandler.getInstance().init(applicationContext)
+    }
+
+    override fun attachBaseContext(base: Context) {
+        super.attachBaseContext(base)
+        MultiDex.install(this)
+    }
+
+    private fun startService() {
+        if (!CommonUtil.isServiceWork(this, PublicDef.BG_SERVICE_NAME)) {
+            startService(Intent(this, ServiceDemo::class.java))
+        }
+    }
+
+    fun stopService() {
+        stopService(Intent(this, ServiceDemo::class.java))
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/auxscreen/AuxScreenController.kt b/app/src/main/java/com/supwisdom/activities/auxscreen/AuxScreenController.kt
index 2e81b1c..9f9ebc8 100644
--- a/app/src/main/java/com/supwisdom/activities/auxscreen/AuxScreenController.kt
+++ b/app/src/main/java/com/supwisdom/activities/auxscreen/AuxScreenController.kt
@@ -1,263 +1,297 @@
-package com.supwisdom.auxscreen
-
-import android.graphics.Color
-import com.newcapec.jni.AuxScreen
-import com.supwisdom.utils.CommonUtil
-import java.util.concurrent.locks.ReentrantLock
-
-/**
- * @author gqy
- * @version 1.0.1
- * @date 2018/7/11
- * @desc 小屏控制器
- */
-class AuxScreenController private constructor() {
-    private var auxScreen = AuxScreen()
-    private val xStart = 15
-    private val xSecStart = 240
-    private val sTitle = "refreshTitle"
-    private val sContent = "refreshContent"
-    private val sBottom = "refreshBottom"
-    private val lock = ReentrantLock()
-    private val refreshMap = hashMapOf<String, Any>()
-    private val auxRunnable = AuxRunnable()
-    private var isExit = false
-    private var taskThread: Thread? = null
-
-    companion object {
-        @Volatile
-        private var auxController: AuxScreenController? = null
-
-        fun getInstance(): AuxScreenController {
-            if (null == auxController) {
-                synchronized(AuxScreenController::class.java) {
-                    if (null == auxController) {
-                        auxController = AuxScreenController()
-                    }
-                }
-            }
-            return auxController!!
-        }
-    }
-
-    /**
-     * 刷新标题栏
-     * @param title 标题
-     */
-    fun refreshTitle(title: String) {
-        lock.lock()
-        refreshMap[sTitle] = title
-        lock.unlock()
-    }
-
-    private fun localRefreshTitle(title: String) {
-        auxScreen.setBgcolor(Color.parseColor("#FFFFFF"))
-        auxScreen.clrLine(0, 50)
-        auxScreen.setBgcolor(Color.parseColor("#FFFFFF"))
-        auxScreen.setFontSize(20)
-        auxScreen.setFgcolor(Color.parseColor("#000000"))
-        auxScreen.textOut(xStart, 15, title)
-    }
-
-    /**
-     * 内容显示
-     * @param list 显示内容 size<=5
-     */
-    fun refreshContent(list: List<String>) {
-        lock.lock()
-        refreshMap[sContent] = list
-        lock.unlock()
-    }
-
-    private fun localRefreshContent(list: List<String>) {
-        auxScreen.setBgcolor(Color.parseColor("#F2F2F2"))
-        clearCenterContent()
-
-        val size = list.size
-        auxScreen.setFgcolor(Color.parseColor("#000000"))
-        when (size) {
-            0 -> {
-
-            }
-            1 -> {
-                auxScreen.setFontSize(40)
-                auxScreen.textOut(xStart, 140, getNotEmptyString(list[0]))
-            }
-            2 -> {
-                auxScreen.setFontSize(35)
-                for (index in 0 until size) {
-                    auxScreen.textOut(xStart, 120 + 60 * index, getNotEmptyString(list[index]))
-                }
-            }
-            3 -> {
-                auxScreen.setFontSize(30)
-                for (index in 0 until size) {
-                    auxScreen.textOut(xStart, 100 + 50 * index, getNotEmptyString(list[index]))
-                }
-            }
-            4 -> {
-                auxScreen.setFontSize(25)
-                for (index in 0 until size) {
-                    auxScreen.textOut(xStart, 80 + 45 * index, getNotEmptyString(list[index]))
-                }
-            }
-            5 -> {
-                auxScreen.setFontSize(20)
-                for (index in 0 until size) {
-                    auxScreen.textOut(xStart, 70 + 40 * index, getNotEmptyString(list[index]))
-                }
-            }
-            6 -> {
-                auxScreen.setFontSize(15)
-                for (index in 0 until size) {
-                    auxScreen.textOut(xStart, 60 + 35 * index, getNotEmptyString(list[index]))
-                }
-            }
-            7, 8 -> {
-                auxScreen.setFontSize(25)
-                for (index in 0 until (size + 1) / 2) {
-                    auxScreen.textOut(xStart, 80 + 45 * index, getNotEmptyString(list[2 * index]))
-                    if (2 * index + 1 < size) {
-                        auxScreen.textOut(xSecStart, 80 + 45 * index, getNotEmptyString(list[2 * index + 1]))
-                    }
-                }
-            }
-            9, 10 -> {
-                auxScreen.setFontSize(20)
-                for (index in 0 until (size + 1) / 2) {
-                    auxScreen.textOut(xStart, 70 + 40 * index, getNotEmptyString(list[2 * index]))
-                    if (2 * index + 1 < size) {
-                        auxScreen.textOut(xSecStart, 70 + 40 * index, getNotEmptyString(list[2 * index + 1]))
-                    }
-                }
-            }
-            else -> {
-                auxScreen.setFontSize(15)
-                for (index in 0 until (size + 1) / 2) {
-                    auxScreen.textOut(xStart, 60 + 35 * index, getNotEmptyString(list[2 * index]))
-                    if (2 * index + 1 < size) {
-                        auxScreen.textOut(xSecStart, 60 + 35 * index, getNotEmptyString(list[2 * index + 1]))
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * 处理输入的空字符串
-     */
-    private fun getNotEmptyString(input: String?): String {
-        if (input == null || input.isEmpty()) {
-            return " "
-        }
-        return input
-    }
-
-    /**
-     * 刷新底部状态
-     * @param bottom 提示
-     */
-    fun refreshBottom(bottom: String) {
-        lock.lock()
-        refreshMap[sBottom] = bottom
-        lock.unlock()
-    }
-
-    private fun localRefreshBootom(bottom: String) {
-        auxScreen.setBgcolor(Color.parseColor("#FFFFFF"))
-        auxScreen.clrLine(269, 319)
-
-        auxScreen.setFontSize(20)
-        auxScreen.setFgcolor(Color.parseColor("#000000"))
-        auxScreen.textOut(15, 284, bottom)
-    }
-
-    /**
-     * 清空中间的内容
-     * @注意：此处必须一行一行的清除，底层bug
-     */
-    private fun clearCenterContent() {
-        auxScreen.clrLine(50, 100)
-        auxScreen.clrLine(100, 150)
-        auxScreen.clrLine(150, 200)
-        auxScreen.clrLine(200, 250)
-        auxScreen.clrLine(250, 269)
-        auxScreen.setFontSize(50)
-    }
-
-    /**
-     * 打开小屏
-     */
-    fun open() {
-        auxScreen.open()
-        if (taskThread == null) {
-            isExit = false
-            taskThread = Thread(auxRunnable)
-            taskThread!!.start()
-        }
-    }
-
-    /**
-     * 关闭小屏
-     */
-    fun close() {
-        auxScreen.close()
-        isExit = true
-        taskThread?.interrupt()
-        taskThread = null
-    }
-
-    /**
-     * 初始化小屏
-     */
-    private fun init() {
-        auxScreen.setBgcolor(Color.parseColor("#F2F2F2"))
-        auxScreen.cls()
-        auxScreen.setSpace(5, 5)
-        auxScreen.selectFont(AuxScreen.FONT_CODE_UTF8)
-    }
-
-    inner class AuxRunnable : Runnable {
-        override fun run() {
-            init()
-            while (!isExit) {
-                try {
-                    try {
-                        lock.lock()
-                        val title = refreshMap[sTitle]
-                        if (title != null) {
-                            localRefreshTitle(title as String)
-                            refreshMap.remove(sTitle)
-                        }
-                    } finally {
-                        lock.unlock()
-                    }
-                    try {
-                        lock.lock()
-                        val content = refreshMap[sContent]
-                        if (content != null) {
-                            localRefreshContent(content as List<String>)
-                            refreshMap.remove(sContent)
-                        }
-                    } finally {
-                        lock.unlock()
-                    }
-                    try {
-                        lock.lock()
-                        val bottom = refreshMap[sBottom]
-                        if (bottom != null) {
-                            localRefreshBootom(bottom as String)
-                            refreshMap.remove(sBottom)
-                        }
-                    } finally {
-                        lock.unlock()
-                    }
-                } catch (ex: Exception) {
-                    ex.printStackTrace()
-                }
-                CommonUtil.doSleep(25)
-            }
-        }
-    }
-}
-
+package com.supwisdom.activities.auxscreen
+
+import android.graphics.Color
+import com.newcapec.jni.AuxScreen
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.LogUtil
+import java.util.concurrent.locks.ReentrantLock
+
+/**
+ * @author gqy
+ * @version 1.0.1
+ * @date 2018/7/11
+ * @desc 小屏控制器
+ */
+class AuxScreenController private constructor() {
+    private val TAG = "AuxScreenController"
+    private var auxScreen = AuxScreen()
+    private val xStart = 15
+    private val xSecStart = 240
+    private val sTitle = "refreshTitle"
+    private val sContent = "refreshContent"
+    private val sBottom = "refreshBottom"
+    private val lock = ReentrantLock()
+    private val refreshMap = hashMapOf<String, Any>()
+    private val auxRunnable = AuxRunnable()
+    private var taskThread: Thread? = null
+
+    companion object {
+        @Volatile
+        private var auxController: AuxScreenController? = null
+
+        fun getInstance(): AuxScreenController {
+            if (null == auxController) {
+                synchronized(AuxScreenController::class.java) {
+                    if (null == auxController) {
+                        auxController = AuxScreenController()
+                    }
+                }
+            }
+            return auxController!!
+        }
+    }
+
+    /**
+     * 刷新标题栏
+     * @param title 标题
+     */
+    fun refreshTitle(title: String) {
+        lock.lock()
+        refreshMap[sTitle] = title
+        lock.unlock()
+    }
+
+    private fun localRefreshTitle(title: String) {
+        auxScreen.setBgcolor(Color.parseColor("#FFFFFF"))
+        auxScreen.clrLine(0, 50)
+        auxScreen.setBgcolor(Color.parseColor("#FFFFFF"))
+        auxScreen.setFontSize(20)
+        auxScreen.setFgcolor(Color.parseColor("#000000"))
+        auxScreen.textOut(xStart, 15, title)
+    }
+
+    /**
+     * 内容显示
+     * @param list 显示内容 size<=5
+     */
+    fun refreshContent(list: List<String>) {
+        lock.lock()
+        refreshMap[sContent] = list
+        lock.unlock()
+    }
+
+    private fun localRefreshContent(list: List<String>) {
+        auxScreen.setBgcolor(Color.parseColor("#F2F2F2"))
+        clearCenterContent()
+
+        val size = list.size
+        auxScreen.setFgcolor(Color.parseColor("#000000"))
+        when (size) {
+            0 -> {
+
+            }
+            1 -> {
+                auxScreen.setFontSize(40)
+                auxScreen.textOut(xStart, 140, getNotEmptyString(list[0]))
+            }
+            2 -> {
+                auxScreen.setFontSize(35)
+                for (index in 0 until size) {
+                    auxScreen.textOut(xStart, 120 + 60 * index, getNotEmptyString(list[index]))
+                }
+            }
+            3 -> {
+                auxScreen.setFontSize(30)
+                for (index in 0 until size) {
+                    auxScreen.textOut(xStart, 100 + 50 * index, getNotEmptyString(list[index]))
+                }
+            }
+            4 -> {
+                auxScreen.setFontSize(25)
+                for (index in 0 until size) {
+                    auxScreen.textOut(xStart, 80 + 45 * index, getNotEmptyString(list[index]))
+                }
+            }
+            5 -> {
+                auxScreen.setFontSize(20)
+                for (index in 0 until size) {
+                    auxScreen.textOut(xStart, 70 + 40 * index, getNotEmptyString(list[index]))
+                }
+            }
+            6 -> {
+                auxScreen.setFontSize(15)
+                for (index in 0 until size) {
+                    auxScreen.textOut(xStart, 60 + 35 * index, getNotEmptyString(list[index]))
+                }
+            }
+            7, 8 -> {
+                auxScreen.setFontSize(25)
+                for (index in 0 until (size + 1) / 2) {
+                    auxScreen.textOut(xStart, 80 + 45 * index, getNotEmptyString(list[2 * index]))
+                    if (2 * index + 1 < size) {
+                        auxScreen.textOut(
+                            xSecStart,
+                            80 + 45 * index,
+                            getNotEmptyString(list[2 * index + 1])
+                        )
+                    }
+                }
+            }
+            9, 10 -> {
+                auxScreen.setFontSize(20)
+                for (index in 0 until (size + 1) / 2) {
+                    auxScreen.textOut(xStart, 70 + 40 * index, getNotEmptyString(list[2 * index]))
+                    if (2 * index + 1 < size) {
+                        auxScreen.textOut(
+                            xSecStart,
+                            70 + 40 * index,
+                            getNotEmptyString(list[2 * index + 1])
+                        )
+                    }
+                }
+            }
+            else -> {
+                auxScreen.setFontSize(15)
+                for (index in 0 until (size + 1) / 2) {
+                    auxScreen.textOut(xStart, 60 + 35 * index, getNotEmptyString(list[2 * index]))
+                    if (2 * index + 1 < size) {
+                        auxScreen.textOut(
+                            xSecStart,
+                            60 + 35 * index,
+                            getNotEmptyString(list[2 * index + 1])
+                        )
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 处理输入的空字符串
+     */
+    private fun getNotEmptyString(input: String?): String {
+        if (input == null || input.isEmpty()) {
+            return " "
+        }
+        return input
+    }
+
+    /**
+     * 刷新底部状态
+     * @param bottom 提示
+     */
+    fun refreshBottom(bottom: String) {
+        lock.lock()
+        refreshMap[sBottom] = bottom
+        lock.unlock()
+    }
+
+    private fun localRefreshBootom(bottom: String) {
+        auxScreen.setBgcolor(Color.parseColor("#FFFFFF"))
+        auxScreen.clrLine(269, 319)
+
+        auxScreen.setFontSize(20)
+        auxScreen.setFgcolor(Color.parseColor("#000000"))
+        auxScreen.textOut(15, 284, bottom)
+    }
+
+    /**
+     * 清空中间的内容
+     * @注意：此处必须一行一行的清除，底层bug
+     */
+    private fun clearCenterContent() {
+        auxScreen.clrLine(50, 100)
+        auxScreen.clrLine(100, 150)
+        auxScreen.clrLine(150, 200)
+        auxScreen.clrLine(200, 250)
+        auxScreen.clrLine(250, 269)
+        auxScreen.setFontSize(50)
+    }
+
+    /**
+     * 打开小屏
+     */
+    @Synchronized
+    fun open() {
+        auxScreen.open()
+        if (taskThread == null) {
+            taskThread = Thread(auxRunnable)
+            taskThread!!.start()
+        }
+    }
+
+    /**
+     * 关闭小屏
+     */
+    @Synchronized
+    fun close() {
+        auxScreen.close()
+        taskThread?.interrupt()
+        taskThread = null
+    }
+
+    /**
+     * 初始化小屏
+     */
+    private fun init() {
+        auxScreen.setBgcolor(Color.parseColor("#F2F2F2"))
+        auxScreen.cls()
+        auxScreen.setSpace(5, 5)
+        auxScreen.selectFont(AuxScreen.FONT_CODE_UTF8)
+    }
+
+    private inner class AuxRunnable : Runnable {
+        override fun run() {
+            init()
+            var lastTitle = ""
+            var lastBottom = ""
+            while (!Thread.currentThread().isInterrupted) {
+                try {
+                    if (lock.tryLock()) {
+                        val title = refreshMap[sTitle]
+                        if (title != null) {
+                            if (lastTitle != title) {
+                                localRefreshTitle(title as String)
+                                lastTitle = title
+                            }
+                            refreshMap.remove(sTitle)
+                        }
+                        lock.unlock()
+                    }
+                    if (lock.tryLock()) {
+                        val content = refreshMap[sContent]
+                        if (content != null) {
+                            localRefreshContent(content as List<String>)
+                            refreshMap.remove(sContent)
+                        }
+                        lock.unlock()
+                    }
+                    if (lock.tryLock()) {
+                        val bottom = refreshMap[sBottom]
+                        if (bottom != null) {
+                            if (lastBottom != bottom) {
+                                localRefreshBootom(bottom as String)
+                                lastBottom = bottom
+                            }
+                            refreshMap.remove(sBottom)
+                        }
+                        lock.unlock()
+                    }
+                } catch (ex: InterruptedException) {
+                    ex.printStackTrace()
+                    LogUtil.e(
+                        TAG,
+                        "aux screen AuxRunnable InterruptedException,ex=${
+                            CommonUtil.getExceptionStack(ex)
+                        }"
+                    )
+                    return
+                }
+                try {
+                    Thread.sleep(22)
+                } catch (ex: InterruptedException) {
+                    ex.printStackTrace()
+                    LogUtil.e(
+                        TAG,
+                        "aux screen AuxRunnable InterruptedException,ex=${
+                            CommonUtil.getExceptionStack(ex)
+                        }"
+                    )
+                    return
+                }
+            }
+            LogUtil.e(TAG, "aux screen runnable is close!!!!")
+        }
+    }
+}
+
diff --git a/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt b/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt
index 1417fe2..8aa0cd7 100644
--- a/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt
@@ -1,121 +1,122 @@
-package com.supwisdom.activities.cardlib
-
-import android.os.Bundle
-import android.view.KeyEvent
-import android.view.View
-import android.view.Window
-import android.widget.ProgressBar
-import android.widget.TextView
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.init.InitActivity
-import com.supwisdom.activities.load.LoadActivity
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.utils.AppExitUtil
-import com.supwisdom.utils.DateUtil
-import com.supwisdom.view.BigProgressDialog
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc
- **/
-@Suppress("DEPRECATION")
-class CardlibActivity : BaseActivity(), ICardlibView {
-    private val pos = SPApplication.getInstance().getPos()
-    private lateinit var vResult: TextView
-    private var vProgressBar: ProgressBar? = null
-    private var presenter: CardlibPresenter? = null
-    @Volatile
-    private var isLoading = false
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        //在窗口标题上显示带进度的横向进度条
-        requestWindowFeature(Window.FEATURE_PROGRESS)
-        //显示不带进度的进度条
-        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS)
-
-        setContentView(R.layout.activity_cardlib)
-        initView()
-        initData()
-    }
-
-    private fun initData() {
-        presenter = CardlibPresenter(this)
-    }
-
-    private fun initView() {
-        vProgressBar = this.findViewById(R.id.cardlib_bar) as ProgressBar
-        vResult = this.findViewById(R.id.cardlib_result) as TextView
-    }
-
-    override fun showProgress(progress: Int) {
-        vProgressBar!!.progress = progress
-    }
-
-    override fun onResume() {
-        super.onResume()
-        if (!isLoading) {
-            isLoading = true
-            refresh()
-            presenter!!.initCardlib(this)
-        }
-    }
-
-    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
-        if (event.action == KeyEvent.ACTION_DOWN) {
-            if (isLoading) {
-                return false
-            }
-            when (event.keyCode) {
-                KeyEvent.KEYCODE_DEL -> {
-                    AppExitUtil.exit()
-                }
-            }
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
-    private fun refresh() {
-        AuxScreenController.getInstance().refreshTitle("卡库初始化")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
-        AuxScreenController.getInstance().refreshContent(listOf("加载硬件驱动", "请稍等..."))
-    }
-
-    override fun showInitCardlibResult(issuccess: Boolean, msg: String) {
-        if (issuccess) {
-            val record = pos.getConfigPara()
-            if (record != null && record.initOK && pos.getDynamicPara() != null) {
-                jumpActivity(LoadActivity::class.java)
-            } else {
-                jumpActivity(InitActivity::class.java)
-            }
-        } else {
-            vResult.text = msg
-            vResult.visibility = View.VISIBLE
-            AuxScreenController.getInstance().refreshTitle("卡库初始化")
-            AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
-            AuxScreenController.getInstance().refreshContent(listOf("请联系管理员", "加载驱动失败", "原因:", msg))
-        }
-        isLoading = false
-    }
-
-    private var dialogProgress: BigProgressDialog? = null
-
-    override fun showProgressDialog(msg: String) {
-        if (dialogProgress == null) {
-            dialogProgress = BigProgressDialog(this, msg, false)
-        }
-        dialogProgress!!.setMsg(msg)
-        dialogProgress!!.show()
-    }
-
-    override fun closeProgressDialog() {
-        dialogProgress?.dismiss()
-    }
-
-    override fun onDestroy() {
-        super.onDestroy()
-    }
+package com.supwisdom.activities.cardlib
+
+import android.os.Bundle
+import android.view.KeyEvent
+import android.view.View
+import android.view.Window
+import android.widget.ProgressBar
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.init.InitActivity
+import com.supwisdom.activities.load.LoadActivity
+import com.supwisdom.utils.AppExitUtil
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.view.BigProgressDialog
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+@Suppress("DEPRECATION")
+class CardlibActivity : BaseActivity(), ICardlibView {
+    private val pos = SPApplication.getInstance().getPos()
+    private lateinit var vResult: TextView
+    private var vProgressBar: ProgressBar? = null
+    private var presenter: CardlibPresenter? = null
+
+    @Volatile
+    private var isLoading = false
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        //在窗口标题上显示带进度的横向进度条
+        requestWindowFeature(Window.FEATURE_PROGRESS)
+        //显示不带进度的进度条
+        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS)
+
+        setContentView(R.layout.activity_cardlib)
+        initView()
+        initData()
+    }
+
+    private fun initData() {
+        presenter = CardlibPresenter(this)
+    }
+
+    private fun initView() {
+        vProgressBar = this.findViewById(R.id.cardlib_bar) as ProgressBar
+        vResult = this.findViewById(R.id.cardlib_result) as TextView
+    }
+
+    override fun showProgress(progress: Int) {
+        vProgressBar!!.progress = progress
+    }
+
+    override fun onResume() {
+        super.onResume()
+        if (!isLoading) {
+            isLoading = true
+            refresh()
+            presenter!!.initCardlib(this)
+        }
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            if (isLoading) {
+                return false
+            }
+            when (event.keyCode) {
+                KeyEvent.KEYCODE_DEL -> {
+                    AppExitUtil.exit()
+                }
+            }
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    private fun refresh() {
+        AuxScreenController.getInstance().refreshTitle("卡库初始化")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
+        AuxScreenController.getInstance().refreshContent(listOf("加载硬件驱动", "请稍等..."))
+    }
+
+    override fun showInitCardlibResult(issuccess: Boolean, msg: String) {
+        if (issuccess) {
+            val record = pos.getConfigPara()
+            if (record != null && record.initOK && pos.getDynamicPara() != null) {
+                jumpActivity(LoadActivity::class.java)
+            } else {
+                jumpActivity(InitActivity::class.java)
+            }
+        } else {
+            vResult.text = msg
+            vResult.visibility = View.VISIBLE
+            AuxScreenController.getInstance().refreshTitle("卡库初始化")
+            AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
+            AuxScreenController.getInstance().refreshContent(listOf("请联系管理员", "加载驱动失败", "原因:", msg))
+        }
+        isLoading = false
+    }
+
+    private var dialogProgress: BigProgressDialog? = null
+
+    override fun showProgressDialog(msg: String) {
+        if (dialogProgress == null) {
+            dialogProgress = BigProgressDialog(this, msg, false)
+        }
+        dialogProgress!!.setMsg(msg)
+        dialogProgress!!.show()
+    }
+
+    override fun closeProgressDialog() {
+        dialogProgress?.dismiss()
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/checkMngpwd/CheckMngpwdActivity.kt b/app/src/main/java/com/supwisdom/activities/checkMngpwd/CheckMngpwdActivity.kt
index 007c9cd..6ca021f 100644
--- a/app/src/main/java/com/supwisdom/activities/checkMngpwd/CheckMngpwdActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/checkMngpwd/CheckMngpwdActivity.kt
@@ -1,138 +1,138 @@
-package com.supwisdom.activities.checkMngpwd
-
-import android.content.Intent
-import android.os.Bundle
-import android.os.CountDownTimer
-import android.view.KeyEvent
-import android.widget.TextView
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.manage.ManageActivity
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.utils.CommonUtil
-import java.util.*
-
-/**
- ** create by zzq on 2019/7/26
- ** @desc
- **/
-class CheckMngpwdActivity : BaseActivity() {
-    private var tmpPwd: String = ""
-    private lateinit var vTitle: TextView
-    private var password: String = ""
-    private var mode: String? = null
-    private var keyActive = true
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        this.setContentView(R.layout.activity_check_mngpwd)
-        initView()
-    }
-
-    private fun initView() {
-        vTitle = findViewById<TextView>(R.id.title)
-    }
-
-    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
-        if (event.action == KeyEvent.ACTION_DOWN) {
-            if (!keyActive) {
-                return super.dispatchKeyEvent(event)
-            }
-            resetCounter(200)
-
-            val keyCode = event.keyCode
-            when (keyCode) {
-                KeyEvent.KEYCODE_0,
-                KeyEvent.KEYCODE_1,
-                KeyEvent.KEYCODE_2,
-                KeyEvent.KEYCODE_3,
-                KeyEvent.KEYCODE_4,
-                KeyEvent.KEYCODE_5,
-                KeyEvent.KEYCODE_6,
-                KeyEvent.KEYCODE_7,
-                KeyEvent.KEYCODE_8,
-                KeyEvent.KEYCODE_9 -> {
-                    tmpPwd += keyCode - KeyEvent.KEYCODE_0
-                    if (tmpPwd.length >= 6) {
-                        if (checkMngPwd(tmpPwd)) {
-                            jumpActivity(ManageActivity::class.java)
-                        } else {
-                            AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("维护密码:", "密码错误"))
-                        }
-                        tmpPwd = ""
-                    } else {
-                        AuxScreenController.getInstance()
-                            .refreshContent(Arrays.asList("维护密码:", CommonUtil.getPasswordStar(tmpPwd.length)))
-                    }
-                }
-                KeyEvent.KEYCODE_DEL -> {
-                    //cancel
-                    val len = tmpPwd.length
-                    when {
-                        len == 1 -> {
-                            tmpPwd = ""
-                            AuxScreenController.getInstance()
-                                .refreshContent(Arrays.asList("维护密码:", CommonUtil.getPasswordStar(tmpPwd.length)))
-                        }
-                        len > 1 -> {
-                            tmpPwd = tmpPwd.substring(0, len - 1)
-                            AuxScreenController.getInstance()
-                                .refreshContent(Arrays.asList("维护密码:", CommonUtil.getPasswordStar(tmpPwd.length)))
-                        }
-                        else -> finish()
-                    }
-                }
-            }
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
-    override fun onResume() {
-        super.onResume()
-        keyActive = true
-        password = this.intent.getStringExtra("password")
-        mode = this.intent.getStringExtra("mode")
-        refresh()
-    }
-
-    override fun onNewIntent(intent: Intent) {
-        super.onNewIntent(intent)
-        this.intent.putExtra("password", intent.getStringExtra("password"))
-        this.intent.putExtra("mode", intent.getStringExtra("mode"))
-    }
-
-    private fun refresh() {
-        tmpPwd = ""
-        vTitle.text = "维护密码验证"
-        AuxScreenController.getInstance().refreshTitle("维护密码验证")
-        AuxScreenController.getInstance().refreshBottom("取消键返回上页")
-        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("维护密码:", " "))
-    }
-
-    private fun checkMngPwd(inputPwd: String): Boolean {
-        return inputPwd == password
-    }
-
-    private var counter: ContinuePressTimer? = null
-
-    private fun resetCounter(timems: Long) {
-        counter?.cancel()
-        if (counter == null) {
-            counter = ContinuePressTimer(timems, 100)
-        }
-        keyActive = false
-        counter!!.start()
-    }
-
-    private inner class ContinuePressTimer internal constructor(millisInFuture: Long, countDownInterval: Long) :
-        CountDownTimer(millisInFuture, countDownInterval) {
-
-        override fun onTick(millisUntilFinished: Long) {
-
-        }
-
-        override fun onFinish() {
-            keyActive = true
-        }
-    }
+package com.supwisdom.activities.checkMngpwd
+
+import android.content.Intent
+import android.os.Bundle
+import android.os.CountDownTimer
+import android.view.KeyEvent
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.manage.ManageActivity
+import com.supwisdom.utils.CommonUtil
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/26
+ ** @desc
+ **/
+class CheckMngpwdActivity : BaseActivity() {
+    private var tmpPwd: String = ""
+    private lateinit var vTitle: TextView
+    private var password: String = ""
+    private var mode: String? = null
+    private var keyActive = true
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        this.setContentView(R.layout.activity_check_mngpwd)
+        initView()
+    }
+
+    private fun initView() {
+        vTitle = findViewById<TextView>(R.id.title)
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            if (!keyActive) {
+                return super.dispatchKeyEvent(event)
+            }
+            resetCounter(200)
+
+            val keyCode = event.keyCode
+            when (keyCode) {
+                KeyEvent.KEYCODE_0,
+                KeyEvent.KEYCODE_1,
+                KeyEvent.KEYCODE_2,
+                KeyEvent.KEYCODE_3,
+                KeyEvent.KEYCODE_4,
+                KeyEvent.KEYCODE_5,
+                KeyEvent.KEYCODE_6,
+                KeyEvent.KEYCODE_7,
+                KeyEvent.KEYCODE_8,
+                KeyEvent.KEYCODE_9 -> {
+                    tmpPwd += keyCode - KeyEvent.KEYCODE_0
+                    if (tmpPwd.length >= 6) {
+                        if (checkMngPwd(tmpPwd)) {
+                            jumpActivity(ManageActivity::class.java)
+                        } else {
+                            AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("维护密码:", "密码错误"))
+                        }
+                        tmpPwd = ""
+                    } else {
+                        AuxScreenController.getInstance()
+                            .refreshContent(Arrays.asList("维护密码:", CommonUtil.getPasswordStar(tmpPwd.length)))
+                    }
+                }
+                KeyEvent.KEYCODE_DEL -> {
+                    //cancel
+                    val len = tmpPwd.length
+                    when {
+                        len == 1 -> {
+                            tmpPwd = ""
+                            AuxScreenController.getInstance()
+                                .refreshContent(Arrays.asList("维护密码:", CommonUtil.getPasswordStar(tmpPwd.length)))
+                        }
+                        len > 1 -> {
+                            tmpPwd = tmpPwd.substring(0, len - 1)
+                            AuxScreenController.getInstance()
+                                .refreshContent(Arrays.asList("维护密码:", CommonUtil.getPasswordStar(tmpPwd.length)))
+                        }
+                        else -> finish()
+                    }
+                }
+            }
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        keyActive = true
+        password = this.intent.getStringExtra("password")
+        mode = this.intent.getStringExtra("mode")
+        refresh()
+    }
+
+    override fun onNewIntent(intent: Intent) {
+        super.onNewIntent(intent)
+        this.intent.putExtra("password", intent.getStringExtra("password"))
+        this.intent.putExtra("mode", intent.getStringExtra("mode"))
+    }
+
+    private fun refresh() {
+        tmpPwd = ""
+        vTitle.text = "维护密码验证"
+        AuxScreenController.getInstance().refreshTitle("维护密码验证")
+        AuxScreenController.getInstance().refreshBottom("取消键返回上页")
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("维护密码:", " "))
+    }
+
+    private fun checkMngPwd(inputPwd: String): Boolean {
+        return inputPwd == password
+    }
+
+    private var counter: ContinuePressTimer? = null
+
+    private fun resetCounter(timems: Long) {
+        counter?.cancel()
+        if (counter == null) {
+            counter = ContinuePressTimer(timems, 100)
+        }
+        keyActive = false
+        counter!!.start()
+    }
+
+    private inner class ContinuePressTimer internal constructor(millisInFuture: Long, countDownInterval: Long) :
+        CountDownTimer(millisInFuture, countDownInterval) {
+
+        override fun onTick(millisUntilFinished: Long) {
+
+        }
+
+        override fun onFinish() {
+            keyActive = true
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/checkShoppwd/CheckShoppwdActivity.kt b/app/src/main/java/com/supwisdom/activities/checkShoppwd/CheckShoppwdActivity.kt
index 5b12e29..0df7c50 100644
--- a/app/src/main/java/com/supwisdom/activities/checkShoppwd/CheckShoppwdActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/checkShoppwd/CheckShoppwdActivity.kt
@@ -1,161 +1,179 @@
-package com.supwisdom.activities.checkShoppwd
-
-import android.content.Intent
-import android.os.Bundle
-import android.os.CountDownTimer
-import android.view.KeyEvent
-import android.widget.TextView
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.consume.ConsumeActivity
-import com.supwisdom.activities.consume.bean.CardUserInfoBean
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.utils.CommonUtil
-import com.supwisdom.utils.SoundUtil
-import java.util.*
-
-/**
- ** create by zzq on 2019/7/26
- ** @desc
- **/
-class CheckShoppwdActivity : BaseActivity() {
-    private var tmpPwd: String = ""
-    private lateinit var vTitle: TextView
-    private lateinit var vContent: TextView
-    private var keyActive = true
-    private var transdtlType: String? = null
-    private val pos = SPApplication.getInstance().getPos()
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        this.setContentView(R.layout.activity_check_mngpwd)
-        initView()
-    }
-
-    private fun initView() {
-        vTitle = findViewById<TextView>(R.id.title)
-        vContent = findViewById<TextView>(R.id.content)
-    }
-
-    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
-        if (event.action == KeyEvent.ACTION_DOWN) {
-            if (!keyActive) {
-                return super.dispatchKeyEvent(event)
-            }
-            resetCounter(200)
-
-            val keyCode = event.keyCode
-            when (keyCode) {
-                KeyEvent.KEYCODE_0,
-                KeyEvent.KEYCODE_1,
-                KeyEvent.KEYCODE_2,
-                KeyEvent.KEYCODE_3,
-                KeyEvent.KEYCODE_4,
-                KeyEvent.KEYCODE_5,
-                KeyEvent.KEYCODE_6,
-                KeyEvent.KEYCODE_7,
-                KeyEvent.KEYCODE_8,
-                KeyEvent.KEYCODE_9 -> {
-                    tmpPwd += keyCode - KeyEvent.KEYCODE_0
-                    if (tmpPwd.length >= 6) {
-                        if (checkMngPwd(tmpPwd)) {
-                            doReverse()
-                        } else {
-                            AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("商户密码:", "密码错误"))
-                        }
-                        tmpPwd = ""
-                    } else {
-                        AuxScreenController.getInstance()
-                            .refreshContent(Arrays.asList("商户密码:", CommonUtil.getPasswordStar(tmpPwd.length)))
-                    }
-                }
-                KeyEvent.KEYCODE_DEL -> {
-                    //cancel
-                    val len = tmpPwd.length
-                    when {
-                        len == 1 -> {
-                            tmpPwd = ""
-                            AuxScreenController.getInstance()
-                                .refreshContent(Arrays.asList("商户密码:", CommonUtil.getPasswordStar(tmpPwd.length)))
-                        }
-                        len > 1 -> {
-                            tmpPwd = tmpPwd.substring(0, len - 1)
-                            AuxScreenController.getInstance()
-                                .refreshContent(Arrays.asList("商户密码:", CommonUtil.getPasswordStar(tmpPwd.length)))
-                        }
-                        else -> finish()
-                    }
-                }
-            }
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
-    override fun onResume() {
-        super.onResume()
-        keyActive = true
-        transdtlType = this.intent.getStringExtra("transdtlType")
-        refresh()
-    }
-
-    override fun onNewIntent(intent: Intent) {
-        super.onNewIntent(intent)
-        this.intent.putExtra("transdtlType", intent.getStringExtra("transdtlType"))
-    }
-
-    private fun refresh() {
-        tmpPwd = ""
-        vTitle.text = "手工冲正"
-        vContent.text = ""
-        AuxScreenController.getInstance().refreshTitle("商户密码验证")
-        AuxScreenController.getInstance().refreshBottom("取消键撤销输入")
-        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("商户密码:", " "))
-    }
-
-    private fun checkMngPwd(inputPwd: String): Boolean {
-        return inputPwd == pos.getConfigPara()!!.shopPwd
-    }
-
-    private fun doReverse() {
-
-    }
-
-    private fun showRvsSuc(info: CardUserInfoBean) {
-        val tmp = String.format("金额: %.02f元", info.payamt / 100.0f)
-        vContent.text = "冲正成功\n$tmp"
-        SoundUtil.playMusic(applicationContext, R.raw.reversal_suc)
-        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("冲正成功", tmp))
-        jumpActivity(ConsumeActivity::class.java)
-    }
-
-    private fun showRvsFail(errmsg: String) {
-        vContent.text = "冲正失败\n$errmsg"
-        SoundUtil.playMusic(applicationContext, R.raw.reversal_fail)
-        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("冲正失败", errmsg))
-        jumpActivity(ConsumeActivity::class.java)
-    }
-
-    private var counter: ContinuePressTimer? = null
-
-    private fun resetCounter(timems: Long) {
-        counter?.cancel()
-        if (counter == null) {
-            counter = ContinuePressTimer(timems, 100)
-        }
-        keyActive = false
-        counter!!.start()
-    }
-
-    private inner class ContinuePressTimer internal constructor(millisInFuture: Long, countDownInterval: Long) :
-        CountDownTimer(millisInFuture, countDownInterval) {
-
-        override fun onTick(millisUntilFinished: Long) {
-
-        }
-
-        override fun onFinish() {
-            keyActive = true
-        }
-    }
+package com.supwisdom.activities.checkShoppwd
+
+import android.content.Intent
+import android.os.Bundle
+import android.os.CountDownTimer
+import android.view.KeyEvent
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.consume.ConsumeActivity
+import com.supwisdom.activities.consume.bean.CardUserInfoBean
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.SoundUtil
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/26
+ ** @desc
+ **/
+class CheckShoppwdActivity : BaseActivity() {
+    private var tmpPwd: String = ""
+    private lateinit var vTitle: TextView
+    private lateinit var vContent: TextView
+    private var keyActive = true
+    private var transdtlType: String? = null
+    private val pos = SPApplication.getInstance().getPos()
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        this.setContentView(R.layout.activity_check_mngpwd)
+        initView()
+    }
+
+    private fun initView() {
+        vTitle = findViewById<TextView>(R.id.title)
+        vContent = findViewById<TextView>(R.id.content)
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            if (!keyActive) {
+                return super.dispatchKeyEvent(event)
+            }
+            resetCounter(200)
+
+            when (event.keyCode) {
+                KeyEvent.KEYCODE_0,
+                KeyEvent.KEYCODE_1,
+                KeyEvent.KEYCODE_2,
+                KeyEvent.KEYCODE_3,
+                KeyEvent.KEYCODE_4,
+                KeyEvent.KEYCODE_5,
+                KeyEvent.KEYCODE_6,
+                KeyEvent.KEYCODE_7,
+                KeyEvent.KEYCODE_8,
+                KeyEvent.KEYCODE_9 -> {
+                    tmpPwd += event.keyCode - KeyEvent.KEYCODE_0
+                    if (tmpPwd.length >= 6) {
+                        if (checkMngPwd(tmpPwd)) {
+                            doReverse()
+                        } else {
+                            AuxScreenController.getInstance()
+                                .refreshContent(Arrays.asList<String>("商户密码:", "密码错误"))
+                        }
+                        tmpPwd = ""
+                    } else {
+                        AuxScreenController.getInstance()
+                            .refreshContent(
+                                Arrays.asList(
+                                    "商户密码:",
+                                    CommonUtil.getPasswordStar(tmpPwd.length)
+                                )
+                            )
+                    }
+                }
+                KeyEvent.KEYCODE_DEL -> {
+                    //cancel
+                    val len = tmpPwd.length
+                    when {
+                        len == 1 -> {
+                            tmpPwd = ""
+                            AuxScreenController.getInstance()
+                                .refreshContent(
+                                    Arrays.asList(
+                                        "商户密码:",
+                                        CommonUtil.getPasswordStar(tmpPwd.length)
+                                    )
+                                )
+                        }
+                        len > 1 -> {
+                            tmpPwd = tmpPwd.substring(0, len - 1)
+                            AuxScreenController.getInstance()
+                                .refreshContent(
+                                    Arrays.asList(
+                                        "商户密码:",
+                                        CommonUtil.getPasswordStar(tmpPwd.length)
+                                    )
+                                )
+                        }
+                        else -> finish()
+                    }
+                }
+            }
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        keyActive = true
+        transdtlType = this.intent.getStringExtra("transdtlType")
+        refresh()
+    }
+
+    override fun onNewIntent(intent: Intent) {
+        super.onNewIntent(intent)
+        this.intent.putExtra("transdtlType", intent.getStringExtra("transdtlType"))
+    }
+
+    private fun refresh() {
+        tmpPwd = ""
+        vTitle.text = "手工冲正"
+        vContent.text = ""
+        AuxScreenController.getInstance().refreshTitle("商户密码验证")
+        AuxScreenController.getInstance().refreshBottom("取消键撤销输入")
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("商户密码:", " "))
+    }
+
+    private fun checkMngPwd(inputPwd: String): Boolean {
+        return inputPwd == pos.getConfigPara()!!.shopPwd
+    }
+
+    private fun doReverse() {
+
+    }
+
+    private fun showRvsSuc(info: CardUserInfoBean) {
+        val tmp = String.format("金额: %.02f元", info.payamt / 100.0f)
+        vContent.text = "冲正成功\n$tmp"
+        SoundUtil.playMusic(applicationContext, R.raw.reversal_suc)
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("冲正成功", tmp))
+        jumpActivity(ConsumeActivity::class.java)
+    }
+
+    private fun showRvsFail(errmsg: String) {
+        vContent.text = "冲正失败\n$errmsg"
+        SoundUtil.playMusic(applicationContext, R.raw.reversal_fail)
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("冲正失败", errmsg))
+        jumpActivity(ConsumeActivity::class.java)
+    }
+
+    private var counter: ContinuePressTimer? = null
+
+    private fun resetCounter(timems: Long) {
+        counter?.cancel()
+        if (counter == null) {
+            counter = ContinuePressTimer(timems, 100)
+        }
+        keyActive = false
+        counter!!.start()
+    }
+
+    private inner class ContinuePressTimer internal constructor(
+        millisInFuture: Long,
+        countDownInterval: Long
+    ) :
+        CountDownTimer(millisInFuture, countDownInterval) {
+
+        override fun onTick(millisUntilFinished: Long) {
+
+        }
+
+        override fun onFinish() {
+            keyActive = true
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/communicate/CommunicateActivity.kt b/app/src/main/java/com/supwisdom/activities/communicate/CommunicateActivity.kt
index a591170..81af282 100644
--- a/app/src/main/java/com/supwisdom/activities/communicate/CommunicateActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/communicate/CommunicateActivity.kt
@@ -1,117 +1,117 @@
-package com.supwisdom.activities.communicate
-
-import android.os.Bundle
-import android.text.TextUtils
-import android.view.KeyEvent
-import android.view.View
-import android.widget.EditText
-import android.widget.TextView
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.utils.CommonUtil
-import com.supwisdom.utils.PublicDef
-import com.supwisdom.view.SWToast
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc 通讯参数配置
- **/
-class CommunicateActivity : BaseActivity() {
-    private val pos = SPApplication.getInstance().getPos()
-    private lateinit var vTenantid: TextView
-    private lateinit var vDevphyid: TextView
-    private lateinit var vEpayUrl: EditText
-    private lateinit var vEpayUri: EditText
-    private lateinit var vEpayPort: EditText
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_communicate)
-        initView()
-        initData()
-    }
-
-    private fun initView() {
-        vTenantid = findViewById<View>(R.id.comm_tenantid) as TextView
-        vDevphyid = findViewById<View>(R.id.comm_devphyid) as TextView
-        vEpayUrl = findViewById<View>(R.id.comm_epay_url) as EditText
-        vEpayUri = findViewById<View>(R.id.comm_epay_uri) as EditText
-        vEpayPort = findViewById<View>(R.id.comm_epay_port) as EditText
-
-        this.findViewById<View>(R.id.btn_cancel).setOnClickListener { finish() }
-        this.findViewById<View>(R.id.btn_confirm).setOnClickListener(View.OnClickListener {
-            val record = pos.getConfigPara()
-            val url = CommonUtil.getEditView(vEpayUrl)
-            if (TextUtils.isEmpty(url)) {
-                showSWToastInfo("服务器地址不能为空", PublicDef.TOAST_SHOW_CRY)
-                return@OnClickListener
-            }
-            record!!.epayIP = url
-
-            val uri = CommonUtil.getEditView(vEpayUri)
-            if (TextUtils.isEmpty(uri)) {
-                showSWToastInfo("服务器标识不对", PublicDef.TOAST_SHOW_CRY)
-                return@OnClickListener
-            }
-            record.epayUri = uri
-
-            try {
-                val port = Integer.valueOf(CommonUtil.getEditView(vEpayPort))
-                if (port > 0xFFFF) {
-                    showSWToastInfo("服务器端口太大", PublicDef.TOAST_SHOW_CRY)
-                    return@OnClickListener
-                }
-                record.epayPort = port
-            } catch (e: Exception) {
-                showSWToastInfo("服务器端口不对", PublicDef.TOAST_SHOW_CRY)
-                return@OnClickListener
-            }
-
-            if (!pos.replaceConfigPara(record)) {
-                showSWToastInfo("保存失败", PublicDef.TOAST_SHOW_CRY)
-                return@OnClickListener
-            }
-            showSWToastInfo("保存成功", PublicDef.TOAST_SHOW_SMILE)
-            finish()
-        })
-    }
-
-    public override fun onResume() {
-        super.onResume()
-        refresh()
-    }
-
-    private fun initData() {
-        val record = pos.getConfigPara()
-        vTenantid.text = record!!.tenantId
-        vDevphyid.text = record.devphyid
-        vEpayUrl.setText(record.epayIP)
-        vEpayUri.setText(record.epayUri)
-        vEpayPort.setText(record.epayPort.toString())
-    }
-
-    private fun refresh() {
-        AuxScreenController.getInstance().refreshTitle("通讯参数设置")
-        AuxScreenController.getInstance().refreshBottom("确定键返回上页")
-        AuxScreenController.getInstance().refreshContent(listOf<String>("请到大屏进行配置"))
-    }
-
-    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
-        if (event.action == KeyEvent.ACTION_DOWN) {
-            when (event.keyCode) {
-                KeyEvent.KEYCODE_DEL -> {
-                }
-                KeyEvent.KEYCODE_ENTER -> finish()
-            }//cancel
-            //和触屏删除键冲突
-            //                    finish();
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
-    private fun showSWToastInfo(msg: String, showway: Int) {
-        SWToast.show(applicationContext, msg, showway)
-    }
+package com.supwisdom.activities.communicate
+
+import android.os.Bundle
+import android.text.TextUtils
+import android.view.KeyEvent
+import android.view.View
+import android.widget.EditText
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.PublicDef
+import com.supwisdom.view.SWToast
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc 通讯参数配置
+ **/
+class CommunicateActivity : BaseActivity() {
+    private val pos = SPApplication.getInstance().getPos()
+    private lateinit var vTenantid: TextView
+    private lateinit var vDevphyid: TextView
+    private lateinit var vEpayUrl: EditText
+    private lateinit var vEpayUri: EditText
+    private lateinit var vEpayPort: EditText
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_communicate)
+        initView()
+        initData()
+    }
+
+    private fun initView() {
+        vTenantid = findViewById<View>(R.id.comm_tenantid) as TextView
+        vDevphyid = findViewById<View>(R.id.comm_devphyid) as TextView
+        vEpayUrl = findViewById<View>(R.id.comm_epay_url) as EditText
+        vEpayUri = findViewById<View>(R.id.comm_epay_uri) as EditText
+        vEpayPort = findViewById<View>(R.id.comm_epay_port) as EditText
+
+        this.findViewById<View>(R.id.btn_cancel).setOnClickListener { finish() }
+        this.findViewById<View>(R.id.btn_confirm).setOnClickListener(View.OnClickListener {
+            val record = pos.getConfigPara()
+            val url = CommonUtil.getEditView(vEpayUrl)
+            if (TextUtils.isEmpty(url)) {
+                showSWToastInfo("服务器地址不能为空", PublicDef.TOAST_SHOW_CRY)
+                return@OnClickListener
+            }
+            record!!.epayIP = url
+
+            val uri = CommonUtil.getEditView(vEpayUri)
+            if (TextUtils.isEmpty(uri)) {
+                showSWToastInfo("服务器标识不对", PublicDef.TOAST_SHOW_CRY)
+                return@OnClickListener
+            }
+            record.epayUri = uri
+
+            try {
+                val port = Integer.valueOf(CommonUtil.getEditView(vEpayPort))
+                if (port > 0xFFFF) {
+                    showSWToastInfo("服务器端口太大", PublicDef.TOAST_SHOW_CRY)
+                    return@OnClickListener
+                }
+                record.epayPort = port
+            } catch (e: Exception) {
+                showSWToastInfo("服务器端口不对", PublicDef.TOAST_SHOW_CRY)
+                return@OnClickListener
+            }
+
+            if (!pos.replaceConfigPara(record)) {
+                showSWToastInfo("保存失败", PublicDef.TOAST_SHOW_CRY)
+                return@OnClickListener
+            }
+            showSWToastInfo("保存成功", PublicDef.TOAST_SHOW_SMILE)
+            finish()
+        })
+    }
+
+    public override fun onResume() {
+        super.onResume()
+        refresh()
+    }
+
+    private fun initData() {
+        val record = pos.getConfigPara()
+        vTenantid.text = record!!.tenantId
+        vDevphyid.text = record.devphyid
+        vEpayUrl.setText(record.epayIP)
+        vEpayUri.setText(record.epayUri)
+        vEpayPort.setText(record.epayPort.toString())
+    }
+
+    private fun refresh() {
+        AuxScreenController.getInstance().refreshTitle("通讯参数设置")
+        AuxScreenController.getInstance().refreshBottom("确定键返回上页")
+        AuxScreenController.getInstance().refreshContent(listOf<String>("请到大屏进行配置"))
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            when (event.keyCode) {
+                KeyEvent.KEYCODE_DEL -> {
+                }
+                KeyEvent.KEYCODE_ENTER -> finish()
+            }//cancel
+            //和触屏删除键冲突
+            //                    finish();
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    private fun showSWToastInfo(msg: String, showway: Int) {
+        SWToast.show(applicationContext, msg, showway)
+    }
 }
\ No newline at end of file
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 5ae2b1a..39de86e 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/ConsumeActivity.kt
@@ -1,765 +1,785 @@
-package com.supwisdom.activities.consume
-
-import android.annotation.SuppressLint
-import android.app.Activity
-import android.content.Intent
-import android.graphics.Color
-import android.os.Bundle
-import android.os.CountDownTimer
-import android.view.KeyEvent
-import android.view.View
-import android.widget.ImageView
-import android.widget.LinearLayout
-import android.widget.TextView
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.consume.bean.CardStatus
-import com.supwisdom.activities.consume.bean.CardUserInfoBean
-import com.supwisdom.activities.menu.MenuActivity
-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
-import com.supwisdom.utils.DateUtil
-import com.supwisdom.utils.PublicDef
-import com.supwisdom.utils.SoundUtil
-import com.supwisdom.view.DialogPurchase
-import java.util.*
-import java.util.concurrent.locks.ReentrantLock
-import kotlin.collections.ArrayList
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-@Suppress("DEPRECATION")
-@SuppressLint("NewApi")
-class ConsumeActivity : BaseActivity(), IConsumeView {
-    private lateinit var amountTxt: TextView
-    private lateinit var presenter: ConsumePresenter
-    private lateinit var vLinkstat: TextView
-    private lateinit var vShopname: TextView
-    private lateinit var vCitizenName: TextView
-    private lateinit var vCitizenCardno: TextView
-    private lateinit var vCardstatus: TextView
-    private lateinit var vTime: TextView
-    private lateinit var vLinkLogo: ImageView
-    private lateinit var vLastResult: TextView
-    private lateinit var vLastPayamt: TextView
-    private lateinit var vLastCardno: TextView
-    private lateinit var vLastPayway: TextView
-    private lateinit var vLastPaytime: TextView
-    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 cardPaying = false
-    @Volatile
-    private var payStatusEnable = false
-    @Volatile
-    private var isBackRunning = false
-    private var addAmount: Int = 0
-    @Volatile
-    private var amount: Int = 0
-    private var payMode: PayMode? = null
-    private val hotkeyPayMap = hashMapOf<Int, Int>()
-    private val hotkeyPayList = ArrayList<String>()
-    private var payWay: String? = null
-    private var counter: LastPayShowTimer? = null
-    private var lastPayInfo: CardUserInfoBean? = null
-    private var dialogPurchase: DialogPurchase? = null
-    private var periodFixPayList: List<PeriodFixPayRecord>? = null
-    private var periodFixPayEnable = false
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_consume)
-
-        initView()
-        initData()
-    }
-
-    private fun initData() {
-        presenter = ConsumePresenter(this)
-        presenter.start()
-        beepManager = BeepManager(this)
-        dialogPurchase = DialogPurchase(this, object : DialogPurchase.ICallBack {
-            override fun callback(isManualCancel: Boolean, isPaying: Boolean) {
-                if (isPaying) {
-                    presenter.clickToInterrupt()
-                } else {
-                    when (payMode) {
-                        PayMode.FIXPAY -> checkAmtToPay(amount)
-                        PayMode.HOTKEY -> {
-                            AuxScreenController.getInstance().refreshContent(hotkeyPayList)
-                        }
-                        else -> {
-                            presenter.clickNoPay()
-                            amountTxt.text = ""
-                            AuxScreenController.getInstance()
-                                .refreshContent(Arrays.asList(" 欢迎光临!", " 请刷卡..."))
-                        }
-                    }
-                }
-            }
-
-            override fun callback(code: String) {
-                if (!scanLock.tryLock()) {
-                    return
-                }
-                try {
-                    //正在扣款
-                    if (someWayPaying()) {
-                        return
-                    }
-                    //已扣款
-                    if (!payStatusEnable) {
-                        return
-                    }
-                    beepManager!!.playBeepSoundAndVibrate()
-                    presenter.clickNoPay()
-                    dialogPurchase!!.codePaying = true
-                    dialogPurchase!!.codePayingNoCancelEnable = true
-                    payStatusEnable = false
-                    presenter.codeToPay(code, amount)
-                } finally {
-                    scanLock.unlock()
-                }
-            }
-        })
-        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)
-        vLinkstat = this.findViewById<TextView>(R.id.tv_linkstat)
-        amountTxt = this.findViewById<TextView>(R.id.tv_input_amt)
-        vCitizenName = this.findViewById<TextView>(R.id.tv_citizen_name)
-        vCitizenCardno = this.findViewById<TextView>(R.id.tv_citizen_cardno)
-        vCardstatus = this.findViewById<TextView>(R.id.tv_cardstatus)
-        vTime = this.findViewById<TextView>(R.id.tv_nowtime)
-        vLastResult = this.findViewById<TextView>(R.id.tv_last_pay_result)
-        vLastCardno = this.findViewById<TextView>(R.id.tv_last_cardno)
-        vLastPayamt = this.findViewById<TextView>(R.id.tv_last_payamt)
-        vLastPayway = this.findViewById<TextView>(R.id.tv_last_payway)
-        vLastPaytime = this.findViewById<TextView>(R.id.tv_last_paytime)
-        vLastPayFailreason = this.findViewById<TextView>(R.id.tv_last_failreason)
-        vLastPayFailll = this.findViewById<LinearLayout>(R.id.ll_consume_last_failreason)
-        vLastPayamtll = this.findViewById<LinearLayout>(R.id.ll_consume_last_payamt)
-    }
-
-    override fun onStop() {
-        super.onStop()
-        isBackRunning = true
-    }
-
-    override fun onDestroy() {
-        SoundUtil.releaseMusic()
-        presenter.stop()
-        beepManager!!.close()
-        super.onDestroy()
-    }
-
-    @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)
-                else -> normalInputPay(event.keyCode)
-            }
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
-    private fun fixInputPay(keyCode: Int) {
-        when (keyCode) {
-            KeyEvent.KEYCODE_DPAD_LEFT -> {
-                //'F1'
-                isBackRunning = true
-                jumpActivity(MenuActivity::class.java)
-            }
-            KeyEvent.KEYCODE_DPAD_RIGHT -> {
-                //'F4'
-                jumpActivity(TransdtlActivity::class.java)
-            }
-        }
-    }
-
-    private fun hotkeyInputPay(keyCode: Int) {
-        when (keyCode) {
-            KeyEvent.KEYCODE_0,
-            KeyEvent.KEYCODE_1,
-            KeyEvent.KEYCODE_2,
-            KeyEvent.KEYCODE_3,
-            KeyEvent.KEYCODE_4,
-            KeyEvent.KEYCODE_5,
-            KeyEvent.KEYCODE_6,
-            KeyEvent.KEYCODE_7,
-            KeyEvent.KEYCODE_8,
-            KeyEvent.KEYCODE_9 -> {
-                val key = keyCode - KeyEvent.KEYCODE_0
-                if (hotkeyPayMap.containsKey(key)) {
-                    amount = hotkeyPayMap[key]!!
-                    checkAmtToPay(amount)
-                }
-            }
-            KeyEvent.KEYCODE_DEL -> {
-                //cancel
-                presenter.clickNoPay()
-                AuxScreenController.getInstance().refreshContent(hotkeyPayList)
-            }
-            KeyEvent.KEYCODE_DPAD_LEFT -> {
-                //'F1'
-                isBackRunning = true
-                jumpActivity(MenuActivity::class.java)
-            }
-            KeyEvent.KEYCODE_DPAD_RIGHT -> {
-                //'F4'
-                jumpActivity(TransdtlActivity::class.java)
-            }
-        }
-    }
-
-    private fun normalInputPay(keyCode: Int) {
-        when (keyCode) {
-            KeyEvent.KEYCODE_BACK -> {
-                amountTxt.text = "0"
-                presenter.clickNoPay()
-            }
-            KeyEvent.KEYCODE_0,
-            KeyEvent.KEYCODE_1,
-            KeyEvent.KEYCODE_2,
-            KeyEvent.KEYCODE_3,
-            KeyEvent.KEYCODE_4,
-            KeyEvent.KEYCODE_5,
-            KeyEvent.KEYCODE_6,
-            KeyEvent.KEYCODE_7,
-            KeyEvent.KEYCODE_8,
-            KeyEvent.KEYCODE_9 -> {
-                presenter.clickNoPay()
-                addValueToEdit(keyCode - KeyEvent.KEYCODE_0)
-            }
-            KeyEvent.KEYCODE_POUND, KeyEvent.KEYCODE_PERIOD -> {
-                presenter.clickNoPay()
-                val str = amountTxt.text.toString()
-                if (str.length < 8 && str.indexOf('.') < 0) {
-                    amountTxt.text = "$str."
-                    showScreenAmount()
-                }
-            }
-            KeyEvent.KEYCODE_NUMPAD_ADD -> {
-                //'+'
-                addAmount += getCurAmount()
-                amountTxt.text = ""
-                showScreenAmount()
-            }
-            KeyEvent.KEYCODE_DPAD_LEFT -> {
-                //'F1'
-                isBackRunning = true
-                jumpActivity(MenuActivity::class.java)
-            }
-//                KeyEvent.KEYCODE_DPAD_UP ->
-            //'F2'
-//                KeyEvent.KEYCODE_DPAD_DOWN ->
-            //'F3'
-            KeyEvent.KEYCODE_DPAD_RIGHT -> {
-                //'F4'
-                jumpActivity(TransdtlActivity::class.java)
-            }
-            KeyEvent.KEYCODE_DEL -> {
-                //cancel
-                presenter.clickNoPay()
-                delValueToEdit()
-            }
-            KeyEvent.KEYCODE_ENTER -> {
-                amount = getCurAmount() + addAmount
-                if (amount > 0) {
-                    checkAmtToPay(amount)
-                } else {
-                    AuxScreenController.getInstance()
-                        .refreshContent(Arrays.asList("请先输入金额:", "金额不能为0"))
-                }
-            }
-        }
-    }
-
-    override fun showUserInfo(info: CardUserInfoBean) {
-        CommonUtil.acquireWakeLock(this)
-        vCitizenName.text = info.username
-        vCitizenCardno.text = info.cardno
-        vCardstatus.text = info.cardstatus?.toString()
-        if (info.cardstatus != CardStatus.NORMAL) {
-            vCardstatus.setTextColor(Color.RED)
-        } else {
-            vCardstatus.setTextColor(resources.getColor(R.color.blue))
-        }
-    }
-
-    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) {
-        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()
-        }
-    }
-
-    override fun onResume() {
-        super.onResume()
-        isBackRunning = false
-        beepManager!!.updatePrefs()
-        dealIntent()
-        refresh()
-        refreshRecentDtl(lastPayInfo)
-    }
-
-    private fun dealIntent() {
-        amount = this.intent.getStringExtra("amount")?.toInt() ?: 0
-        payWay = this.intent.getStringExtra("payway")
-        val operation = this.intent.getStringExtra("operation")
-        if (operation == "reverse") {
-            presenter.clickToReverse(amount)
-            dialogPurchase!!.show("等待冲正", CommonUtil.showFormatAmount("金额", amount))
-        }
-        this.intent.putExtra("amount", "0")
-        this.intent.putExtra("payway", "")
-        this.intent.putExtra("operation", "")
-    }
-
-    override fun onNewIntent(intent: Intent) {
-        this.intent.putExtra("amount", intent.getStringExtra("amount"))
-        this.intent.putExtra("payway", intent.getStringExtra("payway"))
-        this.intent.putExtra("operation", intent.getStringExtra("operation"))
-    }
-
-    private fun refresh() {
-        addAmount = 0
-        amountTxt.text = "0"
-        var shopname = pos.getDynamicPara()!!.shopname
-        if (shopname == null || shopname.length < 9) {
-            vShopname.textSize = resources.getDimension(R.dimen.consume_shopname_text_size_normal)
-        } else {
-            vShopname.textSize = resources.getDimension(R.dimen.consume_shopname_text_size_middle)
-            if (shopname.length > 10) {
-                val len = shopname.length / 2
-                shopname = shopname.substring(0, len) + "\n" + shopname.substring(len)
-            }
-        }
-        vShopname.text = shopname
-
-        refreshLinkStatus(SPApplication.getInstance().isOnline())
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime().substring(0, 16))
-        AuxScreenController.getInstance().refreshContent(Arrays.asList(" 欢迎光临!", " 请刷卡..."))
-
-        periodFixPayEnable = false
-        dialogPurchase?.dismiss()
-        pos.getControlPara(PublicDef.CONTROL_FIXAMT)?.also { mode ->
-            when (mode.paraval) {
-                PayMode.HOTKEY.desc -> {
-                    presenter.setFixMode(false)
-                    payMode = PayMode.HOTKEY
-                    hotkeyPayMap.clear()
-                    hotkeyPayList.clear()
-                    pos.getHotkeyPay()?.forEach {
-                        hotkeyPayMap[it.key] = it.amount
-                        hotkeyPayList.add(
-                            String.format(
-                                "按键%d - %.02f元",
-                                it.key,
-                                it.amount / 100.0f
-                            )
-                        )
-                    }
-                    AuxScreenController.getInstance().refreshContent(hotkeyPayList)
-                }
-                PayMode.PERIODFIX.desc -> {
-                    periodFixPayEnable = true
-                    periodFixPayList = pos.getPeriodFixPay()
-                    parsePeriodFixPay()
-                }
-                PayMode.NORMAL.desc -> {
-                    doNormalPay()
-                }
-                else -> {
-                    try {
-                        doFixPay(Integer.parseInt(mode.paraval))
-                    } catch (ex: Exception) {
-                        ex.printStackTrace()
-                    }
-                }
-            }
-        }
-    }
-
-    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))
-            vLinkstat.text = "联机"
-            vLinkstat.setTextColor(resources.getColor(R.color.blue))
-            AuxScreenController.getInstance().refreshTitle("联机         F4查看上笔记录")
-        } else {
-            vLinkLogo.setImageDrawable(getDrawable(R.drawable.wireless_off))
-            vLinkstat.text = "脱机"
-            vLinkstat.setTextColor(Color.RED)
-            AuxScreenController.getInstance().refreshTitle("脱机         F4查看上笔记录")
-        }
-    }
-
-    override fun showConsumeSuc(info: CardUserInfoBean) {
-        dialogPurchase!!.showPaySuccess(info)
-        val auxList = ArrayList<String>()
-        auxList.add(info.retmsg!!)
-        auxList.add(CommonUtil.showFormatAmount("金额", info.payamt))
-        when {
-            info.amount > info.payamt -> {
-                auxList.add(CommonUtil.showFormatAmount("折扣", info.amount - info.payamt))
-            }
-            info.amount < info.payamt -> {
-                auxList.add(CommonUtil.showFormatAmount("搭伙", info.payamt - info.amount))
-            }
-        }
-        if (info.balance != null) {
-            auxList.add(CommonUtil.showFormatAmount("余额", info.balance!!))
-        }
-        AuxScreenController.getInstance().refreshContent(auxList)
-        SoundUtil.playMusic(applicationContext, R.raw.consume_suc)
-        refreshRecentDtl(info)
-    }
-
-    override fun showConsumeHint(hint: String) {
-        val amountStr = CommonUtil.showFormatAmount("金额", amount)
-        dialogPurchase!!.showProcess(hint, amountStr)
-        AuxScreenController.getInstance().refreshContent(Arrays.asList(hint, amountStr))
-    }
-
-    override fun showConsumeQuery(hint: String) {
-        dialogPurchase!!.showQueryProcess(hint, "请耐心等待")
-        AuxScreenController.getInstance().refreshContent(Arrays.asList(hint, "请耐心等待"))
-    }
-
-    override fun showConsumeInterrupt(info: CardUserInfoBean) {
-        showPayInterrupt(info.cardno)
-        dialogPurchase!!.showPayInterrupt()
-        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("交易取消", "以银行交易为准"))
-        SoundUtil.playMusic(applicationContext, R.raw.pay_cancel)
-    }
-
-    override fun showConsumeFail(info: CardUserInfoBean) {
-        dialogPurchase!!.showPayFail(info)
-        AuxScreenController.getInstance()
-            .refreshContent(Arrays.asList<String>("消费失败", "原因:", info.retmsg))
-        SoundUtil.playMusic(applicationContext, R.raw.consume_fail)
-        refreshRecentDtl(info)
-    }
-
-    override fun showReverseSuc(info: CardUserInfoBean) {
-        dialogPurchase!!.showReverseSuccess(info)
-        AuxScreenController.getInstance()
-            .refreshContent(
-                Arrays.asList<String>(
-                    info.retmsg,
-                    CommonUtil.showFormatAmount("金额", info.payamt)
-                )
-            )
-        SoundUtil.playMusic(applicationContext, R.raw.reversal_suc)
-        refreshRecentDtl(info)
-    }
-
-    override fun showReverseFail(info: CardUserInfoBean) {
-        dialogPurchase!!.showReverseFail(info)
-        AuxScreenController.getInstance()
-            .refreshContent(Arrays.asList<String>("冲正失败", "原因:", info.retmsg))
-        SoundUtil.playMusic(applicationContext, R.raw.reversal_fail)
-        refreshRecentDtl(info)
-    }
-
-    private var lastShowRecentTime: String? = null
-    private fun refreshRecentDtl(info: CardUserInfoBean?) {
-        if (info != null) {
-            val showtime: Long = 30 * 1000
-            lastPayInfo = info
-            if (lastShowRecentTime == null) {
-                if (info.transtime != null) {
-                    val paytime = DateUtil.timeFormatConvertToLong(info.transtime!!)
-                    val nowtime = DateUtil.timeFormatConvertToLong(DateUtil.getNowTimeNoFormat())
-                    if (nowtime - paytime > showtime) {
-                        return
-                    }
-                }
-            }
-            //已显示过不在显示
-            if (lastShowRecentTime == info.transtime) {
-                return
-            }
-            lastShowRecentTime = info.transtime
-
-            if (info.status == PayStatus.SUC) {
-                when {
-                    info.reversalFlag == ReversalFlag.AUTO -> vLastResult.text = "自动冲正"
-                    info.reversalFlag == ReversalFlag.MANUAL -> vLastResult.text = "手动撤销"
-                    else -> vLastResult.text = "消费成功"
-                }
-                vLastPayFailll.visibility = View.GONE
-                vLastPayamtll.visibility = View.VISIBLE
-                vLastPayamt.text = String.format("%.02f元", info.payamt / 100.0f)
-            } else {
-                if (info.reversalFlag == ReversalFlag.AUTO ||
-                    info.reversalFlag == ReversalFlag.MANUAL
-                ) {
-                    vLastResult.text = "冲正失败"
-                } else {
-                    vLastResult.text = "消费失败"
-                }
-                vLastPayFailll.visibility = View.VISIBLE
-                vLastPayamtll.visibility = View.GONE
-                vLastPayFailreason.text = info.retmsg
-            }
-            vLastCardno.text = info.cardno
-            vLastPayway.text = if (info.payway == "code") {
-                "二维码"
-            } else {
-                "市民卡"
-            }
-            val sb = StringBuilder()
-            sb.append(info.transtime?.substring(0, 2)).append(":")
-                .append(info.transtime?.substring(2, 4)).append(":")
-                .append(info.transtime?.substring(4))
-            vLastPaytime.text = sb.toString()
-            resetPayShowCounter(showtime)
-        }
-    }
-
-    private fun showPayInterrupt(cardno: String?) {
-        vLastResult.text = "交易取消"
-        vLastPayFailll.visibility = View.VISIBLE
-        vLastPayamtll.visibility = View.GONE
-        vLastPayFailreason.text = "以银行交易为准"
-        vLastCardno.text = cardno
-        vLastPayway.text = "card"
-        vLastPaytime.text = DateUtil.getNowTime()
-        resetPayShowCounter(30 * 1000)
-    }
-
-    private fun delValueToEdit() {
-        presenter.clickNoPay()
-        val str = amountTxt.text.toString()
-        val len = str.length
-        when {
-            len == 0 ||
-                    len == 1 -> {
-                refresh()
-            }
-            len > 1 -> {
-                amountTxt.text = str.substring(0, len - 1)
-                showScreenAmount()
-            }
-        }
-    }
-
-    private fun checkAmtToPay(inputAmt: Int) {
-        amount = inputAmt
-        amountTxt.text = String.format("%.02f", inputAmt / 100.0f)
-        payStatusEnable = true
-        presenter.clickToPay(inputAmt)
-        when (payMode) {
-            PayMode.FIXPAY -> {
-                AuxScreenController.getInstance()
-                    .refreshContent(
-                        Arrays.asList(
-                            "定额付款",
-                            CommonUtil.showFormatAmount("金额", inputAmt)
-                        )
-                    )
-                showDialogPay(true)
-            }
-            PayMode.HOTKEY -> {
-                AuxScreenController.getInstance()
-                    .refreshContent(
-                        Arrays.asList(
-                            "热键付款",
-                            CommonUtil.showFormatAmount("金额", inputAmt)
-                        )
-                    )
-                showDialogPay(false)
-            }
-            else -> {
-                AuxScreenController.getInstance()
-                    .refreshContent(
-                        Arrays.asList(
-                            "等待付款",
-                            CommonUtil.showFormatAmount("金额", inputAmt)
-                        )
-                    )
-                showDialogPay(false)
-            }
-        }
-    }
-
-    private fun showDialogPay(isFixPay: Boolean) {
-        dialogPurchase!!.codePaying = false
-        dialogPurchase!!.isFixPay = isFixPay
-        dialogPurchase!!.codePayingNoCancelEnable = false
-        dialogPurchase!!.show("请刷卡", CommonUtil.showFormatAmount("金额", amount))
-    }
-
-    private fun getCurAmount(): Int {
-        return try {
-            CommonUtil.YuanToFen(java.lang.Double.parseDouble(amountTxt.text.toString().trim { it <= ' ' }))
-        } catch (ex: Exception) {
-            ex.printStackTrace()
-            0
-        }
-    }
-
-    private fun addValueToEdit(value: Int) {
-        var str = amountTxt.text.toString()
-        if ("0" == str) {
-            str = ""
-        }
-        //如果已经有小数点，则小数点后面不能超过两位
-        if (str.indexOf(".") > 0) {
-            if (str.length - str.indexOf(".") <= 2) {
-                amountTxt.text = "$str$value"
-            }
-        } else {
-            //限制消费金额<10000
-            if (str.length < 4) {
-                amountTxt.text = "$str$value"
-            }
-        }
-        showScreenAmount()
-    }
-
-    private fun clearLastPayResult() {
-        vLastResult.text = null
-        vLastCardno.text = null
-        vLastPayamt.text = null
-        vLastPayway.text = null
-        vLastPaytime.text = null
-        vLastPayFailreason.text = null
-    }
-
-    private fun showScreenAmount() {
-        if (addAmount > 0) {
-            AuxScreenController.getInstance().refreshContent(
-                Arrays.asList(
-                    "输入金额: +" + String.format("%.02f", addAmount / 100.0f),
-                    amountTxt.text.toString()
-                )
-            )
-        } else {
-            AuxScreenController.getInstance()
-                .refreshContent(Arrays.asList("输入金额:", amountTxt.text.toString()))
-        }
-    }
-
-    override fun getActivity(): Activity {
-        return this
-    }
-
-    override fun isBackRunning(): Boolean {
-        return isBackRunning
-    }
-
-    override fun showRecentDtl(record: TransdtlUnionRecord?) {
-        if (record != null) {
-            val info = CardUserInfoBean(PublicDef.SUCCESS, "")
-            info.transdate = record.transdate
-            info.transtime = record.transtime
-            info.username = record.username
-            info.cardno = record.cardno
-            info.payamt = record.payamt
-            info.status = record.status
-            info.payway = record.payway
-            info.reversalFlag = record.reversalflag
-            refreshRecentDtl(info)
-        }
-    }
-
-    override fun cardPayingStatus(isPaying: Boolean) {
-        cardPaying = isPaying
-    }
-
-    private fun resetPayShowCounter(timems: Long) {
-        counter?.cancel()
-        counter = LastPayShowTimer(timems, 500)
-        counter?.start()
-    }
-
-    private inner class LastPayShowTimer(millisInFuture: Long, countDownInterval: Long) :
-        CountDownTimer(millisInFuture, countDownInterval) {
-
-        override fun onTick(millisUntilFinished: Long) {
-
-        }
-
-        override fun onFinish() {
-            clearLastPayResult()
-        }
-    }
+package com.supwisdom.activities.consume
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.os.CountDownTimer
+import android.view.KeyEvent
+import android.view.View
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.consume.bean.CardStatus
+import com.supwisdom.activities.consume.bean.CardUserInfoBean
+import com.supwisdom.activities.menu.MenuActivity
+import com.supwisdom.activities.transdtl.TransdtlActivity
+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
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.PublicDef
+import com.supwisdom.utils.SoundUtil
+import com.supwisdom.view.DialogPurchase
+import java.util.*
+import java.util.concurrent.locks.ReentrantLock
+import kotlin.collections.ArrayList
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+@Suppress("DEPRECATION")
+@SuppressLint("NewApi")
+class ConsumeActivity : BaseActivity(), IConsumeView {
+    private lateinit var amountTxt: TextView
+    private lateinit var presenter: ConsumePresenter
+    private lateinit var vLinkstat: TextView
+    private lateinit var vShopname: TextView
+    private lateinit var vCitizenName: TextView
+    private lateinit var vCitizenCardno: TextView
+    private lateinit var vCardstatus: TextView
+    private lateinit var vTime: TextView
+    private lateinit var vLinkLogo: ImageView
+    private lateinit var vLastResult: TextView
+    private lateinit var vLastPayamt: TextView
+    private lateinit var vLastCardno: TextView
+    private lateinit var vLastPayway: TextView
+    private lateinit var vLastPaytime: TextView
+    private lateinit var vLastPayFailreason: TextView
+    private lateinit var vSynoFlag: 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 cardPaying = false
+
+    @Volatile
+    private var payStatusEnable = false
+
+    @Volatile
+    private var isBackRunning = false
+    private var addAmount: Int = 0
+
+    @Volatile
+    private var amount: Int = 0
+    private var payMode: PayMode? = null
+    private val hotkeyPayMap = hashMapOf<Int, Int>()
+    private val hotkeyPayList = ArrayList<String>()
+    private var payWay: String? = null
+    private var counter: LastPayShowTimer? = null
+    private var lastPayInfo: CardUserInfoBean? = null
+    private var dialogPurchase: DialogPurchase? = null
+    private var periodFixPayList: List<PeriodFixPayRecord>? = null
+    private var periodFixPayEnable = false
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_consume)
+
+        initView()
+        initData()
+    }
+
+    private fun initData() {
+        presenter = ConsumePresenter(this)
+        presenter.start()
+        beepManager = BeepManager(this)
+        dialogPurchase = DialogPurchase(this, object : DialogPurchase.ICallBack {
+            override fun callback(isManualCancel: Boolean, isPaying: Boolean) {
+                if (isPaying) {
+                    presenter.clickToInterrupt()
+                } else {
+                    when (payMode) {
+                        PayMode.FIXPAY -> checkAmtToPay(amount)
+                        PayMode.HOTKEY -> {
+                            AuxScreenController.getInstance().refreshContent(hotkeyPayList)
+                        }
+                        else -> {
+                            presenter.clickNoPay()
+                            amountTxt.text = ""
+                            AuxScreenController.getInstance()
+                                .refreshContent(Arrays.asList(" 欢迎光临!", " 请刷卡..."))
+                        }
+                    }
+                }
+            }
+
+            override fun callback(code: String) {
+                if (!scanLock.tryLock()) {
+                    return
+                }
+                try {
+                    //正在扣款
+                    if (someWayPaying()) {
+                        return
+                    }
+                    //已扣款
+                    if (!payStatusEnable) {
+                        return
+                    }
+                    beepManager!!.playBeepSoundAndVibrate()
+                    presenter.clickNoPay()
+                    dialogPurchase!!.codePaying = true
+                    dialogPurchase!!.codePayingNoCancelEnable = true
+                    payStatusEnable = false
+                    presenter.codeToPay(code, amount)
+                } finally {
+                    scanLock.unlock()
+                }
+            }
+        })
+        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)
+        vLinkstat = this.findViewById<TextView>(R.id.tv_linkstat)
+        amountTxt = this.findViewById<TextView>(R.id.tv_input_amt)
+        vCitizenName = this.findViewById<TextView>(R.id.tv_citizen_name)
+        vCitizenCardno = this.findViewById<TextView>(R.id.tv_citizen_cardno)
+        vCardstatus = this.findViewById<TextView>(R.id.tv_cardstatus)
+        vTime = this.findViewById<TextView>(R.id.tv_nowtime)
+        vLastResult = this.findViewById<TextView>(R.id.tv_last_pay_result)
+        vLastCardno = this.findViewById<TextView>(R.id.tv_last_cardno)
+        vLastPayamt = this.findViewById<TextView>(R.id.tv_last_payamt)
+        vLastPayway = this.findViewById<TextView>(R.id.tv_last_payway)
+        vLastPaytime = this.findViewById<TextView>(R.id.tv_last_paytime)
+        vLastPayFailreason = this.findViewById<TextView>(R.id.tv_last_failreason)
+        vLastPayFailll = this.findViewById<LinearLayout>(R.id.ll_consume_last_failreason)
+        vLastPayamtll = this.findViewById<LinearLayout>(R.id.ll_consume_last_payamt)
+        vSynoFlag = findViewById<TextView>(R.id.tv_syno_flag)
+    }
+
+    override fun onStop() {
+        super.onStop()
+    }
+
+    override fun onPause() {
+        super.onPause()
+        isBackRunning = true
+    }
+
+    override fun onDestroy() {
+        SoundUtil.releaseMusic()
+        presenter.stop()
+        beepManager!!.close()
+        super.onDestroy()
+    }
+
+    @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)
+                else -> normalInputPay(event.keyCode)
+            }
+        }
+        if (event.action == KeyEvent.ACTION_UP &&
+            event.keyCode == KeyEvent.KEYCODE_DPAD_LEFT
+        ) {
+            //'F1'
+            jumpActivity(MenuActivity::class.java)
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    private fun fixInputPay(keyCode: Int) {
+        when (keyCode) {
+            KeyEvent.KEYCODE_DPAD_LEFT -> {
+                //'F1'
+                jumpActivity(MenuActivity::class.java)
+            }
+            KeyEvent.KEYCODE_DPAD_RIGHT -> {
+                //'F4'
+                jumpActivity(TransdtlActivity::class.java)
+            }
+        }
+    }
+
+    private fun hotkeyInputPay(keyCode: Int) {
+        when (keyCode) {
+            KeyEvent.KEYCODE_0,
+            KeyEvent.KEYCODE_1,
+            KeyEvent.KEYCODE_2,
+            KeyEvent.KEYCODE_3,
+            KeyEvent.KEYCODE_4,
+            KeyEvent.KEYCODE_5,
+            KeyEvent.KEYCODE_6,
+            KeyEvent.KEYCODE_7,
+            KeyEvent.KEYCODE_8,
+            KeyEvent.KEYCODE_9 -> {
+                val key = keyCode - KeyEvent.KEYCODE_0
+                if (hotkeyPayMap.containsKey(key)) {
+                    amount = hotkeyPayMap[key]!!
+                    checkAmtToPay(amount)
+                }
+            }
+            KeyEvent.KEYCODE_DEL -> {
+                //cancel
+                presenter.clickNoPay()
+                AuxScreenController.getInstance().refreshContent(hotkeyPayList)
+            }
+            KeyEvent.KEYCODE_DPAD_LEFT -> {
+                //'F1'
+                jumpActivity(MenuActivity::class.java)
+            }
+            KeyEvent.KEYCODE_DPAD_RIGHT -> {
+                //'F4'
+                jumpActivity(TransdtlActivity::class.java)
+            }
+        }
+    }
+
+    private fun normalInputPay(keyCode: Int) {
+        when (keyCode) {
+            KeyEvent.KEYCODE_BACK -> {
+                amountTxt.text = "0"
+                presenter.clickNoPay()
+            }
+            KeyEvent.KEYCODE_0,
+            KeyEvent.KEYCODE_1,
+            KeyEvent.KEYCODE_2,
+            KeyEvent.KEYCODE_3,
+            KeyEvent.KEYCODE_4,
+            KeyEvent.KEYCODE_5,
+            KeyEvent.KEYCODE_6,
+            KeyEvent.KEYCODE_7,
+            KeyEvent.KEYCODE_8,
+            KeyEvent.KEYCODE_9 -> {
+                presenter.clickNoPay()
+                addValueToEdit(keyCode - KeyEvent.KEYCODE_0)
+            }
+            KeyEvent.KEYCODE_POUND, KeyEvent.KEYCODE_PERIOD -> {
+                presenter.clickNoPay()
+                val str = amountTxt.text.toString()
+                if (str.length < 8 && str.indexOf('.') < 0) {
+                    amountTxt.text = "$str."
+                    showScreenAmount()
+                }
+            }
+            KeyEvent.KEYCODE_NUMPAD_ADD -> {
+                //'+'
+                addAmount += getCurAmount()
+                amountTxt.text = ""
+                showScreenAmount()
+            }
+            KeyEvent.KEYCODE_DPAD_LEFT -> {
+                //'F1'
+                jumpActivity(MenuActivity::class.java)
+            }
+//                KeyEvent.KEYCODE_DPAD_UP ->
+            //'F2'
+//                KeyEvent.KEYCODE_DPAD_DOWN ->
+            //'F3'
+            KeyEvent.KEYCODE_DPAD_RIGHT -> {
+                //'F4'
+                jumpActivity(TransdtlActivity::class.java)
+            }
+            KeyEvent.KEYCODE_DEL -> {
+                //cancel
+                presenter.clickNoPay()
+                delValueToEdit()
+            }
+            KeyEvent.KEYCODE_ENTER -> {
+                amount = getCurAmount() + addAmount
+                if (amount > 0) {
+                    checkAmtToPay(amount)
+                } else {
+                    AuxScreenController.getInstance()
+                        .refreshContent(Arrays.asList("请先输入金额:", "金额不能为0"))
+                }
+            }
+        }
+    }
+
+    override fun showUserInfo(info: CardUserInfoBean) {
+        CommonUtil.acquireWakeLock(this)
+        vCitizenName.text = info.username
+        vCitizenCardno.text = info.cardno
+        vCardstatus.text = info.cardstatus?.toString()
+        if (info.cardstatus != CardStatus.NORMAL) {
+            vCardstatus.setTextColor(Color.RED)
+        } else {
+            vCardstatus.setTextColor(resources.getColor(R.color.blue))
+        }
+    }
+
+    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) {
+        vCitizenName.text = null
+        vCitizenCardno.text = null
+        vCardstatus.text = null
+        if (lastshowtime != datetime) {
+            lastshowtime = datetime
+            vTime.text = datetime
+            AuxScreenController.getInstance().refreshBottom(datetime)
+            if (periodFixPayEnable) {
+                parsePeriodFixPay()
+            }
+        }
+        if (dialogPurchase!!.isShowing &&
+            !dialogPurchase!!.isFixPay &&
+            payStatusEnable
+        ) {
+            beepManager!!.playBeepSoundAndVibrate()
+        }
+    }
+
+    override fun onResume() {
+        super.onResume()
+        isBackRunning = false
+        beepManager!!.updatePrefs()
+        dealIntent()
+        refresh()
+        refreshRecentDtl(lastPayInfo)
+    }
+
+    private fun dealIntent() {
+        amount = this.intent.getStringExtra("amount")?.toInt() ?: 0
+        payWay = this.intent.getStringExtra("payway")
+        val operation = this.intent.getStringExtra("operation")
+        if (operation == "reverse") {
+            presenter.clickToReverse(amount)
+            dialogPurchase!!.show("等待冲正", CommonUtil.showFormatAmount("金额", amount))
+        }
+        this.intent.putExtra("amount", "0")
+        this.intent.putExtra("payway", "")
+        this.intent.putExtra("operation", "")
+    }
+
+    override fun onNewIntent(intent: Intent) {
+        this.intent.putExtra("amount", intent.getStringExtra("amount"))
+        this.intent.putExtra("payway", intent.getStringExtra("payway"))
+        this.intent.putExtra("operation", intent.getStringExtra("operation"))
+    }
+
+    private fun refresh() {
+        addAmount = 0
+        amountTxt.text = "0"
+        var shopname = pos.getDynamicPara()!!.shopname
+        if (shopname == null || shopname.length < 9) {
+            vShopname.textSize = resources.getDimension(R.dimen.consume_shopname_text_size_normal)
+        } else {
+            vShopname.textSize = resources.getDimension(R.dimen.consume_shopname_text_size_middle)
+            if (shopname.length > 10) {
+                val len = shopname.length / 2
+                shopname = shopname.substring(0, len) + "\n" + shopname.substring(len)
+            }
+        }
+        vShopname.text = shopname
+        if (SPApplication.getInstance().isSynoCodeActive()) {
+            vSynoFlag.visibility = View.VISIBLE
+        } else {
+            vSynoFlag.visibility = View.GONE
+        }
+
+        refreshLinkStatus(SPApplication.getInstance().isOnline())
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
+        AuxScreenController.getInstance().refreshContent(Arrays.asList(" 欢迎光临!", " 请刷卡..."))
+
+        periodFixPayEnable = false
+        dialogPurchase?.dismiss()
+        pos.getControlPara(PublicDef.CONTROL_FIXAMT)?.also { mode ->
+            when (mode.paraval) {
+                PayMode.HOTKEY.desc -> {
+                    presenter.setFixMode(false)
+                    payMode = PayMode.HOTKEY
+                    hotkeyPayMap.clear()
+                    hotkeyPayList.clear()
+                    pos.getHotkeyPay()?.forEach {
+                        hotkeyPayMap[it.key] = it.amount
+                        hotkeyPayList.add(
+                            String.format(
+                                "按键%d - %.02f元",
+                                it.key,
+                                it.amount / 100.0f
+                            )
+                        )
+                    }
+                    AuxScreenController.getInstance().refreshContent(hotkeyPayList)
+                }
+                PayMode.PERIODFIX.desc -> {
+                    periodFixPayEnable = true
+                    periodFixPayList = pos.getPeriodFixPay()
+                    parsePeriodFixPay()
+                }
+                PayMode.NORMAL.desc -> {
+                    doNormalPay()
+                }
+                else -> {
+                    try {
+                        doFixPay(Integer.parseInt(mode.paraval))
+                    } catch (ex: Exception) {
+                        ex.printStackTrace()
+                    }
+                }
+            }
+        }
+    }
+
+    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))
+            vLinkstat.text = "联机"
+            vLinkstat.setTextColor(resources.getColor(R.color.blue))
+            AuxScreenController.getInstance().refreshTitle("联机         F4查看上笔记录")
+        } else {
+            vLinkLogo.setImageDrawable(getDrawable(R.drawable.wireless_off))
+            vLinkstat.text = "脱机"
+            vLinkstat.setTextColor(Color.RED)
+            AuxScreenController.getInstance().refreshTitle("脱机         F4查看上笔记录")
+        }
+    }
+
+    override fun showConsumeSuc(info: CardUserInfoBean) {
+        dialogPurchase!!.showPaySuccess(info)
+        val auxList = ArrayList<String>()
+        auxList.add(info.getErrorMsg())
+        auxList.add(CommonUtil.showFormatAmount("金额", info.payamt))
+        when {
+            info.amount > info.payamt -> {
+                auxList.add(CommonUtil.showFormatAmount("折扣", info.amount - info.payamt))
+            }
+            info.amount < info.payamt -> {
+                auxList.add(CommonUtil.showFormatAmount("搭伙", info.payamt - info.amount))
+            }
+        }
+        if (info.balance != null) {
+            auxList.add(CommonUtil.showFormatAmount("余额", info.balance!!))
+        }
+        AuxScreenController.getInstance().refreshContent(auxList)
+        SoundUtil.playMusic(applicationContext, R.raw.consume_suc)
+        refreshRecentDtl(info)
+    }
+
+    override fun showConsumeHint(hint: String) {
+        val amountStr = CommonUtil.showFormatAmount("金额", amount)
+        dialogPurchase!!.showProcess(hint, amountStr)
+        AuxScreenController.getInstance().refreshContent(Arrays.asList(hint, amountStr))
+    }
+
+    override fun showConsumeQuery(hint: String) {
+        dialogPurchase!!.showQueryProcess(hint, "请耐心等待")
+        AuxScreenController.getInstance().refreshContent(Arrays.asList(hint, "请耐心等待"))
+    }
+
+    override fun showConsumeInterrupt(info: CardUserInfoBean) {
+        showPayInterrupt(info.cardno)
+        dialogPurchase!!.showPayInterrupt()
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("交易取消", "以银行交易为准"))
+        SoundUtil.playMusic(applicationContext, R.raw.pay_cancel)
+    }
+
+    override fun showConsumeFail(info: CardUserInfoBean) {
+        dialogPurchase!!.showPayFail(info)
+        AuxScreenController.getInstance()
+            .refreshContent(Arrays.asList<String>("消费失败", "原因:", info.getErrorMsg()))
+        SoundUtil.playMusic(applicationContext, R.raw.consume_fail)
+        refreshRecentDtl(info)
+    }
+
+    override fun showReverseSuc(info: CardUserInfoBean) {
+        dialogPurchase!!.showReverseSuccess(info)
+        AuxScreenController.getInstance()
+            .refreshContent(
+                Arrays.asList<String>(
+                    info.getErrorMsg(),
+                    CommonUtil.showFormatAmount("金额", info.payamt)
+                )
+            )
+        SoundUtil.playMusic(applicationContext, R.raw.reversal_suc)
+        refreshRecentDtl(info)
+    }
+
+    override fun showReverseFail(info: CardUserInfoBean) {
+        dialogPurchase!!.showReverseFail(info)
+        AuxScreenController.getInstance()
+            .refreshContent(Arrays.asList<String>("冲正失败", "原因:", info.getErrorMsg()))
+        SoundUtil.playMusic(applicationContext, R.raw.reversal_fail)
+        refreshRecentDtl(info)
+    }
+
+    private var lastShowRecentTime: String? = null
+    private fun refreshRecentDtl(info: CardUserInfoBean?) {
+        if (info != null) {
+            val showtime: Long = 30 * 1000
+            lastPayInfo = info
+            if (lastShowRecentTime == null) {
+                if (info.transtime != null) {
+                    val paytime = DateUtil.timeFormatConvertToLong(info.transtime!!)
+                    val nowtime = DateUtil.timeFormatConvertToLong(DateUtil.getNowTimeNoFormat())
+                    if (nowtime - paytime > showtime) {
+                        return
+                    }
+                }
+            }
+            //已显示过不在显示
+            if (lastShowRecentTime == info.transtime) {
+                return
+            }
+            lastShowRecentTime = info.transtime
+
+            if (info.status == PayStatus.SUC) {
+                when {
+                    info.reversalFlag == ReversalFlag.AUTO -> vLastResult.text = "自动冲正"
+                    info.reversalFlag == ReversalFlag.MANUAL -> vLastResult.text = "手动撤销"
+                    else -> vLastResult.text = "消费成功"
+                }
+                vLastPayFailll.visibility = View.GONE
+                vLastPayamtll.visibility = View.VISIBLE
+                vLastPayamt.text = String.format("%.02f元", info.payamt / 100.0f)
+            } else {
+                if (info.reversalFlag == ReversalFlag.AUTO ||
+                    info.reversalFlag == ReversalFlag.MANUAL
+                ) {
+                    vLastResult.text = "冲正失败"
+                } else {
+                    vLastResult.text = "消费失败"
+                }
+                vLastPayFailll.visibility = View.VISIBLE
+                vLastPayamtll.visibility = View.GONE
+                vLastPayFailreason.text = info.getErrorMsg()
+            }
+            vLastCardno.text = info.cardno
+            vLastPayway.text = if (info.payway == "code") {
+                "二维码"
+            } else {
+                "市民卡"
+            }
+            val sb = StringBuilder()
+            sb.append(info.transtime?.substring(0, 2)).append(":")
+                .append(info.transtime?.substring(2, 4)).append(":")
+                .append(info.transtime?.substring(4))
+            vLastPaytime.text = sb.toString()
+            resetPayShowCounter(showtime)
+        }
+    }
+
+    private fun showPayInterrupt(cardno: String?) {
+        vLastResult.text = "交易取消"
+        vLastPayFailll.visibility = View.VISIBLE
+        vLastPayamtll.visibility = View.GONE
+        vLastPayFailreason.text = "以银行交易为准"
+        vLastCardno.text = cardno
+        vLastPayway.text = "card"
+        vLastPaytime.text = DateUtil.getNowTime()
+        resetPayShowCounter(30 * 1000)
+    }
+
+    private fun delValueToEdit() {
+        presenter.clickNoPay()
+        val str = amountTxt.text.toString()
+        val len = str.length
+        when {
+            len == 0 ||
+                    len == 1 -> {
+                refresh()
+            }
+            len > 1 -> {
+                amountTxt.text = str.substring(0, len - 1)
+                showScreenAmount()
+            }
+        }
+    }
+
+    private fun checkAmtToPay(inputAmt: Int) {
+        amount = inputAmt
+        amountTxt.text = String.format("%.02f", inputAmt / 100.0f)
+        payStatusEnable = true
+        presenter.clickToPay(inputAmt)
+        when (payMode) {
+            PayMode.FIXPAY -> {
+                AuxScreenController.getInstance()
+                    .refreshContent(
+                        Arrays.asList(
+                            "定额付款",
+                            CommonUtil.showFormatAmount("金额", inputAmt)
+                        )
+                    )
+                showDialogPay(true)
+            }
+            PayMode.HOTKEY -> {
+                AuxScreenController.getInstance()
+                    .refreshContent(
+                        Arrays.asList(
+                            "热键付款",
+                            CommonUtil.showFormatAmount("金额", inputAmt)
+                        )
+                    )
+                showDialogPay(false)
+            }
+            else -> {
+                AuxScreenController.getInstance()
+                    .refreshContent(
+                        Arrays.asList(
+                            "等待付款",
+                            CommonUtil.showFormatAmount("金额", inputAmt)
+                        )
+                    )
+                showDialogPay(false)
+            }
+        }
+    }
+
+    private fun showDialogPay(isFixPay: Boolean) {
+        dialogPurchase!!.codePaying = false
+        dialogPurchase!!.isFixPay = isFixPay
+        dialogPurchase!!.codePayingNoCancelEnable = false
+        dialogPurchase!!.show("请刷卡", CommonUtil.showFormatAmount("金额", amount))
+    }
+
+    private fun getCurAmount(): Int {
+        return try {
+            CommonUtil.YuanToFen(
+                java.lang.Double.parseDouble(
+                    amountTxt.text.toString().trim { it <= ' ' })
+            )
+        } catch (ex: Exception) {
+            ex.printStackTrace()
+            0
+        }
+    }
+
+    private fun addValueToEdit(value: Int) {
+        var str = amountTxt.text.toString()
+        if ("0" == str) {
+            str = ""
+        }
+        //如果已经有小数点，则小数点后面不能超过两位
+        if (str.indexOf(".") > 0) {
+            if (str.length - str.indexOf(".") <= 2) {
+                amountTxt.text = "$str$value"
+            }
+        } else {
+            //限制消费金额<10000
+            if (str.length < 4) {
+                amountTxt.text = "$str$value"
+            }
+        }
+        showScreenAmount()
+    }
+
+    private fun clearLastPayResult() {
+        vLastResult.text = null
+        vLastCardno.text = null
+        vLastPayamt.text = null
+        vLastPayway.text = null
+        vLastPaytime.text = null
+        vLastPayFailreason.text = null
+    }
+
+    private fun showScreenAmount() {
+        if (addAmount > 0) {
+            AuxScreenController.getInstance().refreshContent(
+                Arrays.asList(
+                    "输入金额: +" + String.format("%.02f", addAmount / 100.0f),
+                    amountTxt.text.toString()
+                )
+            )
+        } else {
+            AuxScreenController.getInstance()
+                .refreshContent(Arrays.asList("输入金额:", amountTxt.text.toString()))
+        }
+    }
+
+    override fun getActivity(): Activity {
+        return this
+    }
+
+    override fun isBackRunning(): Boolean {
+        return isBackRunning
+    }
+
+    override fun showRecentDtl(record: TransdtlUnionRecord?) {
+        if (record != null) {
+            val info = CardUserInfoBean(PublicDef.SUCCESS, "")
+            info.transdate = record.transdate
+            info.transtime = record.transtime
+            info.username = record.username
+            info.cardno = record.cardno
+            info.payamt = record.payamt
+            info.status = record.status
+            info.payway = record.payway
+            info.reversalFlag = record.reversalflag
+            refreshRecentDtl(info)
+        }
+    }
+
+    override fun cardPayingStatus(isPaying: Boolean) {
+        cardPaying = isPaying
+    }
+
+    private fun resetPayShowCounter(timems: Long) {
+        counter?.cancel()
+        counter = LastPayShowTimer(timems, 500)
+        counter?.start()
+    }
+
+    private inner class LastPayShowTimer(millisInFuture: Long, countDownInterval: Long) :
+        CountDownTimer(millisInFuture, countDownInterval) {
+
+        override fun onTick(millisUntilFinished: Long) {
+
+        }
+
+        override fun onFinish() {
+            clearLastPayResult()
+        }
+    }
 }
\ 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 11f8580..6ebab3c 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
@@ -1,748 +1,748 @@
-package com.supwisdom.activities.consume.mode
-
-import android.os.Handler
-import android.os.Message
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.consume.IConsumeView
-import com.supwisdom.activities.consume.bean.*
-import com.supwisdom.entity.*
-import com.supwisdom.epaycard.Cardlib
-import com.supwisdom.exception.CardNotFoundError
-import com.supwisdom.exception.CardPayCancelFailError
-import com.supwisdom.exception.CardPayFailError
-import com.supwisdom.exception.CardPayInterruptError
-import com.supwisdom.okhttp.TransResp
-import com.supwisdom.service.EpayApiImpl
-import com.supwisdom.utils.*
-import org.apache.http.HttpStatus
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc 刷卡消费
- **/
-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()
-    @Volatile
-    private var operation = false
-    private val screenSaverBean = ScreenSaverBean()
-
-    init {
-        screenSaverBean.operationTime = System.currentTimeMillis()
-    }
-
-    fun start() {
-        isExist = false
-        if (thread == null) {
-            thread = Thread(runnable)
-            thread!!.start()
-        }
-    }
-
-    fun stop() {
-        isExist = true
-        thread?.interrupt()
-        thread = null
-    }
-
-    fun clickNoPay() {
-        clickStat = ClickStat.INIT
-        amount = 0
-    }
-
-    fun clickToPay(amount: Int) {
-        clickStat = ClickStat.PAY
-        this.amount = amount
-    }
-
-    fun clickToReverse(amount: Int) {
-        clickStat = ClickStat.REVERSE
-        this.amount = amount
-    }
-
-    fun clickToInterrupt() {
-        clickStat = ClickStat.INIT
-        payQueryConfirm = false
-    }
-
-    fun resetOperationTime() {
-        operation = true
-    }
-
-    private inner class CardPayRunnable : Runnable {
-        private lateinit var onlRecord: TransdtlOnlineRecord
-        private lateinit var onlRvsRecord: TransdtlOnlineRecord
-        private lateinit var offRecord: TransdtlOfflineRecord
-        private lateinit var offRvsRecord: TransdtlOfflineRecord
-        private var oldcardphyid: String? = null
-        private var onlineBalance = false
-        private var curLinkStatus = false
-        private var lastShowTime: Long = 0
-        private var lastUserInfoTime: Long = 0
-        private var curLinkRefreshTime: Long = 0
-        override fun run() {
-            while (!isExist) {
-                iConsumeView.cardPayingStatus(false)
-                checkShowScreen()
-                if (iConsumeView.isBackRunning()) {
-                    CommonUtil.doSleep(1000)
-                    continue
-                }
-                CommonUtil.doSleep(100)
-                try {
-                    val cardphyid = Cardlib.instance.requestCard()
-                    iConsumeView.cardPayingStatus(true)
-                    if (oldcardphyid != cardphyid) {
-                        readCard()
-                        cardBean!!.cardphyid = cardphyid
-                        oldcardphyid = cardphyid
-                        operation = true
-                    }
-                    when (clickStat) {
-                        ClickStat.PAY -> {
-                            try {
-                                doConsume()
-                            } catch (ex: CardPayFailError) {
-                                sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo(ex.message))
-                            } catch (ex: CardPayInterruptError) {
-                                sendMsg(PublicDef.MSG_PAYING_INTERRUPT, getErrorInfo(ex.message))
-                            } catch (ex: Exception) {
-                                ex.printStackTrace()
-                                LogUtil.d(
-                                    TAG, "card pay exception: cardphyid=$cardphyid"
-                                            + "exception=${CommonUtil.getExceptionStack(ex)}"
-                                )
-                                sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo("程序异常"))
-                            }
-                            clickStat = ClickStat.INIT
-                        }
-                        ClickStat.REVERSE -> {
-                            try {
-                                doReverse()
-                            } catch (ex: CardPayCancelFailError) {
-                                sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getRvsErrorInfo(ex.message))
-                            } catch (ex: Exception) {
-                                ex.printStackTrace()
-                                LogUtil.d(
-                                    TAG, "card pay cancel exception: cardphyid=$cardphyid"
-                                            + "exception=${CommonUtil.getExceptionStack(ex)}"
-                                )
-                                sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getRvsErrorInfo("程序异常"))
-                            }
-                            clickStat = ClickStat.INIT
-                        }
-                        ClickStat.INIT -> {
-                            if (SPApplication.getInstance().isOnline() && !onlineBalance) {
-                                onlineBalance = true
-                                getAccountInfoByCard()
-                            }
-                            val curtime = System.currentTimeMillis()
-                            if (curtime < lastUserInfoTime ||
-                                curtime - lastUserInfoTime > 1000
-                            ) {
-                                lastUserInfoTime = curtime
-                                showCardUserInfo()
-                            }
-                        }
-                    }
-                } catch (ex: CardNotFoundError) {
-                    ex.printStackTrace()
-                    doClear()
-                } catch (ex: Exception) {
-                    ex.printStackTrace()
-                    doClear()
-                }
-            }
-        }
-
-        private fun getAccountInfoByCard() {
-            val resp = consumeApi.accQuery(
-                pos.getConfigPara()!!.devphyid!!,
-                cardBean!!.cardphyid!!,
-                cardBean!!.cardNo!!
-            )
-            if (resp != null && resp.retcode == HttpStatus.SC_OK) {
-                try {
-                    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
-                        }
-                    }
-                } catch (ex: Exception) {
-                    ex.printStackTrace()
-                }
-            }
-        }
-
-        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) {
-                info.username = cardBean!!.username
-            }
-            info.cardno = cardBean!!.cardNo
-            info.cardstatus = cardBean!!.cardstatus
-            sendMsg(PublicDef.MSG_USER_INFO_SHOW, info)
-        }
-
-        private fun readCard() {
-            val cardinfo = Cardlib.instance.readCard()
-            cardBean = CardBean()
-            cardBean!!.cardNo = cardinfo.cardNo
-            cardBean!!.idCard = cardinfo.idCard
-            cardBean!!.expireDate = cardinfo.expireDate
-            cardBean!!.amount = amount
-            cardBean!!.datetime = DateUtil.getNowDateTimeFormat()
-            /**
-             * 用户名默认用卡号代替,在线查询更新为用户名
-             */
-            cardBean!!.username = cardBean!!.cardNo
-        }
-
-        private fun doConsume() {
-            if (isFixMode) {
-                if (lastPayBean.cardphyid == cardBean!!.cardphyid) {
-                    val gap = (pos.getSysPara()?.fixpayGap ?: 10).toLong()
-                    if (System.currentTimeMillis() - lastPayBean.suctime < gap * 1000) {
-                        throw CardPayFailError("${gap}s内不能连续消费")
-                    }
-                }
-            }
-            sendMsg(PublicDef.MSG_CARD_PAYING, "正在扣款...")
-            if (SPApplication.getInstance().isOnline()) {
-                if (!doOnlineConsume()) {
-                    /**
-                     * 由于不写卡，联机消费失败直接转离线
-                     */
-                    doOfflineConsume()
-                }
-            } else {
-                doOfflineConsume()
-            }
-        }
-
-        private fun doReverse() {
-            val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), 0, 0, 1)
-            if (list.isEmpty()) {
-                throw CardPayCancelFailError("未找到消费记录")
-            }
-            if (list[0].payway == "offcard") {
-                doOfflineReverse(list[0])
-            } else {
-                doOnlineReverse(list[0])
-            }
-        }
-
-        private fun doOnlineReverse(unionRecord: TransdtlUnionRecord) {
-            val record = pos.getTransdtlOnlineLast() ?: throw CardPayCancelFailError("未找到联机记录")
-            checkOnlineReverseVaild(unionRecord, record)
-            saveTransdtlOnlineReverse(record)
-            showRvsOnlSucInfo()
-            asyncUpload(onlRvsRecord)
-        }
-
-        private fun doOfflineReverse(unionRecord: TransdtlUnionRecord) {
-            val record = pos.getTransdtlOfflineLast() ?: throw CardPayCancelFailError("未找到离线记录")
-            checkOfflineReverseVaild(unionRecord, record)
-            saveTransdtlOfflineReverse(record)
-            showRvsOffSucInfo()
-            asyncUpload(offRvsRecord)
-        }
-
-        private fun saveTransdtlOfflineReverse(record: TransdtlOfflineRecord) {
-            offRvsRecord = record.clone()
-            offRvsRecord.devseqno += 1
-            offRvsRecord.transdate = DateUtil.getNowDateNoFormat()
-            offRvsRecord.transtime = DateUtil.getNowTimeNoFormat()
-            offRvsRecord.reversalflag = ReversalFlag.MANUAL
-            offRvsRecord.reversalseqno = record.devseqno
-            offRvsRecord.reversaltransdate = record.transdate
-            offRvsRecord.reversaltranstime = record.transtime
-            offRvsRecord.upflag = 0
-            if (!pos.saveTransdtlOffline(offRvsRecord)) {
-                throw CardPayCancelFailError("保存流水失败")
-            }
-        }
-
-        private fun saveTransdtlOnlineReverse(record: TransdtlOnlineRecord) {
-            onlRvsRecord = record.clone()
-            onlRvsRecord.devseqno += 1
-            onlRvsRecord.transdate = DateUtil.getNowDateNoFormat()
-            onlRvsRecord.transtime = DateUtil.getNowTimeNoFormat()
-            onlRvsRecord.reversalflag = ReversalFlag.MANUAL
-            onlRvsRecord.reversalbillno = record.billno
-            onlRvsRecord.upflag = 0
-            if (!pos.saveTransdtlOnline(onlRvsRecord)) {
-                throw CardPayCancelFailError("保存流水失败")
-            }
-        }
-
-        private fun checkOnlineReverseVaild(unionRecord: TransdtlUnionRecord, record: TransdtlOnlineRecord) {
-            if (record.cardphyid != cardBean!!.cardphyid) {
-                throw CardPayCancelFailError("该卡不是最后消费")
-            }
-            if (unionRecord.transdate != record.transdate ||
-                unionRecord.transtime != record.transtime
-            ) {
-                throw CardPayCancelFailError("联机记录时间异常")
-            }
-            if (record.reversalflag == ReversalFlag.AUTO
-            ) {
-                throw CardPayCancelFailError("已撤销")
-            }
-            if (record.reversalflag == ReversalFlag.MANUAL) {
-                throw CardPayCancelFailError("已冲正")
-            }
-            if (record.status != PayStatus.SUC) {
-                throw CardPayCancelFailError("消费失败不能冲正")
-            }
-            val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
-            val t2 = System.currentTimeMillis()
-            if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
-                throw CardPayCancelFailError("消费已过期")
-            }
-        }
-
-        private fun checkOfflineReverseVaild(unionRecord: TransdtlUnionRecord, record: TransdtlOfflineRecord) {
-            if (record.cardphyid != cardBean!!.cardphyid) {
-                throw CardPayCancelFailError("该卡不是最后消费")
-            }
-            if (unionRecord.transdate != record.transdate ||
-                unionRecord.transtime != record.transtime
-            ) {
-                throw CardPayCancelFailError("离线记录时间异常")
-            }
-            if (record.reversalflag == ReversalFlag.MANUAL ||
-                record.reversalflag == ReversalFlag.AUTO
-            ) {
-                throw CardPayCancelFailError("已冲正")
-            }
-            if (record.status != PayStatus.SUC) {
-                throw CardPayCancelFailError("消费失败不能冲正")
-            }
-            val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
-            val t2 = System.currentTimeMillis()
-            if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
-                throw CardPayCancelFailError("消费已过期")
-            }
-        }
-
-        private fun doOnlineConsume(): Boolean {
-            initTransdtlOnline()
-            var resp = consumeApi.payInit(onlRecord)
-            var result = parseInitResult(resp)
-            if (!result) {
-                return result
-            }
-            resp = consumeApi.payConfirm(onlRecord)
-            result = parseConfirmResult(resp)
-            payQueryConfirm = false
-            if (!result) {
-                payQueryConfirm = true
-                result = doOnlineConsumeQuery()
-            }
-            updateTransdtlOnline(result)
-            if (result) {
-                showOnlSucInfo()
-            }
-            return result
-        }
-
-        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]")
-                val resp = consumeApi.payQuery(onlRecord)
-                val result = parseConfirmResult(resp)
-                if (result) {
-                    return result
-                }
-                queryCnt += 1
-                sleepWithCancel(3000)
-            }
-            /**
-             * 手动取消交易
-             */
-            LogUtil.e(TAG, "manual cancel pay,cardphyid=[${onlRecord.cardphyid}],billno=[${onlRecord.billno}]")
-            throw CardPayInterruptError("交易取消")
-        }
-
-        private fun sleepWithCancel(ms: Long) {
-            var time = 0
-            while (payQueryConfirm) {
-                CommonUtil.doSleep(20)
-                time += 20
-                if (time > ms) {
-                    return
-                }
-            }
-        }
-
-        private fun parseInitResult(resp: TransResp?): Boolean {
-            if (resp == null || resp.retcode != HttpStatus.SC_OK) {
-                SPApplication.getInstance().setEpayLinking(false)
-                return false
-            }
-            val retBean = try {
-                GsonUtil.GsonToBean(resp.retjson!!, CardPayInitRetBean::class.java)
-            } catch (ex: java.lang.Exception) {
-                throw CardPayFailError("json异常:${ex.message}")
-            }
-            if (retBean.retcode != PublicDef.SUCCESS) {
-                throw CardPayFailError(retBean.getErrorMsg())
-            }
-            onlRecord.billno = retBean.billno
-            onlRecord.username = retBean.username
-            return true
-        }
-
-        private fun parseConfirmResult(resp: TransResp?): Boolean {
-            if (resp == null || resp.retcode != HttpStatus.SC_OK) {
-                return false
-            }
-            val retBean = try {
-                GsonUtil.GsonToBean(resp.retjson!!, CardPayConfirmRetBean::class.java)
-            } catch (ex: Exception) {
-                throw CardPayFailError("json异常:${ex.message}")
-            }
-            if (retBean.retcode != PublicDef.SUCCESS) {
-                throw CardPayFailError(retBean.getErrorMsg())
-            }
-            if (retBean.require_query) {
-                return false
-            }
-            onlRecord.payamt = retBean.amount
-            onlRecord.extraamt = retBean.extraamt
-            return true
-        }
-
-        private fun initTransdtlOnline() {
-            onlRecord = TransdtlOnlineRecord()
-            var seqno = pos.getTransdtlOnlineMaxSeqno()
-            if (seqno == 0) {
-                seqno = pos.getDynamicPara()?.onlineseqno ?: 0
-            }
-            onlRecord.devphyid = pos.getConfigPara()!!.devphyid
-            onlRecord.transdate = cardBean!!.datetime!!.substring(0, 8)
-            onlRecord.transtime = cardBean!!.datetime!!.substring(8)
-            onlRecord.devseqno = seqno + 1
-            onlRecord.cardno = cardBean!!.cardNo
-            onlRecord.cardphyid = cardBean!!.cardphyid
-            onlRecord.payamt = cardBean!!.amount
-            onlRecord.reversalflag = ReversalFlag.NONE
-            onlRecord.extraamt = 0
-            onlRecord.transtype = "card"
-            onlRecord.status = PayStatus.INIT
-            onlRecord.upflag = 1
-            if (!pos.saveTransdtlOnline(onlRecord)) {
-                throw CardPayFailError("保存流水失败")
-            }
-        }
-
-        private fun updateTransdtlOnline(issuccess: Boolean) {
-            if (issuccess) {
-                onlRecord.status = PayStatus.SUC
-            } else {
-                onlRecord.status = PayStatus.FAIL
-            }
-            onlRecord.upflag = 1
-            pos.updateTransdtlOnline(onlRecord)
-        }
-
-        private fun doOfflineConsume() {
-            initTransdtlOffline()
-            checkCardValid()
-            updateTransdtlOffline(true)
-            showOffSucInfo()
-        }
-
-        private fun checkCardValid() {
-            val sysRecord = pos.getSysPara()
-            if (!sysRecord!!.offlineEnable) {
-                throw CardPayFailError("禁止离线交易")
-            }
-            val ctlRecord = pos.getControlPara(PublicDef.CONTROL_OFFLINE_DAY_DISABLE)
-            if (ctlRecord == null || ctlRecord.paraval != "1") {
-                val offdate = DateUtil.getDayDateNoFormatBefore(sysRecord.maxOfflineDays)
-                val validdate = pos.getDynamicPara()!!.jwtExpire?.substring(0, 8) ?: "00000000"
-                if (offdate > validdate) {
-                    throw CardPayFailError("设备已脱机${sysRecord.maxOfflineDays}天")
-                }
-            }
-
-            val whiteRecord =
-                pos.getWhiteList(offRecord.cardphyid!!, offRecord.cardno!!) ?: throw CardPayFailError("卡无权限")
-            when (whiteRecord.status) {
-                "normal" -> {
-
-                }
-                "expire" -> throw CardPayFailError("卡已过期")
-                "lost" -> throw CardPayFailError("卡已挂失")
-                "logout" -> throw CardPayFailError("卡已注销")
-                "frozen" -> throw CardPayFailError("卡已冻结")
-                "lock" -> throw CardPayFailError("卡已锁定")
-                else -> throw CardPayFailError("卡状态:${whiteRecord.status}")
-            }
-
-            val payamt = pos.getTransdtlOfflineAmt(offRecord.transdate!!, offRecord.cardno!!, offRecord.cardphyid!!)
-            if ((payamt + offRecord.payamt) > sysRecord.maxDayOfflineAmt) {
-                throw CardPayFailError("已离线交易" + String.format("%.02f元", payamt / 100.0f))
-            }
-        }
-
-        private fun initTransdtlOffline() {
-            offRecord = TransdtlOfflineRecord()
-            var seqno = pos.getTransdtlOfflineMaxSeqno()
-            if (seqno == 0) {
-                seqno = pos.getDynamicPara()?.offlineseqno ?: 0
-            }
-            offRecord.devphyid = pos.getConfigPara()!!.devphyid
-            offRecord.transdate = cardBean!!.datetime!!.substring(0, 8)
-            offRecord.transtime = cardBean!!.datetime!!.substring(8)
-            offRecord.devseqno = seqno + 1
-            offRecord.cardno = cardBean!!.cardNo
-            offRecord.cardphyid = cardBean!!.cardphyid
-            offRecord.payamt = cardBean!!.amount
-            offRecord.reversalflag = ReversalFlag.NONE
-            offRecord.extraamt = 0
-            offRecord.managefeetype = "none"
-            offRecord.status = PayStatus.INIT
-            offRecord.upflag = 1
-            if (!pos.saveTransdtlOffline(offRecord)) {
-                throw CardPayFailError("保存流水失败")
-            }
-        }
-
-        private fun updateTransdtlOffline(issuccess: Boolean) {
-            if (issuccess) {
-                offRecord.status = PayStatus.SUC
-            } else {
-                offRecord.status = PayStatus.FAIL
-            }
-            offRecord.upflag = 0
-            if (!pos.updateTransdtlOffline(offRecord)) {
-                throw CardPayFailError("更新流水失败")
-            }
-            asyncUpload(offRecord)
-        }
-
-        private fun showOnlSucInfo() {
-            lastPayBean.cardphyid = cardBean!!.cardphyid
-            lastPayBean.suctime = System.currentTimeMillis()
-            val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
-            info.showtime = pos.getSysPara()!!.sucShowtime
-            info.amount = onlRecord.payamt
-            info.payamt = onlRecord.payamt
-            info.username = onlRecord.username
-            info.cardno = onlRecord.cardno
-            info.transdate = onlRecord.transdate
-            info.transtime = onlRecord.transtime
-            info.payway = onlRecord.transtype
-            info.status = onlRecord.status
-            info.reversalFlag = onlRecord.reversalflag
-            sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
-        }
-
-        private fun showOffSucInfo() {
-            lastPayBean.cardphyid = cardBean!!.cardphyid
-            lastPayBean.suctime = System.currentTimeMillis()
-            val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
-            info.showtime = pos.getSysPara()!!.sucShowtime
-            info.amount = offRecord.payamt
-            info.payamt = offRecord.payamt
-            info.cardno = offRecord.cardno
-            info.transdate = offRecord.transdate
-            info.transtime = offRecord.transtime
-            info.payway = "card"
-            info.status = offRecord.status
-            info.reversalFlag = offRecord.reversalflag
-            sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
-        }
-
-        private fun showRvsOnlSucInfo() {
-            val info = CardUserInfoBean(PublicDef.SUCCESS, "冲正成功")
-            info.showtime = pos.getSysPara()!!.sucShowtime
-            info.amount = onlRvsRecord.payamt
-            info.payamt = onlRvsRecord.payamt
-            info.username = onlRvsRecord.username
-            info.cardno = onlRvsRecord.cardno
-            info.transdate = onlRvsRecord.transdate
-            info.transtime = onlRvsRecord.transtime
-            info.payway = onlRvsRecord.transtype
-            info.status = onlRvsRecord.status
-            info.reversalFlag = onlRvsRecord.reversalflag
-            sendMsg(PublicDef.MSG_CARD_REVERSE_SUC, info)
-        }
-
-        private fun showRvsOffSucInfo() {
-            val info = CardUserInfoBean(PublicDef.SUCCESS, "冲正成功")
-            info.showtime = pos.getSysPara()!!.sucShowtime
-            info.amount = offRvsRecord.payamt
-            info.payamt = offRvsRecord.payamt
-            info.cardno = offRvsRecord.cardno
-            info.transdate = offRvsRecord.transdate
-            info.transtime = offRvsRecord.transtime
-            info.payway = "card"
-            info.status = offRvsRecord.status
-            info.reversalFlag = offRvsRecord.reversalflag
-            sendMsg(PublicDef.MSG_CARD_REVERSE_SUC, info)
-        }
-
-        private fun asyncUpload(dtl: TransdtlOfflineRecord) {
-            ThreadPool.getShortPool().execute(Runnable {
-                try {
-                    EpayApiImpl().uploadTransdtl(dtl)
-                    dtl.upflag = 1
-                    pos.updateTransdtlOffline(dtl)
-                } catch (ex: java.lang.Exception) {
-                    ex.printStackTrace()
-                }
-            })
-        }
-
-        private fun asyncUpload(dtl: TransdtlOnlineRecord) {
-            ThreadPool.getShortPool().execute(Runnable {
-                try {
-                    EpayApiImpl().uploadTransdtl(dtl)
-                    dtl.upflag = 1
-                    pos.updateTransdtlOnline(dtl)
-                } catch (ex: java.lang.Exception) {
-                    ex.printStackTrace()
-                }
-            })
-        }
-
-        private fun doClear() {
-            oldcardphyid = null
-            onlineBalance = false
-            val curtime = System.currentTimeMillis()
-            if (curtime < lastShowTime ||
-                curtime - lastShowTime > 1000
-            ) {
-                lastShowTime = curtime
-                sendMsg(PublicDef.MSG_USER_INFO_CLEAR, DateUtil.getNowDateTime())
-                showLinkStatus()
-            }
-        }
-
-        private fun showLinkStatus() {
-            if (SPApplication.getInstance().isOnline()) {
-                if (!curLinkStatus) {
-                    curLinkRefreshTime = System.currentTimeMillis()
-                    curLinkStatus = true
-                    sendMsg(PublicDef.MSG_LINK_STATUS, true)
-                    return
-                }
-            } else {
-                if (curLinkStatus) {
-                    curLinkStatus = false
-                    curLinkRefreshTime = System.currentTimeMillis()
-                    sendMsg(PublicDef.MSG_LINK_STATUS, false)
-                    return
-                }
-            }
-            val t = System.currentTimeMillis()
-            if (t < curLinkRefreshTime ||
-                t - curLinkRefreshTime > 30000
-            ) {
-                curLinkRefreshTime = t
-                sendMsg(PublicDef.MSG_LINK_STATUS, SPApplication.getInstance().isOnline())
-            }
-        }
-
-        private fun getErrorInfo(errmsg: String?): CardUserInfoBean {
-            val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
-            info.showtime = pos.getSysPara()!!.failShowtime
-            info.status = PayStatus.FAIL
-            info.amount = amount
-            info.payamt = amount
-            info.payway = "card"
-            info.cardno = cardBean?.cardNo
-            info.transdate = DateUtil.getNowDateNoFormat()
-            info.transtime = DateUtil.getNowTimeNoFormat()
-            return info
-        }
-
-        private fun getRvsErrorInfo(errmsg: String?): CardUserInfoBean {
-            val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
-            info.showtime = pos.getSysPara()!!.failShowtime
-            info.status = PayStatus.FAIL
-            info.amount = amount
-            info.payamt = amount
-            info.cardno = cardBean?.cardNo
-            info.payway = "card"
-            info.transdate = DateUtil.getNowDateNoFormat()
-            info.transtime = DateUtil.getNowTimeNoFormat()
-            info.reversalFlag = ReversalFlag.MANUAL
-            return info
-        }
-
-        private fun sendMsg(code: Int, obj: Any) {
-            val msg = Message()
-            msg.what = code
-            msg.obj = obj
-            handler.sendMessage(msg)
-        }
-    }
-}
-
-enum class ClickStat {
-    INIT,
-    PAY,
-    REVERSE
+package com.supwisdom.activities.consume.mode
+
+import android.os.Handler
+import android.os.Message
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.consume.IConsumeView
+import com.supwisdom.activities.consume.bean.*
+import com.supwisdom.entity.*
+import com.supwisdom.epaycard.Cardlib
+import com.supwisdom.exception.CardNotFoundError
+import com.supwisdom.exception.CardPayCancelFailError
+import com.supwisdom.exception.CardPayFailError
+import com.supwisdom.exception.CardPayInterruptError
+import com.supwisdom.okhttp.TransResp
+import com.supwisdom.service.EpayApiImpl
+import com.supwisdom.utils.*
+import org.apache.http.HttpStatus
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc 刷卡消费
+ **/
+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()
+    @Volatile
+    private var operation = false
+    private val screenSaverBean = ScreenSaverBean()
+
+    init {
+        screenSaverBean.operationTime = System.currentTimeMillis()
+    }
+
+    fun start() {
+        isExist = false
+        if (thread == null) {
+            thread = Thread(runnable)
+            thread!!.start()
+        }
+    }
+
+    fun stop() {
+        isExist = true
+        thread?.interrupt()
+        thread = null
+    }
+
+    fun clickNoPay() {
+        clickStat = ClickStat.INIT
+        amount = 0
+    }
+
+    fun clickToPay(amount: Int) {
+        clickStat = ClickStat.PAY
+        this.amount = amount
+    }
+
+    fun clickToReverse(amount: Int) {
+        clickStat = ClickStat.REVERSE
+        this.amount = amount
+    }
+
+    fun clickToInterrupt() {
+        clickStat = ClickStat.INIT
+        payQueryConfirm = false
+    }
+
+    fun resetOperationTime() {
+        operation = true
+    }
+
+    private inner class CardPayRunnable : Runnable {
+        private lateinit var onlRecord: TransdtlOnlineRecord
+        private lateinit var onlRvsRecord: TransdtlOnlineRecord
+        private lateinit var offRecord: TransdtlOfflineRecord
+        private lateinit var offRvsRecord: TransdtlOfflineRecord
+        private var oldcardphyid: String? = null
+        private var onlineBalance = false
+        private var curLinkStatus = false
+        private var lastShowTime: Long = 0
+        private var lastUserInfoTime: Long = 0
+        private var curLinkRefreshTime: Long = 0
+        override fun run() {
+            while (!isExist) {
+                iConsumeView.cardPayingStatus(false)
+                checkShowScreen()
+                if (iConsumeView.isBackRunning()) {
+                    CommonUtil.doSleep(1000)
+                    continue
+                }
+                CommonUtil.doSleep(100)
+                try {
+                    val cardphyid = Cardlib.instance.requestCard()
+                    iConsumeView.cardPayingStatus(true)
+                    if (oldcardphyid != cardphyid) {
+                        readCard()
+                        cardBean!!.cardphyid = cardphyid
+                        oldcardphyid = cardphyid
+                        operation = true
+                    }
+                    when (clickStat) {
+                        ClickStat.PAY -> {
+                            try {
+                                doConsume()
+                            } catch (ex: CardPayFailError) {
+                                sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo(ex.message))
+                            } catch (ex: CardPayInterruptError) {
+                                sendMsg(PublicDef.MSG_PAYING_INTERRUPT, getErrorInfo(ex.message))
+                            } catch (ex: Exception) {
+                                ex.printStackTrace()
+                                LogUtil.d(
+                                    TAG, "card pay exception: cardphyid=$cardphyid"
+                                            + "exception=${CommonUtil.getExceptionStack(ex)}"
+                                )
+                                sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo("程序异常"))
+                            }
+                            clickStat = ClickStat.INIT
+                        }
+                        ClickStat.REVERSE -> {
+                            try {
+                                doReverse()
+                            } catch (ex: CardPayCancelFailError) {
+                                sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getRvsErrorInfo(ex.message))
+                            } catch (ex: Exception) {
+                                ex.printStackTrace()
+                                LogUtil.d(
+                                    TAG, "card pay cancel exception: cardphyid=$cardphyid"
+                                            + "exception=${CommonUtil.getExceptionStack(ex)}"
+                                )
+                                sendMsg(PublicDef.MSG_CARD_REVERSE_FAIL, getRvsErrorInfo("程序异常"))
+                            }
+                            clickStat = ClickStat.INIT
+                        }
+                        ClickStat.INIT -> {
+                            if (SPApplication.getInstance().isOnline() && !onlineBalance) {
+                                onlineBalance = true
+                                getAccountInfoByCard()
+                            }
+                            val curtime = System.currentTimeMillis()
+                            if (curtime < lastUserInfoTime ||
+                                curtime - lastUserInfoTime > 1000
+                            ) {
+                                lastUserInfoTime = curtime
+                                showCardUserInfo()
+                            }
+                        }
+                    }
+                } catch (ex: CardNotFoundError) {
+                    ex.printStackTrace()
+                    doClear()
+                } catch (ex: Exception) {
+                    ex.printStackTrace()
+                    doClear()
+                }
+            }
+        }
+
+        private fun getAccountInfoByCard() {
+            val resp = consumeApi.accQuery(
+                pos.getConfigPara()!!.devphyid!!,
+                cardBean!!.cardphyid!!,
+                cardBean!!.cardNo!!
+            )
+            if (resp != null && resp.retcode == HttpStatus.SC_OK) {
+                try {
+                    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
+                        }
+                    }
+                } catch (ex: Exception) {
+                    ex.printStackTrace()
+                }
+            }
+        }
+
+        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) {
+                info.username = cardBean!!.username
+            }
+            info.cardno = cardBean!!.cardNo
+            info.cardstatus = cardBean!!.cardstatus
+            sendMsg(PublicDef.MSG_USER_INFO_SHOW, info)
+        }
+
+        private fun readCard() {
+            val cardinfo = Cardlib.instance.readCard()
+            cardBean = CardBean()
+            cardBean!!.cardNo = cardinfo.cardNo
+            cardBean!!.idCard = cardinfo.idCard
+            cardBean!!.expireDate = cardinfo.expireDate
+            cardBean!!.amount = amount
+            cardBean!!.datetime = DateUtil.getNowDateTimeFormat()
+            /**
+             * 用户名默认用卡号代替,在线查询更新为用户名
+             */
+            cardBean!!.username = cardBean!!.cardNo
+        }
+
+        private fun doConsume() {
+            if (isFixMode) {
+                if (lastPayBean.cardphyid == cardBean!!.cardphyid) {
+                    val gap = (pos.getSysPara()?.fixpayGap ?: 10).toLong()
+                    if (System.currentTimeMillis() - lastPayBean.suctime < gap * 1000) {
+                        throw CardPayFailError("${gap}s内不能连续消费")
+                    }
+                }
+            }
+            sendMsg(PublicDef.MSG_CARD_PAYING, "正在扣款...")
+            if (SPApplication.getInstance().isOnline()) {
+                if (!doOnlineConsume()) {
+                    /**
+                     * 由于不写卡，联机消费失败直接转离线
+                     */
+                    doOfflineConsume()
+                }
+            } else {
+                doOfflineConsume()
+            }
+        }
+
+        private fun doReverse() {
+            val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), 0, 0, 1)
+            if (list.isEmpty()) {
+                throw CardPayCancelFailError("未找到消费记录")
+            }
+            if (list[0].payway == "offcard") {
+                doOfflineReverse(list[0])
+            } else {
+                doOnlineReverse(list[0])
+            }
+        }
+
+        private fun doOnlineReverse(unionRecord: TransdtlUnionRecord) {
+            val record = pos.getTransdtlOnlineLast() ?: throw CardPayCancelFailError("未找到联机记录")
+            checkOnlineReverseVaild(unionRecord, record)
+            saveTransdtlOnlineReverse(record)
+            showRvsOnlSucInfo()
+            asyncUpload(onlRvsRecord)
+        }
+
+        private fun doOfflineReverse(unionRecord: TransdtlUnionRecord) {
+            val record = pos.getTransdtlOfflineLast() ?: throw CardPayCancelFailError("未找到离线记录")
+            checkOfflineReverseVaild(unionRecord, record)
+            saveTransdtlOfflineReverse(record)
+            showRvsOffSucInfo()
+            asyncUpload(offRvsRecord)
+        }
+
+        private fun saveTransdtlOfflineReverse(record: TransdtlOfflineRecord) {
+            offRvsRecord = record.clone()
+            offRvsRecord.devseqno += 1
+            offRvsRecord.transdate = DateUtil.getNowDateNoFormat()
+            offRvsRecord.transtime = DateUtil.getNowTimeNoFormat()
+            offRvsRecord.reversalflag = ReversalFlag.MANUAL
+            offRvsRecord.reversalseqno = record.devseqno
+            offRvsRecord.reversaltransdate = record.transdate
+            offRvsRecord.reversaltranstime = record.transtime
+            offRvsRecord.upflag = 0
+            if (!pos.saveTransdtlOffline(offRvsRecord)) {
+                throw CardPayCancelFailError("保存流水失败")
+            }
+        }
+
+        private fun saveTransdtlOnlineReverse(record: TransdtlOnlineRecord) {
+            onlRvsRecord = record.clone()
+            onlRvsRecord.devseqno += 1
+            onlRvsRecord.transdate = DateUtil.getNowDateNoFormat()
+            onlRvsRecord.transtime = DateUtil.getNowTimeNoFormat()
+            onlRvsRecord.reversalflag = ReversalFlag.MANUAL
+            onlRvsRecord.reversalbillno = record.billno
+            onlRvsRecord.upflag = 0
+            if (!pos.saveTransdtlOnline(onlRvsRecord)) {
+                throw CardPayCancelFailError("保存流水失败")
+            }
+        }
+
+        private fun checkOnlineReverseVaild(unionRecord: TransdtlUnionRecord, record: TransdtlOnlineRecord) {
+            if (record.cardphyid != cardBean!!.cardphyid) {
+                throw CardPayCancelFailError("该卡不是最后消费")
+            }
+            if (unionRecord.transdate != record.transdate ||
+                unionRecord.transtime != record.transtime
+            ) {
+                throw CardPayCancelFailError("联机记录时间异常")
+            }
+            if (record.reversalflag == ReversalFlag.AUTO
+            ) {
+                throw CardPayCancelFailError("已撤销")
+            }
+            if (record.reversalflag == ReversalFlag.MANUAL) {
+                throw CardPayCancelFailError("已冲正")
+            }
+            if (record.status != PayStatus.SUC) {
+                throw CardPayCancelFailError("消费失败不能冲正")
+            }
+            val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
+            val t2 = System.currentTimeMillis()
+            if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
+                throw CardPayCancelFailError("消费已过期")
+            }
+        }
+
+        private fun checkOfflineReverseVaild(unionRecord: TransdtlUnionRecord, record: TransdtlOfflineRecord) {
+            if (record.cardphyid != cardBean!!.cardphyid) {
+                throw CardPayCancelFailError("该卡不是最后消费")
+            }
+            if (unionRecord.transdate != record.transdate ||
+                unionRecord.transtime != record.transtime
+            ) {
+                throw CardPayCancelFailError("离线记录时间异常")
+            }
+            if (record.reversalflag == ReversalFlag.MANUAL ||
+                record.reversalflag == ReversalFlag.AUTO
+            ) {
+                throw CardPayCancelFailError("已冲正")
+            }
+            if (record.status != PayStatus.SUC) {
+                throw CardPayCancelFailError("消费失败不能冲正")
+            }
+            val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
+            val t2 = System.currentTimeMillis()
+            if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
+                throw CardPayCancelFailError("消费已过期")
+            }
+        }
+
+        private fun doOnlineConsume(): Boolean {
+            initTransdtlOnline()
+            var resp = consumeApi.payInit(onlRecord)
+            var result = parseInitResult(resp)
+            if (!result) {
+                return result
+            }
+            resp = consumeApi.payConfirm(onlRecord)
+            result = parseConfirmResult(resp)
+            payQueryConfirm = false
+            if (!result) {
+                payQueryConfirm = true
+                result = doOnlineConsumeQuery()
+            }
+            updateTransdtlOnline(result)
+            if (result) {
+                showOnlSucInfo()
+            }
+            return result
+        }
+
+        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]")
+                val resp = consumeApi.payQuery(onlRecord)
+                val result = parseConfirmResult(resp)
+                if (result) {
+                    return result
+                }
+                queryCnt += 1
+                sleepWithCancel(3000)
+            }
+            /**
+             * 手动取消交易
+             */
+            LogUtil.e(TAG, "manual cancel pay,cardphyid=[${onlRecord.cardphyid}],billno=[${onlRecord.billno}]")
+            throw CardPayInterruptError("交易取消")
+        }
+
+        private fun sleepWithCancel(ms: Long) {
+            var time = 0
+            while (payQueryConfirm) {
+                CommonUtil.doSleep(20)
+                time += 20
+                if (time > ms) {
+                    return
+                }
+            }
+        }
+
+        private fun parseInitResult(resp: TransResp?): Boolean {
+            if (resp == null || resp.retcode != HttpStatus.SC_OK) {
+                SPApplication.getInstance().setEpayLinking(false)
+                return false
+            }
+            val retBean = try {
+                GsonUtil.GsonToBean(resp.retjson!!, CardPayInitRetBean::class.java)
+            } catch (ex: java.lang.Exception) {
+                throw CardPayFailError("json异常:${ex.message}")
+            }
+            if (retBean.retcode != PublicDef.SUCCESS) {
+                throw CardPayFailError(retBean.getErrorMsg())
+            }
+            onlRecord.billno = retBean.billno
+            onlRecord.username = retBean.username
+            return true
+        }
+
+        private fun parseConfirmResult(resp: TransResp?): Boolean {
+            if (resp == null || resp.retcode != HttpStatus.SC_OK) {
+                return false
+            }
+            val retBean = try {
+                GsonUtil.GsonToBean(resp.retjson!!, CardPayConfirmRetBean::class.java)
+            } catch (ex: Exception) {
+                throw CardPayFailError("json异常:${ex.message}")
+            }
+            if (retBean.retcode != PublicDef.SUCCESS) {
+                throw CardPayFailError(retBean.getErrorMsg())
+            }
+            if (retBean.require_query) {
+                return false
+            }
+            onlRecord.payamt = retBean.amount
+            onlRecord.extraamt = retBean.extraamt
+            return true
+        }
+
+        private fun initTransdtlOnline() {
+            onlRecord = TransdtlOnlineRecord()
+            var seqno = pos.getTransdtlOnlineMaxSeqno()
+            if (seqno == 0) {
+                seqno = pos.getDynamicPara()?.onlineseqno ?: 0
+            }
+            onlRecord.devphyid = pos.getConfigPara()!!.devphyid
+            onlRecord.transdate = cardBean!!.datetime!!.substring(0, 8)
+            onlRecord.transtime = cardBean!!.datetime!!.substring(8)
+            onlRecord.devseqno = seqno + 1
+            onlRecord.cardno = cardBean!!.cardNo
+            onlRecord.cardphyid = cardBean!!.cardphyid
+            onlRecord.payamt = cardBean!!.amount
+            onlRecord.reversalflag = ReversalFlag.NONE
+            onlRecord.extraamt = 0
+            onlRecord.transtype = "card"
+            onlRecord.status = PayStatus.INIT
+            onlRecord.upflag = 1
+            if (!pos.saveTransdtlOnline(onlRecord)) {
+                throw CardPayFailError("保存流水失败")
+            }
+        }
+
+        private fun updateTransdtlOnline(issuccess: Boolean) {
+            if (issuccess) {
+                onlRecord.status = PayStatus.SUC
+            } else {
+                onlRecord.status = PayStatus.FAIL
+            }
+            onlRecord.upflag = 1
+            pos.updateTransdtlOnline(onlRecord)
+        }
+
+        private fun doOfflineConsume() {
+            initTransdtlOffline()
+            checkCardValid()
+            updateTransdtlOffline(true)
+            showOffSucInfo()
+        }
+
+        private fun checkCardValid() {
+            val sysRecord = pos.getSysPara()
+            if (!sysRecord!!.offlineEnable) {
+                throw CardPayFailError("禁止离线交易")
+            }
+            val ctlRecord = pos.getControlPara(PublicDef.CONTROL_OFFLINE_DAY_DISABLE)
+            if (ctlRecord == null || ctlRecord.paraval != "1") {
+                val offdate = DateUtil.getDayDateNoFormatBefore(sysRecord.maxOfflineDays)
+                val validdate = pos.getDynamicPara()!!.jwtExpire?.substring(0, 8) ?: "00000000"
+                if (offdate > validdate) {
+                    throw CardPayFailError("设备已脱机${sysRecord.maxOfflineDays}天")
+                }
+            }
+
+            val whiteRecord =
+                pos.getWhiteList(offRecord.cardphyid!!, offRecord.cardno!!) ?: throw CardPayFailError("卡无权限")
+            when (whiteRecord.status) {
+                "normal" -> {
+
+                }
+                "expire" -> throw CardPayFailError("卡已过期")
+                "lost" -> throw CardPayFailError("卡已挂失")
+                "logout" -> throw CardPayFailError("卡已注销")
+                "frozen" -> throw CardPayFailError("卡已冻结")
+                "lock" -> throw CardPayFailError("卡已锁定")
+                else -> throw CardPayFailError("卡状态:${whiteRecord.status}")
+            }
+
+            val payamt = pos.getTransdtlOfflineAmt(offRecord.transdate!!, offRecord.cardno!!, offRecord.cardphyid!!)
+            if ((payamt + offRecord.payamt) > sysRecord.maxDayOfflineAmt) {
+                throw CardPayFailError("已离线交易" + String.format("%.02f元", payamt / 100.0f))
+            }
+        }
+
+        private fun initTransdtlOffline() {
+            offRecord = TransdtlOfflineRecord()
+            var seqno = pos.getTransdtlOfflineMaxSeqno()
+            if (seqno == 0) {
+                seqno = pos.getDynamicPara()?.offlineseqno ?: 0
+            }
+            offRecord.devphyid = pos.getConfigPara()!!.devphyid
+            offRecord.transdate = cardBean!!.datetime!!.substring(0, 8)
+            offRecord.transtime = cardBean!!.datetime!!.substring(8)
+            offRecord.devseqno = seqno + 1
+            offRecord.cardno = cardBean!!.cardNo
+            offRecord.cardphyid = cardBean!!.cardphyid
+            offRecord.payamt = cardBean!!.amount
+            offRecord.reversalflag = ReversalFlag.NONE
+            offRecord.extraamt = 0
+            offRecord.managefeetype = "none"
+            offRecord.status = PayStatus.INIT
+            offRecord.upflag = 1
+            if (!pos.saveTransdtlOffline(offRecord)) {
+                throw CardPayFailError("保存流水失败")
+            }
+        }
+
+        private fun updateTransdtlOffline(issuccess: Boolean) {
+            if (issuccess) {
+                offRecord.status = PayStatus.SUC
+            } else {
+                offRecord.status = PayStatus.FAIL
+            }
+            offRecord.upflag = 0
+            if (!pos.updateTransdtlOffline(offRecord)) {
+                throw CardPayFailError("更新流水失败")
+            }
+            asyncUpload(offRecord)
+        }
+
+        private fun showOnlSucInfo() {
+            lastPayBean.cardphyid = cardBean!!.cardphyid
+            lastPayBean.suctime = System.currentTimeMillis()
+            val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
+            info.showtime = pos.getSysPara()!!.sucShowtime
+            info.amount = onlRecord.payamt
+            info.payamt = onlRecord.payamt
+            info.username = onlRecord.username
+            info.cardno = onlRecord.cardno
+            info.transdate = onlRecord.transdate
+            info.transtime = onlRecord.transtime
+            info.payway = onlRecord.transtype
+            info.status = onlRecord.status
+            info.reversalFlag = onlRecord.reversalflag
+            sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
+        }
+
+        private fun showOffSucInfo() {
+            lastPayBean.cardphyid = cardBean!!.cardphyid
+            lastPayBean.suctime = System.currentTimeMillis()
+            val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
+            info.showtime = pos.getSysPara()!!.sucShowtime
+            info.amount = offRecord.payamt
+            info.payamt = offRecord.payamt
+            info.cardno = offRecord.cardno
+            info.transdate = offRecord.transdate
+            info.transtime = offRecord.transtime
+            info.payway = "card"
+            info.status = offRecord.status
+            info.reversalFlag = offRecord.reversalflag
+            sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
+        }
+
+        private fun showRvsOnlSucInfo() {
+            val info = CardUserInfoBean(PublicDef.SUCCESS, "冲正成功")
+            info.showtime = pos.getSysPara()!!.sucShowtime
+            info.amount = onlRvsRecord.payamt
+            info.payamt = onlRvsRecord.payamt
+            info.username = onlRvsRecord.username
+            info.cardno = onlRvsRecord.cardno
+            info.transdate = onlRvsRecord.transdate
+            info.transtime = onlRvsRecord.transtime
+            info.payway = onlRvsRecord.transtype
+            info.status = onlRvsRecord.status
+            info.reversalFlag = onlRvsRecord.reversalflag
+            sendMsg(PublicDef.MSG_CARD_REVERSE_SUC, info)
+        }
+
+        private fun showRvsOffSucInfo() {
+            val info = CardUserInfoBean(PublicDef.SUCCESS, "冲正成功")
+            info.showtime = pos.getSysPara()!!.sucShowtime
+            info.amount = offRvsRecord.payamt
+            info.payamt = offRvsRecord.payamt
+            info.cardno = offRvsRecord.cardno
+            info.transdate = offRvsRecord.transdate
+            info.transtime = offRvsRecord.transtime
+            info.payway = "card"
+            info.status = offRvsRecord.status
+            info.reversalFlag = offRvsRecord.reversalflag
+            sendMsg(PublicDef.MSG_CARD_REVERSE_SUC, info)
+        }
+
+        private fun asyncUpload(dtl: TransdtlOfflineRecord) {
+            ThreadPool.getShortPool().execute(Runnable {
+                try {
+                    EpayApiImpl().uploadTransdtl(dtl)
+                    dtl.upflag = 1
+                    pos.updateTransdtlOffline(dtl)
+                } catch (ex: java.lang.Exception) {
+                    ex.printStackTrace()
+                }
+            })
+        }
+
+        private fun asyncUpload(dtl: TransdtlOnlineRecord) {
+            ThreadPool.getShortPool().execute(Runnable {
+                try {
+                    EpayApiImpl().uploadTransdtl(dtl)
+                    dtl.upflag = 1
+                    pos.updateTransdtlOnline(dtl)
+                } catch (ex: java.lang.Exception) {
+                    ex.printStackTrace()
+                }
+            })
+        }
+
+        private fun doClear() {
+            oldcardphyid = null
+            onlineBalance = false
+            val curtime = System.currentTimeMillis()
+            if (curtime < lastShowTime ||
+                curtime - lastShowTime > 1000
+            ) {
+                lastShowTime = curtime
+                sendMsg(PublicDef.MSG_USER_INFO_CLEAR, DateUtil.getNowDateTime1())
+                showLinkStatus()
+            }
+        }
+
+        private fun showLinkStatus() {
+            if (SPApplication.getInstance().isOnline()) {
+                if (!curLinkStatus) {
+                    curLinkRefreshTime = System.currentTimeMillis()
+                    curLinkStatus = true
+                    sendMsg(PublicDef.MSG_LINK_STATUS, true)
+                    return
+                }
+            } else {
+                if (curLinkStatus) {
+                    curLinkStatus = false
+                    curLinkRefreshTime = System.currentTimeMillis()
+                    sendMsg(PublicDef.MSG_LINK_STATUS, false)
+                    return
+                }
+            }
+            val t = System.currentTimeMillis()
+            if (t < curLinkRefreshTime ||
+                t - curLinkRefreshTime > 30000
+            ) {
+                curLinkRefreshTime = t
+                sendMsg(PublicDef.MSG_LINK_STATUS, SPApplication.getInstance().isOnline())
+            }
+        }
+
+        private fun getErrorInfo(errmsg: String?): CardUserInfoBean {
+            val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
+            info.showtime = pos.getSysPara()!!.failShowtime
+            info.status = PayStatus.FAIL
+            info.amount = amount
+            info.payamt = amount
+            info.payway = "card"
+            info.cardno = cardBean?.cardNo
+            info.transdate = DateUtil.getNowDateNoFormat()
+            info.transtime = DateUtil.getNowTimeNoFormat()
+            return info
+        }
+
+        private fun getRvsErrorInfo(errmsg: String?): CardUserInfoBean {
+            val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
+            info.showtime = pos.getSysPara()!!.failShowtime
+            info.status = PayStatus.FAIL
+            info.amount = amount
+            info.payamt = amount
+            info.cardno = cardBean?.cardNo
+            info.payway = "card"
+            info.transdate = DateUtil.getNowDateNoFormat()
+            info.transtime = DateUtil.getNowTimeNoFormat()
+            info.reversalFlag = ReversalFlag.MANUAL
+            return info
+        }
+
+        private fun sendMsg(code: Int, obj: Any) {
+            val msg = Message()
+            msg.what = code
+            msg.obj = obj
+            handler.sendMessage(msg)
+        }
+    }
+}
+
+enum class ClickStat {
+    INIT,
+    PAY,
+    REVERSE
 }
\ No newline at end of file
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 989ef92..4485976 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
@@ -1,222 +1,236 @@
-package com.supwisdom.activities.consume.mode
-
-import android.os.Handler
-import android.os.Message
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.consume.bean.CardPayConfirmRetBean
-import com.supwisdom.activities.consume.bean.CardPayInitRetBean
-import com.supwisdom.activities.consume.bean.CardUserInfoBean
-import com.supwisdom.activities.consume.bean.LastPayBean
-import com.supwisdom.entity.PayStatus
-import com.supwisdom.entity.ReversalFlag
-import com.supwisdom.entity.TransdtlOnlineRecord
-import com.supwisdom.exception.CardPayFailError
-import com.supwisdom.okhttp.TransResp
-import com.supwisdom.utils.*
-import org.apache.http.HttpStatus
-
-/**
- ** create by zzq on 2019/7/30
- ** @desc 二维码消费
- **/
-class CodePayService constructor(private val handler: Handler) {
-    private val TAG = "CodePayService"
-    private val pos = SPApplication.getInstance().getPos()
-    private lateinit var codeRecord: TransdtlOnlineRecord
-    private val consumeApi = ConsumeApi()
-    /**
-     * 消费过程中可按键主动取消
-     * 手动取消后不冲正,以手机消费结果为准
-     */
-    @Volatile
-    private var interruptedPay: Boolean = false
-    @Volatile
-    private var amount = 0
-    var isFixMode = false
-    private val lastPayBean = LastPayBean()
-
-    fun interruptPay() {
-        interruptedPay = true
-    }
-
-    fun pay(code: String, amount: Int) {
-        this.amount = amount
-        interruptedPay = false
-        try {
-            if (isFixMode) {
-                if (lastPayBean.code == code) {
-                    val gap = (pos.getSysPara()?.fixpayGap ?: 10).toLong()
-                    if (System.currentTimeMillis() - lastPayBean.suctime < gap * 1000) {
-                        throw CardPayFailError("${gap}s内不能连续消费")
-                    }
-                }
-            }
-            initTransdtlOnline(code, amount)
-            var resp = consumeApi.payInit(codeRecord)
-            parseInitResult(resp)
-            resp = consumeApi.payConfirm(codeRecord)
-            var result = parseConfirmResult(resp)
-            if (!result) {
-                result = payResultQuery()
-            }
-            updateTransdtlOnline(result)
-            if (result) {
-                showSucInfo()
-            }
-        } catch (ex: CardPayFailError) {
-            sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo(ex.message))
-        }
-    }
-
-    private fun payResultQuery(): Boolean {
-        sendMsg(PublicDef.MSG_PAYING_QUERY, "谨慎操作查询取消")
-        LogUtil.d(TAG, "扫码消费确认超时,进行查询操作:billno=${codeRecord.billno}")
-        sleepWithCancel(1500)
-        var searchCnt = 1
-        while (!interruptedPay) {
-            sendMsg(PublicDef.MSG_CARD_PAYING, String.format("正在%d次查询...", searchCnt))
-            val resp = consumeApi.payQuery(codeRecord)
-            if (resp != null) {
-                val result = parseConfirmResult(resp)
-                if (!result) {
-                    searchCnt++
-                    sendMsg(PublicDef.MSG_CARD_PAYING, String.format("等待%d次查询...", searchCnt))
-                    sleepWithCancel(5000)
-                    continue
-                }
-                return result
-            } else {
-                searchCnt++
-                sendMsg(PublicDef.MSG_CARD_PAYING, String.format("等待%d次查询...", searchCnt))
-                sleepWithCancel(3000)
-            }
-        }
-        LogUtil.d(TAG, "扫码消费确认超时,操作员手工取消查询:billno=${codeRecord.billno}")
-        return false
-    }
-
-    private fun parseConfirmResult(resp: TransResp?): Boolean {
-        if (resp == null) {
-            SPApplication.getInstance().setEpayLinking(false)
-            return false
-        }
-        if (resp.retcode != HttpStatus.SC_OK) {
-            throw CardPayFailError("错误码=${resp.retcode}")
-        }
-        val retBean = try {
-            GsonUtil.GsonToBean(resp.retjson!!, CardPayConfirmRetBean::class.java)
-        } catch (ex: Exception) {
-            throw CardPayFailError("json异常:${ex.message}")
-        }
-        if (retBean.retcode != PublicDef.SUCCESS) {
-            throw CardPayFailError(retBean.getErrorMsg())
-        }
-        if (retBean.require_query) {
-            // 等待查询
-            return false
-        }
-        codeRecord.payamt = retBean.amount
-        codeRecord.extraamt = retBean.extraamt
-        return true
-    }
-
-    private fun parseInitResult(resp: TransResp?): Boolean {
-        if (resp == null) {
-            SPApplication.getInstance().setEpayLinking(false)
-            throw CardPayFailError("请求超时")
-        }
-        if (resp.retcode != HttpStatus.SC_OK) {
-            throw CardPayFailError("错误码=${resp.retcode}")
-        }
-        val retBean = try {
-            GsonUtil.GsonToBean(resp.retjson!!, CardPayInitRetBean::class.java)
-        } catch (ex: Exception) {
-            throw CardPayFailError("json异常:${ex.message}")
-        }
-        if (retBean.retcode != PublicDef.SUCCESS) {
-            throw CardPayFailError(retBean.getErrorMsg())
-        }
-        codeRecord.billno = retBean.billno
-        codeRecord.username = retBean.username
-        return true
-    }
-
-    private fun initTransdtlOnline(code: String, amount: Int) {
-        codeRecord = TransdtlOnlineRecord()
-        var seqno = pos.getTransdtlOnlineMaxSeqno()
-        if (seqno == 0) {
-            seqno = pos.getDynamicPara()?.onlineseqno ?: 0
-        }
-        codeRecord.devphyid = pos.getConfigPara()!!.devphyid
-        codeRecord.transdate = DateUtil.getNowDateNoFormat()
-        codeRecord.transtime = DateUtil.getNowTimeNoFormat()
-        codeRecord.devseqno = seqno + 1
-        codeRecord.qrcode = code
-        codeRecord.payamt = amount
-        codeRecord.reversalflag = ReversalFlag.NONE
-        codeRecord.extraamt = 0
-        codeRecord.transtype = "code"
-        codeRecord.status = PayStatus.INIT
-        codeRecord.upflag = 1
-        if (!pos.saveTransdtlOnline(codeRecord)) {
-            throw CardPayFailError("保存流水失败")
-        }
-    }
-
-    private fun updateTransdtlOnline(issuccess: Boolean) {
-        if (issuccess) {
-            codeRecord.status = PayStatus.SUC
-        } else {
-            codeRecord.status = PayStatus.FAIL
-        }
-        codeRecord.upflag = 1
-        pos.updateTransdtlOnline(codeRecord)
-    }
-
-    private fun sleepWithCancel(ms: Long) {
-        var sum: Long = 0
-        while (!interruptedPay) {
-            CommonUtil.doSleep(100)
-            sum += 100
-            if (sum > ms) {
-                break
-            }
-        }
-    }
-
-    private fun showSucInfo() {
-        lastPayBean.code = codeRecord.qrcode
-        lastPayBean.suctime = System.currentTimeMillis()
-        val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
-        info.showtime = pos.getSysPara()!!.sucShowtime
-        info.amount = codeRecord.payamt
-        info.payamt = codeRecord.payamt
-        info.username = codeRecord.username
-        info.cardno = codeRecord.cardno
-        info.transdate = codeRecord.transdate
-        info.transtime = codeRecord.transtime
-        info.payway = codeRecord.transtype
-        info.status = codeRecord.status
-        info.reversalFlag = codeRecord.reversalflag
-        sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
-    }
-
-    private fun getErrorInfo(errmsg: String?): CardUserInfoBean {
-        val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
-        info.showtime = pos.getSysPara()!!.failShowtime
-        info.status = PayStatus.FAIL
-        info.amount = amount
-        info.payamt = amount
-        info.payway = "code"
-        info.transdate = DateUtil.getNowDateNoFormat()
-        info.transtime = DateUtil.getNowTimeNoFormat()
-        return info
-    }
-
-    private fun sendMsg(code: Int, obj: Any) {
-        val msg = Message()
-        msg.what = code
-        msg.obj = obj
-        handler.sendMessage(msg)
-    }
+package com.supwisdom.activities.consume.mode
+
+import android.os.Handler
+import android.os.Message
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.consume.bean.CardPayConfirmRetBean
+import com.supwisdom.activities.consume.bean.CardPayInitRetBean
+import com.supwisdom.activities.consume.bean.CardUserInfoBean
+import com.supwisdom.activities.consume.bean.LastPayBean
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
+import com.supwisdom.entity.TransdtlOnlineRecord
+import com.supwisdom.exception.CardPayFailError
+import com.supwisdom.okhttp.TransResp
+import com.supwisdom.utils.*
+import org.apache.http.HttpStatus
+
+/**
+ ** create by zzq on 2019/7/30
+ ** @desc 二维码消费
+ **/
+class CodePayService constructor(private val handler: Handler) {
+    private val TAG = "CodePayService"
+    private val pos = SPApplication.getInstance().getPos()
+    private lateinit var codeRecord: TransdtlOnlineRecord
+    private val consumeApi = ConsumeApi()
+
+    /**
+     * 消费过程中可按键主动取消
+     * 手动取消后不冲正,以手机消费结果为准
+     */
+    @Volatile
+    private var interruptedPay: Boolean = false
+
+    @Volatile
+    private var amount = 0
+    var isFixMode = false
+    private val lastPayBean = LastPayBean()
+
+    fun interruptPay() {
+        interruptedPay = true
+    }
+
+    fun pay(code: String, amount: Int) {
+        this.amount = amount
+        interruptedPay = false
+        try {
+            if (isFixMode) {
+                if (lastPayBean.code == code) {
+                    val gap = (pos.getSysPara()?.fixpayGap ?: 10).toLong()
+                    if (System.currentTimeMillis() - lastPayBean.suctime < gap * 1000) {
+                        throw CardPayFailError("${gap}s内不能连续消费")
+                    }
+                }
+            }
+            initTransdtlOnline(code, amount)
+            var resp = consumeApi.payInit(codeRecord)
+            parseInitResult(resp)
+            resp = consumeApi.payConfirm(codeRecord)
+            var result = parseConfirmResult(resp)
+            if (!result) {
+                result = payResultQuery()
+                updateTransdtlOnlineHalfBreak(result)
+            } else {
+                updateTransdtlOnline(result)
+            }
+            if (result) {
+                showSucInfo()
+            }
+        } catch (ex: CardPayFailError) {
+            sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo(ex.message))
+        }
+    }
+
+    private fun payResultQuery(): Boolean {
+        sendMsg(PublicDef.MSG_PAYING_QUERY, "谨慎操作查询取消")
+        LogUtil.d(TAG, "扫码消费确认超时,进行查询操作:billno=${codeRecord.billno}")
+        sleepWithCancel(1500)
+        var searchCnt = 1
+        while (!interruptedPay) {
+            sendMsg(PublicDef.MSG_CARD_PAYING, String.format("正在%d次查询...", searchCnt))
+            val resp = consumeApi.payQuery(codeRecord)
+            if (resp != null) {
+                val result = parseConfirmResult(resp)
+                if (!result) {
+                    searchCnt++
+                    sendMsg(PublicDef.MSG_CARD_PAYING, String.format("等待%d次查询...", searchCnt))
+                    sleepWithCancel(3000)
+                    continue
+                }
+                return result
+            } else {
+                searchCnt++
+                sendMsg(PublicDef.MSG_CARD_PAYING, String.format("等待%d次查询...", searchCnt))
+                sleepWithCancel(3000)
+            }
+        }
+        LogUtil.d(TAG, "扫码消费确认超时,操作员手工取消查询:billno=${codeRecord.billno}")
+        return false
+    }
+
+    private fun parseConfirmResult(resp: TransResp?): Boolean {
+        if (resp == null) {
+            SPApplication.getInstance().setEpayLinking(false)
+            return false
+        }
+        if (resp.retcode != HttpStatus.SC_OK) {
+            throw CardPayFailError("错误码=${resp.retcode}")
+        }
+        val retBean = try {
+            GsonUtil.GsonToBean(resp.retjson!!, CardPayConfirmRetBean::class.java)
+        } catch (ex: Exception) {
+            throw CardPayFailError("json异常:${ex.message}")
+        }
+        if (retBean.retcode != PublicDef.SUCCESS) {
+            throw CardPayFailError(retBean.getErrorMsg())
+        }
+        if (retBean.require_query) {
+            // 等待查询
+            return false
+        }
+        codeRecord.payamt = retBean.amount
+        codeRecord.extraamt = retBean.extraamt
+        return true
+    }
+
+    private fun parseInitResult(resp: TransResp?): Boolean {
+        if (resp == null) {
+            SPApplication.getInstance().setEpayLinking(false)
+            throw CardPayFailError("请求超时")
+        }
+        if (resp.retcode != HttpStatus.SC_OK) {
+            throw CardPayFailError("错误码=${resp.retcode}")
+        }
+        val retBean = try {
+            GsonUtil.GsonToBean(resp.retjson!!, CardPayInitRetBean::class.java)
+        } catch (ex: Exception) {
+            throw CardPayFailError("json异常:${ex.message}")
+        }
+        if (retBean.retcode != PublicDef.SUCCESS) {
+            throw CardPayFailError(retBean.getErrorMsg())
+        }
+        codeRecord.billno = retBean.billno
+        codeRecord.username = retBean.username
+        return true
+    }
+
+    private fun initTransdtlOnline(code: String, amount: Int) {
+        codeRecord = TransdtlOnlineRecord()
+        var seqno = pos.getTransdtlOnlineMaxSeqno()
+        if (seqno == 0) {
+            seqno = pos.getDynamicPara()?.onlineseqno ?: 0
+        }
+        codeRecord.devphyid = pos.getConfigPara()!!.devphyid
+        codeRecord.transdate = DateUtil.getNowDateNoFormat()
+        codeRecord.transtime = DateUtil.getNowTimeNoFormat()
+        codeRecord.devseqno = seqno + 1
+        codeRecord.qrcode = code
+        codeRecord.payamt = amount
+        codeRecord.reversalflag = ReversalFlag.NONE
+        codeRecord.extraamt = 0
+        codeRecord.transtype = "code"
+        codeRecord.status = PayStatus.INIT
+        codeRecord.upflag = 1
+        if (!pos.saveTransdtlOnline(codeRecord)) {
+            throw CardPayFailError("保存流水失败")
+        }
+    }
+
+    private fun updateTransdtlOnline(issuccess: Boolean) {
+        if (issuccess) {
+            codeRecord.status = PayStatus.SUC
+        } else {
+            codeRecord.status = PayStatus.FAIL
+        }
+        codeRecord.upflag = 1
+        pos.updateTransdtlOnline(codeRecord)
+    }
+
+    private fun updateTransdtlOnlineHalfBreak(issuccess: Boolean) {
+        if (issuccess) {
+            codeRecord.status = PayStatus.SUC
+        } else {
+            codeRecord.status = PayStatus.UNCONFIRM
+        }
+        codeRecord.upflag = 1
+        pos.updateTransdtlOnline(codeRecord)
+    }
+
+    private fun sleepWithCancel(ms: Long) {
+        var sum: Long = 0
+        while (!interruptedPay) {
+            CommonUtil.doSleep(100)
+            sum += 100
+            if (sum > ms) {
+                break
+            }
+        }
+    }
+
+    private fun showSucInfo() {
+        lastPayBean.code = codeRecord.qrcode
+        lastPayBean.suctime = System.currentTimeMillis()
+        val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
+        info.showtime = pos.getSysPara()!!.sucShowtime
+        info.amount = codeRecord.payamt
+        info.payamt = codeRecord.payamt
+        info.username = codeRecord.username
+        info.cardno = codeRecord.cardno
+        info.transdate = codeRecord.transdate
+        info.transtime = codeRecord.transtime
+        info.payway = codeRecord.transtype
+        info.status = codeRecord.status
+        info.reversalFlag = codeRecord.reversalflag
+        sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
+    }
+
+    private fun getErrorInfo(errmsg: String?): CardUserInfoBean {
+        val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
+        info.showtime = pos.getSysPara()!!.failShowtime
+        info.status = PayStatus.FAIL
+        info.amount = amount
+        info.payamt = amount
+        info.payway = "code"
+        info.transdate = DateUtil.getNowDateNoFormat()
+        info.transtime = DateUtil.getNowTimeNoFormat()
+        return info
+    }
+
+    private fun sendMsg(code: Int, obj: Any) {
+        val msg = Message()
+        msg.what = code
+        msg.obj = obj
+        handler.sendMessage(msg)
+    }
 }
\ No newline at end of file
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 7ce5604..3accf97 100644
--- a/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/consumeMode/ConsumeModeActivity.kt
@@ -1,554 +1,554 @@
-package com.supwisdom.activities.consumeMode
-
-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.*
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.consume.PayMode
-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
-import com.supwisdom.view.SWToast
-import java.util.*
-import kotlin.collections.ArrayList
-
-/**
- ** create by zzq on 2019/7/26
- ** @desc
- **/
-class ConsumeModeActivity : BaseActivity() {
-    private lateinit var vPayamt: TextView
-    private lateinit var vSpecialDesc: TextView
-    private lateinit var rbHotkeyMode: RadioButton
-    private lateinit var rbPeriodMode: RadioButton
-    private lateinit var rbNormalMode: RadioButton
-    private lateinit var rbFixMode: RadioButton
-    private lateinit var llSpecialList: LinearLayout
-    private lateinit var llFixMode: LinearLayout
-    private lateinit var llSpecialMode: LinearLayout
-    private val pos = SPApplication.getInstance().getPos()
-    private var keyActive = true
-    private var shoppwdPass = false
-    private var specialMode = false
-    private var tmpPwd = ""
-    private var configMode = ConfigMode.NORMAL_FIX
-    private val MAX_CHILD_COUNT = 6
-
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        this.setContentView(R.layout.activity_consume_mode)
-        initView()
-        initData()
-    }
-
-    private fun initData() {
-
-    }
-
-    private fun initView() {
-        vPayamt = findViewById<TextView>(R.id.tv_consume_mode_payamt)
-        llSpecialList = findViewById<LinearLayout>(R.id.ll_special_list)
-        this.findViewById<TextView>(R.id.tv_hot_add).setOnClickListener {
-            if (!shoppwdPass) {
-                return@setOnClickListener
-            }
-            if (llSpecialList.childCount >= MAX_CHILD_COUNT) {
-                SWToast.show(
-                    applicationContext,
-                    "最大支持${MAX_CHILD_COUNT}条规则",
-                    PublicDef.TOAST_SHOW_DOUBT
-                )
-                return@setOnClickListener
-            }
-            if (configMode == ConfigMode.PERIOD_FIX) {
-                addPeriodFixRule()
-            } else if (configMode == ConfigMode.HOT_KEY) {
-                addHotkeyRule()
-            }
-        }
-        this.findViewById<TextView>(R.id.tv_save).setOnClickListener {
-            if (!shoppwdPass) {
-                return@setOnClickListener
-            }
-            when (configMode) {
-                ConfigMode.PERIOD_FIX -> {
-                    if (llSpecialList.childCount == 0) {
-                        SWToast.show(applicationContext, "请先添加波段规则", PublicDef.TOAST_SHOW_DOUBT)
-                        return@setOnClickListener
-                    }
-                    if (!savePeriodFixRule()) {
-                        return@setOnClickListener
-                    }
-                }
-                ConfigMode.HOT_KEY -> {
-                    if (llSpecialList.childCount == 0) {
-                        SWToast.show(applicationContext, "请先添加热键规则", PublicDef.TOAST_SHOW_DOUBT)
-                        return@setOnClickListener
-                    }
-                    if (!saveHotkeyRule()) {
-                        return@setOnClickListener
-                    }
-                }
-                ConfigMode.NORMAL_FIX -> {
-                    pos.replaceControlPara(PublicDef.CONTROL_FIXAMT, getFixAmount())
-                }
-                ConfigMode.NORMAL -> {
-                    pos.replaceControlPara(PublicDef.CONTROL_FIXAMT, PayMode.NORMAL.desc)
-                }
-            }
-            finish()
-        }
-        this.findViewById<TextView>(R.id.tv_return).setOnClickListener {
-            //showCurrentMode(ConfigMode.NORMAL_FIX)
-            //refreshToSetAmount()
-            finish()
-        }
-        this.findViewById<RadioGroup>(R.id.rg_special_mode)
-            .setOnCheckedChangeListener { _, checkedId ->
-                if (!shoppwdPass) {
-                    return@setOnCheckedChangeListener
-                }
-                when (checkedId) {
-                    R.id.rb_normal -> showCurrentMode(ConfigMode.NORMAL)
-                    R.id.rb_normal_fix -> showCurrentMode(ConfigMode.NORMAL_FIX)
-                    R.id.rb_hot_mode -> showCurrentMode(ConfigMode.HOT_KEY)
-                    R.id.rb_period_fix_mode -> showCurrentMode(ConfigMode.PERIOD_FIX)
-                }
-            }
-        rbNormalMode = this.findViewById<RadioButton>(R.id.rb_normal)
-        rbFixMode = this.findViewById<RadioButton>(R.id.rb_normal_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 {
-                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}"
-            val amt = item.findViewById<TextView>(R.id.tv_hot_amount)
-            amt.text = String.format("%.02f", it.amount / 100.0f)
-            llSpecialList.addView(item)
-        }
-    }
-
-    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) {
-            if (!keyActive) {
-                return super.dispatchKeyEvent(event)
-            }
-            resetCounter(200)
-            if (shoppwdPass) {
-                setFixAmount(event.keyCode)
-            } else {
-                checkShopPwd(event.keyCode)
-            }
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
-    override fun onResume() {
-        super.onResume()
-        shoppwdPass = false
-        keyActive = true
-        showCurrentMode(ConfigMode.NORMAL_FIX)
-        refreshToCheckPasswd()
-    }
-
-    private fun showCurrentMode(mode: ConfigMode) {
-        configMode = mode
-        when (mode) {
-            ConfigMode.HOT_KEY -> {
-                specialMode = true
-                rbHotkeyMode.isChecked = true
-                llFixMode.visibility = View.GONE
-                llSpecialMode.visibility = View.VISIBLE
-                vSpecialDesc.text = "设置快捷按键(单位:元)"
-                loadHotkeyRule()
-            }
-            ConfigMode.PERIOD_FIX -> {
-                specialMode = true
-                rbPeriodMode.isChecked = true
-                llFixMode.visibility = View.GONE
-                llSpecialMode.visibility = View.VISIBLE
-                vSpecialDesc.text = "设置波段定额(单位:元)"
-                loadPeriodFixRule()
-            }
-            ConfigMode.NORMAL_FIX -> {
-                specialMode = false
-                rbFixMode.isChecked = true
-                llSpecialMode.visibility = View.GONE
-                llFixMode.visibility = View.VISIBLE
-            }
-            else -> {
-                rbNormalMode.isChecked = true
-                llSpecialMode.visibility = View.GONE
-                llFixMode.visibility = View.VISIBLE
-                specialMode = false
-            }
-        }
-    }
-
-    private fun checkShopPwd(keyCode: Int) {
-        when (keyCode) {
-            KeyEvent.KEYCODE_0,
-            KeyEvent.KEYCODE_1,
-            KeyEvent.KEYCODE_2,
-            KeyEvent.KEYCODE_3,
-            KeyEvent.KEYCODE_4,
-            KeyEvent.KEYCODE_5,
-            KeyEvent.KEYCODE_6,
-            KeyEvent.KEYCODE_7,
-            KeyEvent.KEYCODE_8,
-            KeyEvent.KEYCODE_9 -> {
-                tmpPwd += keyCode - KeyEvent.KEYCODE_0
-                if (tmpPwd.length >= 6) {
-                    if (checkShoPwdValid(tmpPwd)) {
-                        shoppwdPass = true
-                        refreshToSetAmount()
-                    } else {
-                        AuxScreenController.getInstance()
-                            .refreshContent(Arrays.asList<String>("请输入商户密码:", "密码错误"))
-                    }
-                    tmpPwd = ""
-                } else {
-                    AuxScreenController.getInstance()
-                        .refreshContent(
-                            Arrays.asList(
-                                "请输入商户密码:",
-                                CommonUtil.getPasswordStar(tmpPwd.length)
-                            )
-                        )
-                }
-            }
-            KeyEvent.KEYCODE_DEL -> {
-                //cancel
-                val len = tmpPwd.length
-                when {
-                    len == 1 -> {
-                        tmpPwd = ""
-                        AuxScreenController.getInstance()
-                            .refreshContent(
-                                Arrays.asList(
-                                    "请输入商户密码:",
-                                    CommonUtil.getPasswordStar(tmpPwd.length)
-                                )
-                            )
-                    }
-                    len > 1 -> {
-                        tmpPwd = tmpPwd.substring(0, len - 1)
-                        AuxScreenController.getInstance()
-                            .refreshContent(
-                                Arrays.asList(
-                                    "请输入商户密码:",
-                                    CommonUtil.getPasswordStar(tmpPwd.length)
-                                )
-                            )
-                    }
-                    else -> finish()
-                }
-            }
-        }
-    }
-
-    private fun checkShoPwdValid(inputPwd: String): Boolean {
-        return inputPwd == pos.getConfigPara()!!.shopPwd
-    }
-
-    private fun setFixAmount(keyCode: Int) {
-        if (specialMode) {
-            AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请到大屏设置"))
-            return
-        }
-        when (keyCode) {
-            KeyEvent.KEYCODE_0,
-            KeyEvent.KEYCODE_1,
-            KeyEvent.KEYCODE_2,
-            KeyEvent.KEYCODE_3,
-            KeyEvent.KEYCODE_4,
-            KeyEvent.KEYCODE_5,
-            KeyEvent.KEYCODE_6,
-            KeyEvent.KEYCODE_7,
-            KeyEvent.KEYCODE_8,
-            KeyEvent.KEYCODE_9 -> addValueToEdit(keyCode - KeyEvent.KEYCODE_0)
-            KeyEvent.KEYCODE_DEL -> delValueToEdit()
-            KeyEvent.KEYCODE_POUND,
-            KeyEvent.KEYCODE_PERIOD -> addDotToEdit()
-            KeyEvent.KEYCODE_ENTER -> {
-                pos.replaceControlPara(PublicDef.CONTROL_FIXAMT, getFixAmount())
-//                jumpActivity(MenuActivity::class.java)
-                finish()
-            }
-            KeyEvent.KEYCODE_DPAD_LEFT -> {
-                //F1
-                showCurrentMode(ConfigMode.HOT_KEY)
-                AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请到大屏设置"))
-            }
-        }
-    }
-
-    private fun refreshToCheckPasswd() {
-        AuxScreenController.getInstance().refreshTitle("消费模式设置")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
-        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请输入商户密码:", " "))
-    }
-
-    private fun refreshToSetAmount() {
-        vPayamt.text = PayMode.NORMAL.desc
-        pos.getControlPara(PublicDef.CONTROL_FIXAMT)?.also {
-            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
-                }
-                PayMode.NORMAL.desc == it.paraval -> {
-
-                }
-            }
-        } ?: screenShowAmt()
-    }
-
-    private fun getFixAmount(): String {
-        try {
-            return Integer.toString(CommonUtil.YuanToFen(java.lang.Double.parseDouble(vPayamt.text.toString())))
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
-        return PayMode.NORMAL.desc
-    }
-
-    private fun addValueToEdit(value: Int) {
-        var str = vPayamt.text.toString()
-        if ("0" == str || PayMode.NORMAL.desc == str) {
-            str = ""
-        }
-        //如果已经有小数点，则小数点后面不能超过两位
-        if (str.indexOf(".") > 0) {
-            if (str.length - str.indexOf(".") <= 2) {
-                vPayamt.text = "$str$value"
-            } else {
-                vPayamt.text = value.toString()
-            }
-        } else {
-            //限制消费金额<1000
-            if (str.length < 3) {
-                vPayamt.text = "$str$value"
-            }
-        }
-        screenShowAmt()
-    }
-
-    private fun delValueToEdit() {
-        val str = vPayamt.text.toString()
-        if (PayMode.NORMAL.desc != str) {
-            if (str.length <= 1) {
-                vPayamt.text = PayMode.NORMAL.desc
-            } else {
-                vPayamt.text = str.substring(0, str.length - 1)
-            }
-        }
-        screenShowAmt()
-    }
-
-    private fun addDotToEdit() {
-        val str = vPayamt.text.toString()
-        if (PayMode.NORMAL.desc == str) {
-            vPayamt.text = "0."
-        } else {
-            if (str.length < 8 && str.indexOf('.') < 0) {
-                vPayamt.text = "$str."
-            }
-        }
-        screenShowAmt()
-    }
-
-    private fun screenShowAmt() {
-        AuxScreenController.getInstance().refreshTitle("消费模式设置       F1-特殊模式")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
-        AuxScreenController.getInstance().refreshContent(
-            Arrays.asList<String>(
-                PayMode.NORMAL.desc + "-普通消费",
-                "值-定额消费(元)",
-                String.format("金额:%s", vPayamt.text.toString())
-            )
-        )
-    }
-
-    private var counter: ContinuePressTimer? = null
-
-    private fun resetCounter(timems: Long) {
-        counter?.cancel()
-        if (counter == null) {
-            counter = ContinuePressTimer(timems, 100)
-        }
-        keyActive = false
-        counter!!.start()
-    }
-
-    private inner class ContinuePressTimer internal constructor(
-        millisInFuture: Long,
-        countDownInterval: Long
-    ) :
-        CountDownTimer(millisInFuture, countDownInterval) {
-
-        override fun onTick(millisUntilFinished: Long) {
-
-        }
-
-        override fun onFinish() {
-            keyActive = true
-        }
-    }
-}
-
-enum class ConfigMode {
-    NORMAL,
-    NORMAL_FIX,
-    HOT_KEY,
-    PERIOD_FIX,
+package com.supwisdom.activities.consumeMode
+
+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.*
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.consume.PayMode
+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
+import com.supwisdom.view.SWToast
+import java.util.*
+import kotlin.collections.ArrayList
+
+/**
+ ** create by zzq on 2019/7/26
+ ** @desc
+ **/
+class ConsumeModeActivity : BaseActivity() {
+    private lateinit var vPayamt: TextView
+    private lateinit var vSpecialDesc: TextView
+    private lateinit var rbHotkeyMode: RadioButton
+    private lateinit var rbPeriodMode: RadioButton
+    private lateinit var rbNormalMode: RadioButton
+    private lateinit var rbFixMode: RadioButton
+    private lateinit var llSpecialList: LinearLayout
+    private lateinit var llFixMode: LinearLayout
+    private lateinit var llSpecialMode: LinearLayout
+    private val pos = SPApplication.getInstance().getPos()
+    private var keyActive = true
+    private var shoppwdPass = false
+    private var specialMode = false
+    private var tmpPwd = ""
+    private var configMode = ConfigMode.NORMAL_FIX
+    private val MAX_CHILD_COUNT = 6
+
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        this.setContentView(R.layout.activity_consume_mode)
+        initView()
+        initData()
+    }
+
+    private fun initData() {
+
+    }
+
+    private fun initView() {
+        vPayamt = findViewById<TextView>(R.id.tv_consume_mode_payamt)
+        llSpecialList = findViewById<LinearLayout>(R.id.ll_special_list)
+        this.findViewById<TextView>(R.id.tv_hot_add).setOnClickListener {
+            if (!shoppwdPass) {
+                return@setOnClickListener
+            }
+            if (llSpecialList.childCount >= MAX_CHILD_COUNT) {
+                SWToast.show(
+                    applicationContext,
+                    "最大支持${MAX_CHILD_COUNT}条规则",
+                    PublicDef.TOAST_SHOW_DOUBT
+                )
+                return@setOnClickListener
+            }
+            if (configMode == ConfigMode.PERIOD_FIX) {
+                addPeriodFixRule()
+            } else if (configMode == ConfigMode.HOT_KEY) {
+                addHotkeyRule()
+            }
+        }
+        this.findViewById<TextView>(R.id.tv_save).setOnClickListener {
+            if (!shoppwdPass) {
+                return@setOnClickListener
+            }
+            when (configMode) {
+                ConfigMode.PERIOD_FIX -> {
+                    if (llSpecialList.childCount == 0) {
+                        SWToast.show(applicationContext, "请先添加波段规则", PublicDef.TOAST_SHOW_DOUBT)
+                        return@setOnClickListener
+                    }
+                    if (!savePeriodFixRule()) {
+                        return@setOnClickListener
+                    }
+                }
+                ConfigMode.HOT_KEY -> {
+                    if (llSpecialList.childCount == 0) {
+                        SWToast.show(applicationContext, "请先添加热键规则", PublicDef.TOAST_SHOW_DOUBT)
+                        return@setOnClickListener
+                    }
+                    if (!saveHotkeyRule()) {
+                        return@setOnClickListener
+                    }
+                }
+                ConfigMode.NORMAL_FIX -> {
+                    pos.replaceControlPara(PublicDef.CONTROL_FIXAMT, getFixAmount())
+                }
+                ConfigMode.NORMAL -> {
+                    pos.replaceControlPara(PublicDef.CONTROL_FIXAMT, PayMode.NORMAL.desc)
+                }
+            }
+            finish()
+        }
+        this.findViewById<TextView>(R.id.tv_return).setOnClickListener {
+            //showCurrentMode(ConfigMode.NORMAL_FIX)
+            //refreshToSetAmount()
+            finish()
+        }
+        this.findViewById<RadioGroup>(R.id.rg_special_mode)
+            .setOnCheckedChangeListener { _, checkedId ->
+                if (!shoppwdPass) {
+                    return@setOnCheckedChangeListener
+                }
+                when (checkedId) {
+                    R.id.rb_normal -> showCurrentMode(ConfigMode.NORMAL)
+                    R.id.rb_normal_fix -> showCurrentMode(ConfigMode.NORMAL_FIX)
+                    R.id.rb_hot_mode -> showCurrentMode(ConfigMode.HOT_KEY)
+                    R.id.rb_period_fix_mode -> showCurrentMode(ConfigMode.PERIOD_FIX)
+                }
+            }
+        rbNormalMode = this.findViewById<RadioButton>(R.id.rb_normal)
+        rbFixMode = this.findViewById<RadioButton>(R.id.rb_normal_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 {
+                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}"
+            val amt = item.findViewById<TextView>(R.id.tv_hot_amount)
+            amt.text = String.format("%.02f", it.amount / 100.0f)
+            llSpecialList.addView(item)
+        }
+    }
+
+    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) {
+            if (!keyActive) {
+                return super.dispatchKeyEvent(event)
+            }
+            resetCounter(200)
+            if (shoppwdPass) {
+                setFixAmount(event.keyCode)
+            } else {
+                checkShopPwd(event.keyCode)
+            }
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        shoppwdPass = false
+        keyActive = true
+        showCurrentMode(ConfigMode.NORMAL_FIX)
+        refreshToCheckPasswd()
+    }
+
+    private fun showCurrentMode(mode: ConfigMode) {
+        configMode = mode
+        when (mode) {
+            ConfigMode.HOT_KEY -> {
+                specialMode = true
+                rbHotkeyMode.isChecked = true
+                llFixMode.visibility = View.GONE
+                llSpecialMode.visibility = View.VISIBLE
+                vSpecialDesc.text = "设置快捷按键(单位:元)"
+                loadHotkeyRule()
+            }
+            ConfigMode.PERIOD_FIX -> {
+                specialMode = true
+                rbPeriodMode.isChecked = true
+                llFixMode.visibility = View.GONE
+                llSpecialMode.visibility = View.VISIBLE
+                vSpecialDesc.text = "设置波段定额(单位:元)"
+                loadPeriodFixRule()
+            }
+            ConfigMode.NORMAL_FIX -> {
+                specialMode = false
+                rbFixMode.isChecked = true
+                llSpecialMode.visibility = View.GONE
+                llFixMode.visibility = View.VISIBLE
+            }
+            else -> {
+                rbNormalMode.isChecked = true
+                llSpecialMode.visibility = View.GONE
+                llFixMode.visibility = View.VISIBLE
+                specialMode = false
+            }
+        }
+    }
+
+    private fun checkShopPwd(keyCode: Int) {
+        when (keyCode) {
+            KeyEvent.KEYCODE_0,
+            KeyEvent.KEYCODE_1,
+            KeyEvent.KEYCODE_2,
+            KeyEvent.KEYCODE_3,
+            KeyEvent.KEYCODE_4,
+            KeyEvent.KEYCODE_5,
+            KeyEvent.KEYCODE_6,
+            KeyEvent.KEYCODE_7,
+            KeyEvent.KEYCODE_8,
+            KeyEvent.KEYCODE_9 -> {
+                tmpPwd += keyCode - KeyEvent.KEYCODE_0
+                if (tmpPwd.length >= 6) {
+                    if (checkShoPwdValid(tmpPwd)) {
+                        shoppwdPass = true
+                        refreshToSetAmount()
+                    } else {
+                        AuxScreenController.getInstance()
+                            .refreshContent(Arrays.asList<String>("请输入商户密码:", "密码错误"))
+                    }
+                    tmpPwd = ""
+                } else {
+                    AuxScreenController.getInstance()
+                        .refreshContent(
+                            Arrays.asList(
+                                "请输入商户密码:",
+                                CommonUtil.getPasswordStar(tmpPwd.length)
+                            )
+                        )
+                }
+            }
+            KeyEvent.KEYCODE_DEL -> {
+                //cancel
+                val len = tmpPwd.length
+                when {
+                    len == 1 -> {
+                        tmpPwd = ""
+                        AuxScreenController.getInstance()
+                            .refreshContent(
+                                Arrays.asList(
+                                    "请输入商户密码:",
+                                    CommonUtil.getPasswordStar(tmpPwd.length)
+                                )
+                            )
+                    }
+                    len > 1 -> {
+                        tmpPwd = tmpPwd.substring(0, len - 1)
+                        AuxScreenController.getInstance()
+                            .refreshContent(
+                                Arrays.asList(
+                                    "请输入商户密码:",
+                                    CommonUtil.getPasswordStar(tmpPwd.length)
+                                )
+                            )
+                    }
+                    else -> finish()
+                }
+            }
+        }
+    }
+
+    private fun checkShoPwdValid(inputPwd: String): Boolean {
+        return inputPwd == pos.getConfigPara()!!.shopPwd
+    }
+
+    private fun setFixAmount(keyCode: Int) {
+        if (specialMode) {
+            AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请到大屏设置"))
+            return
+        }
+        when (keyCode) {
+            KeyEvent.KEYCODE_0,
+            KeyEvent.KEYCODE_1,
+            KeyEvent.KEYCODE_2,
+            KeyEvent.KEYCODE_3,
+            KeyEvent.KEYCODE_4,
+            KeyEvent.KEYCODE_5,
+            KeyEvent.KEYCODE_6,
+            KeyEvent.KEYCODE_7,
+            KeyEvent.KEYCODE_8,
+            KeyEvent.KEYCODE_9 -> addValueToEdit(keyCode - KeyEvent.KEYCODE_0)
+            KeyEvent.KEYCODE_DEL -> delValueToEdit()
+            KeyEvent.KEYCODE_POUND,
+            KeyEvent.KEYCODE_PERIOD -> addDotToEdit()
+            KeyEvent.KEYCODE_ENTER -> {
+                pos.replaceControlPara(PublicDef.CONTROL_FIXAMT, getFixAmount())
+//                jumpActivity(MenuActivity::class.java)
+                finish()
+            }
+            KeyEvent.KEYCODE_DPAD_LEFT -> {
+                //F1
+                showCurrentMode(ConfigMode.HOT_KEY)
+                AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请到大屏设置"))
+            }
+        }
+    }
+
+    private fun refreshToCheckPasswd() {
+        AuxScreenController.getInstance().refreshTitle("消费模式设置")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("请输入商户密码:", " "))
+    }
+
+    private fun refreshToSetAmount() {
+        vPayamt.text = PayMode.NORMAL.desc
+        pos.getControlPara(PublicDef.CONTROL_FIXAMT)?.also {
+            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
+                }
+                PayMode.NORMAL.desc == it.paraval -> {
+
+                }
+            }
+        } ?: screenShowAmt()
+    }
+
+    private fun getFixAmount(): String {
+        try {
+            return Integer.toString(CommonUtil.YuanToFen(java.lang.Double.parseDouble(vPayamt.text.toString())))
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return PayMode.NORMAL.desc
+    }
+
+    private fun addValueToEdit(value: Int) {
+        var str = vPayamt.text.toString()
+        if ("0" == str || PayMode.NORMAL.desc == str) {
+            str = ""
+        }
+        //如果已经有小数点，则小数点后面不能超过两位
+        if (str.indexOf(".") > 0) {
+            if (str.length - str.indexOf(".") <= 2) {
+                vPayamt.text = "$str$value"
+            } else {
+                vPayamt.text = value.toString()
+            }
+        } else {
+            //限制消费金额<1000
+            if (str.length < 3) {
+                vPayamt.text = "$str$value"
+            }
+        }
+        screenShowAmt()
+    }
+
+    private fun delValueToEdit() {
+        val str = vPayamt.text.toString()
+        if (PayMode.NORMAL.desc != str) {
+            if (str.length <= 1) {
+                vPayamt.text = PayMode.NORMAL.desc
+            } else {
+                vPayamt.text = str.substring(0, str.length - 1)
+            }
+        }
+        screenShowAmt()
+    }
+
+    private fun addDotToEdit() {
+        val str = vPayamt.text.toString()
+        if (PayMode.NORMAL.desc == str) {
+            vPayamt.text = "0."
+        } else {
+            if (str.length < 8 && str.indexOf('.') < 0) {
+                vPayamt.text = "$str."
+            }
+        }
+        screenShowAmt()
+    }
+
+    private fun screenShowAmt() {
+        AuxScreenController.getInstance().refreshTitle("消费模式设置       F1-特殊模式")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
+        AuxScreenController.getInstance().refreshContent(
+            Arrays.asList<String>(
+                PayMode.NORMAL.desc + "-普通消费",
+                "值-定额消费(元)",
+                String.format("金额:%s", vPayamt.text.toString())
+            )
+        )
+    }
+
+    private var counter: ContinuePressTimer? = null
+
+    private fun resetCounter(timems: Long) {
+        counter?.cancel()
+        if (counter == null) {
+            counter = ContinuePressTimer(timems, 100)
+        }
+        keyActive = false
+        counter!!.start()
+    }
+
+    private inner class ContinuePressTimer internal constructor(
+        millisInFuture: Long,
+        countDownInterval: Long
+    ) :
+        CountDownTimer(millisInFuture, countDownInterval) {
+
+        override fun onTick(millisUntilFinished: Long) {
+
+        }
+
+        override fun onFinish() {
+            keyActive = true
+        }
+    }
+}
+
+enum class ConfigMode {
+    NORMAL,
+    NORMAL_FIX,
+    HOT_KEY,
+    PERIOD_FIX,
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/control/ControlActivity.kt b/app/src/main/java/com/supwisdom/activities/control/ControlActivity.kt
index 0ab3436..7d4f566 100644
--- a/app/src/main/java/com/supwisdom/activities/control/ControlActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/control/ControlActivity.kt
@@ -1,118 +1,117 @@
-package com.supwisdom.activities.control
-
-import android.os.Bundle
-import android.view.KeyEvent
-import android.view.View
-import android.widget.RadioButton
-import android.widget.TextView
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.entity.ControlParaRecord
-import com.supwisdom.utils.PublicDef
-import com.supwisdom.view.SWToast
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc
- **/
-class ControlActivity : BaseActivity() {
-    private val pos = SPApplication.getInstance().getPos()
-    private lateinit var vDebugDisable: RadioButton
-    private lateinit var vDebugEnable: RadioButton
-    private lateinit var vOfflineEnable: RadioButton
-    private lateinit var vOfflineDisable: RadioButton
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_control)
-        initView()
-    }
-
-    private fun initData() {
-        var record = pos.getControlPara(PublicDef.CONTROL_OFFLINE_DAY_DISABLE)
-        if (record != null && "1" == record.paraval) {
-            vOfflineDisable.isChecked = true
-        } else {
-            vOfflineEnable.isChecked = true
-        }
-        record = pos.getControlPara(PublicDef.CONTROL_DEBUG_ENABLE)
-        if (record != null && "1" == record.paraval) {
-            vDebugEnable.isChecked = true
-        } else {
-            vDebugDisable.isChecked = true
-        }
-    }
-
-    private fun initView() {
-        vOfflineEnable = this.findViewById<View>(R.id.rb_offline_enable) as RadioButton
-        vOfflineDisable = this.findViewById<View>(R.id.rb_offline_disable) as RadioButton
-        vDebugDisable = this.findViewById<View>(R.id.rb_debug_enable) as RadioButton
-        vDebugEnable = this.findViewById<View>(R.id.rb_debug_disable) as RadioButton
-        val ivBtn = this.findViewById<View>(R.id.btn_cancel) as TextView
-        ivBtn.setOnClickListener { this@ControlActivity.finish() }
-        //确定按钮
-        this.findViewById<TextView>(R.id.btn_save).setOnClickListener {
-            var flag = if (vOfflineDisable.isChecked) {
-                "1"
-            } else {
-                "0"
-            }
-            if (!pos.replaceControlPara(PublicDef.CONTROL_OFFLINE_DAY_DISABLE, flag)) {
-                showSWToastInfo("脱机天数判断保存失败", PublicDef.TOAST_SHOW_CRY)
-                return@setOnClickListener
-            }
-
-            flag = if (vDebugEnable.isChecked) {
-                "1"
-            } else {
-                "0"
-            }
-            if (!pos.replaceControlPara(PublicDef.CONTROL_DEBUG_ENABLE, flag)) {
-                showSWToastInfo("日志调试保存失败", PublicDef.TOAST_SHOW_CRY)
-                return@setOnClickListener
-            }
-            showSWToastInfo("保存成功", PublicDef.TOAST_SHOW_SMILE)
-            this@ControlActivity.finish()
-        }
-
-    }
-
-    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
-        if (event.action == KeyEvent.ACTION_DOWN) {
-            when (event.keyCode) {
-                KeyEvent.KEYCODE_DEL -> {
-                }
-                KeyEvent.KEYCODE_ENTER -> finish()
-            }//cancel
-            //和触屏删除键冲突
-            //                    finish();
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
-    private fun showSWToastInfo(msg: String, showway: Int) {
-        SWToast.show(applicationContext, msg, showway)
-    }
-
-    override fun onResume() {
-        super.onResume()
-        refresh()
-        initData()
-    }
-
-    override fun onStop() {
-        super.onStop()
-    }
-
-    override fun onDestroy() {
-        super.onDestroy()
-    }
-
-    private fun refresh() {
-        AuxScreenController.getInstance().refreshTitle("控制参数设置")
-        AuxScreenController.getInstance().refreshBottom("确定键返回上页")
-        AuxScreenController.getInstance().refreshContent(listOf<String>("请到大屏进行配置"))
-    }
+package com.supwisdom.activities.control
+
+import android.os.Bundle
+import android.view.KeyEvent
+import android.view.View
+import android.widget.RadioButton
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.utils.PublicDef
+import com.supwisdom.view.SWToast
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class ControlActivity : BaseActivity() {
+    private val pos = SPApplication.getInstance().getPos()
+    private lateinit var vDebugDisable: RadioButton
+    private lateinit var vDebugEnable: RadioButton
+    private lateinit var vOfflineEnable: RadioButton
+    private lateinit var vOfflineDisable: RadioButton
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_control)
+        initView()
+    }
+
+    private fun initData() {
+        var record = pos.getControlPara(PublicDef.CONTROL_OFFLINE_DAY_DISABLE)
+        if (record != null && "1" == record.paraval) {
+            vOfflineDisable.isChecked = true
+        } else {
+            vOfflineEnable.isChecked = true
+        }
+        record = pos.getControlPara(PublicDef.CONTROL_DEBUG_ENABLE)
+        if (record != null && "1" == record.paraval) {
+            vDebugEnable.isChecked = true
+        } else {
+            vDebugDisable.isChecked = true
+        }
+    }
+
+    private fun initView() {
+        vOfflineEnable = this.findViewById<View>(R.id.rb_offline_enable) as RadioButton
+        vOfflineDisable = this.findViewById<View>(R.id.rb_offline_disable) as RadioButton
+        vDebugDisable = this.findViewById<View>(R.id.rb_debug_enable) as RadioButton
+        vDebugEnable = this.findViewById<View>(R.id.rb_debug_disable) as RadioButton
+        val ivBtn = this.findViewById<View>(R.id.btn_cancel) as TextView
+        ivBtn.setOnClickListener { this@ControlActivity.finish() }
+        //确定按钮
+        this.findViewById<TextView>(R.id.btn_save).setOnClickListener {
+            var flag = if (vOfflineDisable.isChecked) {
+                "1"
+            } else {
+                "0"
+            }
+            if (!pos.replaceControlPara(PublicDef.CONTROL_OFFLINE_DAY_DISABLE, flag)) {
+                showSWToastInfo("脱机天数判断保存失败", PublicDef.TOAST_SHOW_CRY)
+                return@setOnClickListener
+            }
+
+            flag = if (vDebugEnable.isChecked) {
+                "1"
+            } else {
+                "0"
+            }
+            if (!pos.replaceControlPara(PublicDef.CONTROL_DEBUG_ENABLE, flag)) {
+                showSWToastInfo("日志调试保存失败", PublicDef.TOAST_SHOW_CRY)
+                return@setOnClickListener
+            }
+            showSWToastInfo("保存成功", PublicDef.TOAST_SHOW_SMILE)
+            this@ControlActivity.finish()
+        }
+
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            when (event.keyCode) {
+                KeyEvent.KEYCODE_DEL -> {
+                }
+                KeyEvent.KEYCODE_ENTER -> finish()
+            }//cancel
+            //和触屏删除键冲突
+            //                    finish();
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    private fun showSWToastInfo(msg: String, showway: Int) {
+        SWToast.show(applicationContext, msg, showway)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        refresh()
+        initData()
+    }
+
+    override fun onStop() {
+        super.onStop()
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+
+    private fun refresh() {
+        AuxScreenController.getInstance().refreshTitle("控制参数设置")
+        AuxScreenController.getInstance().refreshBottom("确定键返回上页")
+        AuxScreenController.getInstance().refreshContent(listOf<String>("请到大屏进行配置"))
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt b/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt
index 1c83abd..79845f9 100644
--- a/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt
@@ -1,245 +1,237 @@
-package com.supwisdom.activities.init
-
-import android.app.Activity
-import android.net.nsd.NsdServiceInfo
-import android.os.Bundle
-import android.support.v7.widget.LinearLayoutManager
-import android.support.v7.widget.RecyclerView
-import android.widget.Button
-import android.widget.EditText
-import android.widget.RadioButton
-import android.widget.TextView
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.init.adapter.NsdServerConfigAdapter
-import com.supwisdom.activities.init.mode.NsdClient
-import com.supwisdom.activities.init.mode.NsdClientApi
-import com.supwisdom.activities.load.LoadActivity
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.entity.ConfigParaRecord
-import com.supwisdom.service.NtpClient
-import com.supwisdom.utils.CommonUtil
-import com.supwisdom.utils.DateUtil
-import com.supwisdom.utils.PublicDef
-import com.supwisdom.utils.ThreadPool
-import com.supwisdom.view.BigSwDialog
-import com.supwisdom.view.SWToast
-import java.util.*
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-@Suppress("DEPRECATION")
-class InitActivity : BaseActivity(), IInitView {
-    private lateinit var presenter: InitPresenter
-    private lateinit var vDevphyid: EditText
-    private lateinit var vTenantId: EditText
-    private lateinit var vServerIp: EditText
-    private lateinit var vUri: EditText
-    private lateinit var vPort: EditText
-    private lateinit var vNsdResult: TextView
-    private lateinit var vRadioPayMode: RadioButton
-    private lateinit var vRadioDepositMode: RadioButton
-    private lateinit var vRadioThirdPayMode: RadioButton
-    private lateinit var vRadioThirdLoginMode: RadioButton
-    private var nsdClient: NsdClient? = null
-    private var nsdServiceIp: String? = null
-    private var nsdServicePort: Int = 0
-    private var dialogNsdConfig: BigSwDialog? = null
-    private var nsdConfigAdapter: NsdServerConfigAdapter? = null
-    private val pos = SPApplication.getInstance().getPos()
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_init)
-        initView()
-        initData()
-    }
-
-    private fun initData() {
-        presenter = InitPresenter(this)
-        var record = pos.getConfigPara()
-        if (record == null) {
-            record = ConfigParaRecord()
-            record.mode = 0
-            record.tenantId = "schema"
-            record.devphyid = "12345678"
-            record.epayIP = "127.0.0.1"
-            record.epayPort = 8080
-            record.epayUri = "restaurant"
-        }
-        record.initOK = false
-        pos.replaceConfigPara(record)
-        val cfgRecord = pos.getConfigPara()
-
-//        when {
-//            cfgRecord.mode == PublicDef.TERMINAL_DEPOSIT_MODE -> vRadioDepositMode.isChecked = true
-//            cfgRecord.mode == PublicDef.TERMINAL_THIRD_PAY_MODE -> vRadioThirdPayMode.isChecked = true
-//            cfgRecord.mode == PublicDef.TERMINAL_GATE_MODE -> vRadioGateMode.isChecked = true
-//            cfgRecord.mode == PublicDef.TERMINAL_THIRD_LOGIN_MODE -> vRadioThirdLoginMode.isChecked = true
-//            else -> vRadioPayMode.isChecked = true
-//        }
-        vTenantId.setText(cfgRecord!!.tenantId)
-        vDevphyid.setText(cfgRecord.devphyid)
-        vServerIp.setText(cfgRecord.epayIP)
-        vUri.setText(cfgRecord.epayUri)
-        vPort.setText(cfgRecord.epayPort.toString())
-
-        nsdClient = NsdClient(this, "epay-reg-server", object : NsdClient.IServerFound {
-            override fun onServerFound(serviceInfo: NsdServiceInfo) {
-                nsdServiceIp = serviceInfo.host?.hostAddress
-                nsdServicePort = serviceInfo.port
-                if (nsdServiceIp != null) {
-                    asyncGetConfigName()
-                }
-            }
-
-            override fun onServerFail() {
-
-            }
-        })
-    }
-
-    private fun initView() {
-        this.findViewById<Button>(R.id.tv_settings).setOnClickListener {
-            CommonUtil.startNetSetting(this@InitActivity)
-        }
-        this.findViewById<TextView>(R.id.btn_save).setOnClickListener {
-            presenter.saveConfigParam(
-                0,
-                CommonUtil.getEditView(vTenantId),
-                CommonUtil.getEditView(vDevphyid), CommonUtil.getEditView(vServerIp),
-                CommonUtil.getEditView(vUri), CommonUtil.getEditView(vPort)
-            )
-        }
-        this.findViewById<Button>(R.id.tv_nsd_query).setOnClickListener {
-            if (nsdServiceIp == null) {
-                showSWToastInfo("nsd未连接", PublicDef.TOAST_SHOW_DOUBT)
-                return@setOnClickListener
-            }
-            asyncGetConfigName()
-        }
-        vNsdResult = this.findViewById(R.id.tv_nsd_result) as TextView
-        vRadioPayMode = this.findViewById(R.id.rb_pay_mode) as RadioButton
-        vRadioDepositMode = this.findViewById(R.id.rb_deposit_mode) as RadioButton
-        vRadioThirdPayMode = this.findViewById(R.id.rb_third_pay_mode) as RadioButton
-        vRadioThirdLoginMode = this.findViewById(R.id.rb_third_login_mode) as RadioButton
-        vTenantId = this.findViewById(R.id.tv_tenantid) as EditText
-        vDevphyid = this.findViewById(R.id.tv_devphyid) as EditText
-        vServerIp = this.findViewById(R.id.tv_server_ip) as EditText
-        vUri = this.findViewById(R.id.tv_uri_root) as EditText
-        vPort = this.findViewById(R.id.tv_server_port) as EditText
-    }
-
-    override fun onResume() {
-        super.onResume()
-        nsdClient!!.start()
-        refresh()
-    }
-
-    override fun onStop() {
-        super.onStop()
-        nsdClient!!.stop()
-    }
-
-    private fun refresh() {
-        AuxScreenController.getInstance().refreshTitle("通讯参数设置")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
-        AuxScreenController.getInstance()
-            .refreshContent(Arrays.asList("设备第一次使用", "请联系管理员", "在大屏配置参数"))
-    }
-
-    private fun asyncGetConfigName() {
-        ThreadPool.getShortPool().execute(Runnable {
-            try {
-                val ret = NsdClientApi(nsdServiceIp!!, nsdServicePort).getNsdServerConfigList()
-                runOnUiThread {
-                    vNsdResult.text = ret.retmsg
-                    if (ret.retcode == PublicDef.SUCCESS) {
-                        if (ret.list!!.isEmpty()) {
-                            vNsdResult.text = "未找到配置项"
-                            return@runOnUiThread
-                        } else if (ret.list!!.size == 1) {
-                            asyncGetConfigFromNsdServer(ret.list!![0])
-                            return@runOnUiThread
-                        }
-                        vNsdResult.setTextColor(resources.getColor(R.color.light_blue2))
-                        if (dialogNsdConfig == null) {
-                            dialogNsdConfig = BigSwDialog(this, PublicDef.DIALOG_TYPE_NSD_CONFIG)
-                            val vConfigList =
-                                dialogNsdConfig!!.findViewById(R.id.rv_config_list) as RecyclerView
-                            vConfigList.layoutManager = LinearLayoutManager(this)
-                            vConfigList.addItemDecoration(NsdServerConfigAdapter.ItemDecoration(10))
-                            nsdConfigAdapter =
-                                NsdServerConfigAdapter(
-                                    this,
-                                    object : NsdServerConfigAdapter.ConfigNameListener {
-                                        override fun callback(configName: String) {
-                                            asyncGetConfigFromNsdServer(configName)
-                                            dialogNsdConfig!!.dismiss()
-                                        }
-                                    })
-                            vConfigList.adapter = nsdConfigAdapter
-                        }
-                        nsdConfigAdapter!!.setList(ret.list)
-                        nsdConfigAdapter!!.notifyDataSetChanged()
-                        dialogNsdConfig!!.show()
-                    } else {
-                        vNsdResult.setTextColor(resources.getColor(R.color.cl_red))
-                    }
-                }
-            } catch (ex: Exception) {
-                runOnUiThread {
-                    vNsdResult.text = "异常:${ex.message}"
-                    vNsdResult.setTextColor(resources.getColor(R.color.cl_red))
-                }
-            }
-        })
-    }
-
-    private fun asyncGetConfigFromNsdServer(configName: String) {
-        ThreadPool.getShortPool().execute(Runnable {
-            try {
-                val ret =
-                    NsdClientApi(nsdServiceIp!!, nsdServicePort).getEcardConfigParam(configName)
-                NtpClient().startCalibrateTime(ret.systime)
-                runOnUiThread {
-                    vNsdResult.text = ret.retmsg
-                    if (ret.retcode == PublicDef.SUCCESS) {
-                        vNsdResult.setTextColor(resources.getColor(R.color.light_blue2))
-                        if (ret.mode == 0) {
-                            vRadioPayMode.isChecked = true
-                        } else {
-                            vRadioDepositMode.isChecked = true
-                        }
-                        vDevphyid.setText(ret.devphyid)
-                        vServerIp.setText(ret.epayIP)
-                        vUri.setText(ret.epayUri)
-                        vPort.setText(ret.epayPort.toString())
-                    } else {
-                        vNsdResult.setTextColor(resources.getColor(R.color.cl_red))
-                    }
-                }
-            } catch (ex: Exception) {
-                runOnUiThread {
-                    vNsdResult.text = "异常:${ex.message}"
-                    vNsdResult.setTextColor(resources.getColor(R.color.cl_red))
-                }
-            }
-        })
-    }
-
-    override fun jumpToNextActivity() {
-        jumpActivity(LoadActivity::class.java)
-    }
-
-    override fun getActivity(): Activity {
-        return this
-    }
-
-    override fun showSWToastInfo(msg: String, showway: Int) {
-        SWToast.show(applicationContext, msg, showway)
-    }
+package com.supwisdom.activities.init
+
+import android.app.Activity
+import android.net.nsd.NsdServiceInfo
+import android.os.Bundle
+import android.support.v7.widget.LinearLayoutManager
+import android.support.v7.widget.RecyclerView
+import android.widget.Button
+import android.widget.EditText
+import android.widget.RadioButton
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.init.adapter.NsdServerConfigAdapter
+import com.supwisdom.activities.init.mode.NsdClient
+import com.supwisdom.activities.init.mode.NsdClientApi
+import com.supwisdom.activities.load.LoadActivity
+import com.supwisdom.entity.ConfigParaRecord
+import com.supwisdom.service.NtpClient
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.PublicDef
+import com.supwisdom.utils.ThreadPool
+import com.supwisdom.view.BigSwDialog
+import com.supwisdom.view.SWToast
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+@Suppress("DEPRECATION")
+class InitActivity : BaseActivity(), IInitView {
+    private lateinit var presenter: InitPresenter
+    private lateinit var vDevphyid: EditText
+    private lateinit var vTenantId: EditText
+    private lateinit var vServerIp: EditText
+    private lateinit var vUri: EditText
+    private lateinit var vPort: EditText
+    private lateinit var vNsdResult: TextView
+    private lateinit var vRadioPayMode: RadioButton
+    private lateinit var vRadioDepositMode: RadioButton
+    private lateinit var vRadioThirdPayMode: RadioButton
+    private lateinit var vRadioThirdLoginMode: RadioButton
+    private var nsdClient: NsdClient? = null
+    private var nsdServiceIp: String? = null
+    private var nsdServicePort: Int = 0
+    private var dialogNsdConfig: BigSwDialog? = null
+    private var nsdConfigAdapter: NsdServerConfigAdapter? = null
+    private val pos = SPApplication.getInstance().getPos()
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_init)
+        initView()
+        initData()
+    }
+
+    private fun initData() {
+        presenter = InitPresenter(this)
+        var record = pos.getConfigPara()
+        if (record == null) {
+            record = ConfigParaRecord()
+            record.mode = 0
+            record.tenantId = "schema"
+            record.devphyid = "12345678"
+            record.epayIP = "127.0.0.1"
+            record.epayPort = 8080
+            record.epayUri = "restaurant"
+        }
+        record.initOK = false
+        pos.replaceConfigPara(record)
+        val cfgRecord = pos.getConfigPara()
+        vTenantId.setText(cfgRecord!!.tenantId)
+        vDevphyid.setText(cfgRecord.devphyid)
+        vServerIp.setText(cfgRecord.epayIP)
+        vUri.setText(cfgRecord.epayUri)
+        vPort.setText(cfgRecord.epayPort.toString())
+
+        nsdClient = NsdClient(this, "epay-reg-server", object : NsdClient.IServerFound {
+            override fun onServerFound(serviceInfo: NsdServiceInfo) {
+                nsdServiceIp = serviceInfo.host?.hostAddress
+                nsdServicePort = serviceInfo.port
+                if (nsdServiceIp != null) {
+                    asyncGetConfigName()
+                }
+            }
+
+            override fun onServerFail() {
+
+            }
+        })
+    }
+
+    private fun initView() {
+        this.findViewById<Button>(R.id.tv_settings).setOnClickListener {
+            CommonUtil.startNetSetting(this@InitActivity)
+        }
+        this.findViewById<TextView>(R.id.btn_save).setOnClickListener {
+            presenter.saveConfigParam(
+                0,
+                CommonUtil.getEditView(vTenantId),
+                CommonUtil.getEditView(vDevphyid), CommonUtil.getEditView(vServerIp),
+                CommonUtil.getEditView(vUri), CommonUtil.getEditView(vPort)
+            )
+        }
+        this.findViewById<Button>(R.id.tv_nsd_query).setOnClickListener {
+            if (nsdServiceIp == null) {
+                showSWToastInfo("nsd未连接", PublicDef.TOAST_SHOW_DOUBT)
+                return@setOnClickListener
+            }
+            asyncGetConfigName()
+        }
+        vNsdResult = this.findViewById(R.id.tv_nsd_result) as TextView
+        vRadioPayMode = this.findViewById(R.id.rb_pay_mode) as RadioButton
+        vRadioDepositMode = this.findViewById(R.id.rb_deposit_mode) as RadioButton
+        vRadioThirdPayMode = this.findViewById(R.id.rb_third_pay_mode) as RadioButton
+        vRadioThirdLoginMode = this.findViewById(R.id.rb_third_login_mode) as RadioButton
+        vTenantId = this.findViewById(R.id.tv_tenantid) as EditText
+        vDevphyid = this.findViewById(R.id.tv_devphyid) as EditText
+        vServerIp = this.findViewById(R.id.tv_server_ip) as EditText
+        vUri = this.findViewById(R.id.tv_uri_root) as EditText
+        vPort = this.findViewById(R.id.tv_server_port) as EditText
+    }
+
+    override fun onResume() {
+        super.onResume()
+        nsdClient!!.start()
+        refresh()
+    }
+
+    override fun onStop() {
+        super.onStop()
+        nsdClient!!.stop()
+    }
+
+    private fun refresh() {
+        AuxScreenController.getInstance().refreshTitle("通讯参数设置")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
+        AuxScreenController.getInstance()
+            .refreshContent(Arrays.asList("设备第一次使用", "请联系管理员", "在大屏配置参数"))
+    }
+
+    private fun asyncGetConfigName() {
+        ThreadPool.getShortPool().execute(Runnable {
+            try {
+                val ret = NsdClientApi(nsdServiceIp!!, nsdServicePort).getNsdServerConfigList()
+                runOnUiThread {
+                    vNsdResult.text = ret.getErrorMsg()
+                    if (ret.retcode == PublicDef.SUCCESS) {
+                        if (ret.list!!.isEmpty()) {
+                            vNsdResult.text = "未找到配置项"
+                            return@runOnUiThread
+                        } else if (ret.list!!.size == 1) {
+                            asyncGetConfigFromNsdServer(ret.list!![0])
+                            return@runOnUiThread
+                        }
+                        vNsdResult.setTextColor(resources.getColor(R.color.light_blue2))
+                        if (dialogNsdConfig == null) {
+                            dialogNsdConfig = BigSwDialog(this, PublicDef.DIALOG_TYPE_NSD_CONFIG)
+                            val vConfigList =
+                                dialogNsdConfig!!.findViewById(R.id.rv_config_list) as RecyclerView
+                            vConfigList.layoutManager = LinearLayoutManager(this)
+                            vConfigList.addItemDecoration(NsdServerConfigAdapter.ItemDecoration(10))
+                            nsdConfigAdapter =
+                                NsdServerConfigAdapter(
+                                    this,
+                                    object : NsdServerConfigAdapter.ConfigNameListener {
+                                        override fun callback(configName: String) {
+                                            asyncGetConfigFromNsdServer(configName)
+                                            dialogNsdConfig!!.dismiss()
+                                        }
+                                    })
+                            vConfigList.adapter = nsdConfigAdapter
+                        }
+                        nsdConfigAdapter!!.setList(ret.list)
+                        nsdConfigAdapter!!.notifyDataSetChanged()
+                        dialogNsdConfig!!.show()
+                    } else {
+                        vNsdResult.setTextColor(resources.getColor(R.color.cl_red))
+                    }
+                }
+            } catch (ex: Exception) {
+                runOnUiThread {
+                    vNsdResult.text = "异常:${ex.message}"
+                    vNsdResult.setTextColor(resources.getColor(R.color.cl_red))
+                }
+            }
+        })
+    }
+
+    private fun asyncGetConfigFromNsdServer(configName: String) {
+        ThreadPool.getShortPool().execute(Runnable {
+            try {
+                val ret =
+                    NsdClientApi(nsdServiceIp!!, nsdServicePort).getEcardConfigParam(configName)
+                NtpClient().startCalibrateTime(ret.systime)
+                runOnUiThread {
+                    vNsdResult.text = ret.getErrorMsg()
+                    if (ret.retcode == PublicDef.SUCCESS) {
+                        vNsdResult.setTextColor(resources.getColor(R.color.light_blue2))
+                        if (ret.mode == 0) {
+                            vRadioPayMode.isChecked = true
+                        } else {
+                            vRadioDepositMode.isChecked = true
+                        }
+                        vDevphyid.setText(ret.devphyid)
+                        vServerIp.setText(ret.epayIP)
+                        vUri.setText(ret.epayUri)
+                        vPort.setText(ret.epayPort.toString())
+                    } else {
+                        vNsdResult.setTextColor(resources.getColor(R.color.cl_red))
+                    }
+                }
+            } catch (ex: Exception) {
+                runOnUiThread {
+                    vNsdResult.text = "异常:${ex.message}"
+                    vNsdResult.setTextColor(resources.getColor(R.color.cl_red))
+                }
+            }
+        })
+    }
+
+    override fun jumpToNextActivity() {
+        jumpActivity(LoadActivity::class.java)
+    }
+
+    override fun getActivity(): Activity {
+        return this
+    }
+
+    override fun showSWToastInfo(msg: String, showway: Int) {
+        SWToast.show(applicationContext, msg, showway)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt b/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt
index 1e71cf2..f3c6bb3 100644
--- a/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/load/LoadActivity.kt
@@ -1,100 +1,100 @@
-package com.supwisdom.activities.load
-
-import android.app.Activity
-import android.content.Intent
-import android.os.Bundle
-import android.view.View
-import android.widget.TextView
-import android.widget.Toast
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.consume.ConsumeActivity
-import com.supwisdom.activities.unregister.UnregisterActivity
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.utils.DateUtil
-import java.util.*
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-class LoadActivity : BaseActivity(), ILoadView {
-    private lateinit var presenter: LoadPresenter
-    private lateinit var vLoadPro: TextView
-    private val procontent = StringBuilder()
-    private val auxList = ArrayList<String>()
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_load)
-
-        initView()
-        initData()
-    }
-
-    override fun onResume() {
-        super.onResume()
-        presenter.start()
-        refresh()
-    }
-
-    private fun refresh() {
-        procontent.setLength(0)
-        auxList.clear()
-        AuxScreenController.getInstance().refreshTitle("设备参数加载")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
-        AuxScreenController.getInstance().refreshContent(auxList)
-    }
-
-    private fun initData() {
-        presenter = LoadPresenter(this)
-    }
-
-    private fun initView() {
-        this.findViewById<View>(R.id.btn_back).setOnClickListener {
-            if (presenter.isLoading()) {
-                Toast.makeText(applicationContext, "正在加载信息", Toast.LENGTH_SHORT).show()
-            } else {
-                this@LoadActivity.finish()
-            }
-        }
-        vLoadPro = findViewById<View>(R.id.tv_load_pro) as TextView
-    }
-
-    override fun getActivity(): Activity {
-        return this
-    }
-
-    override fun showProgress(hint: String, clearlast: Boolean) {
-        procontent.append("\n").append(hint)
-        vLoadPro.text = procontent.toString()
-        if (clearlast) {
-            if (auxList.size > 0) {
-                auxList.removeAt(auxList.size - 1)
-            }
-        }
-        auxList.add(hint)
-        AuxScreenController.getInstance().refreshContent(showFormatAux())
-    }
-
-    override fun showFinish() {
-        jumpActivity(ConsumeActivity::class.java)
-    }
-
-    override fun jumpToUnregister(errmsg: String) {
-        val intent = Intent()
-        intent.putExtra("errmsg", errmsg)
-        intent.setClass(this, UnregisterActivity::class.java)
-        startActivity(intent)
-    }
-
-    private fun showFormatAux(): List<String> {
-        val list = ArrayList<String>()
-        val size = auxList.size
-        list.addAll(auxList)
-        for (i in size..4) {
-            list.add(" ")
-        }
-        return list
-    }
+package com.supwisdom.activities.load
+
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import android.widget.TextView
+import android.widget.Toast
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.consume.ConsumeActivity
+import com.supwisdom.activities.unregister.UnregisterActivity
+import com.supwisdom.utils.DateUtil
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class LoadActivity : BaseActivity(), ILoadView {
+    private lateinit var presenter: LoadPresenter
+    private lateinit var vLoadPro: TextView
+    private val procontent = StringBuilder()
+    private val auxList = ArrayList<String>()
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_load)
+
+        initView()
+        initData()
+    }
+
+    override fun onResume() {
+        super.onResume()
+        presenter.start()
+        refresh()
+    }
+
+    private fun refresh() {
+        procontent.setLength(0)
+        auxList.clear()
+        AuxScreenController.getInstance().refreshTitle("设备参数加载")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
+        AuxScreenController.getInstance().refreshContent(auxList)
+    }
+
+    private fun initData() {
+        presenter = LoadPresenter(this)
+    }
+
+    private fun initView() {
+        this.findViewById<View>(R.id.btn_back).setOnClickListener {
+            if (presenter.isLoading()) {
+                Toast.makeText(applicationContext, "正在加载信息", Toast.LENGTH_SHORT).show()
+            } else {
+                this@LoadActivity.finish()
+            }
+        }
+        vLoadPro = findViewById<View>(R.id.tv_load_pro) as TextView
+    }
+
+    override fun getActivity(): Activity {
+        return this
+    }
+
+    override fun showProgress(hint: String, clearlast: Boolean) {
+        procontent.append("\n").append(hint)
+        vLoadPro.text = procontent.toString()
+        if (clearlast) {
+            if (auxList.size > 0) {
+                auxList.removeAt(auxList.size - 1)
+            }
+        }
+        auxList.add(hint)
+        AuxScreenController.getInstance().refreshContent(showFormatAux())
+    }
+
+    override fun showFinish() {
+        jumpActivity(ConsumeActivity::class.java)
+    }
+
+    override fun jumpToUnregister(errmsg: String) {
+        val intent = Intent()
+        intent.putExtra("errmsg", errmsg)
+        intent.setClass(this, UnregisterActivity::class.java)
+        startActivity(intent)
+    }
+
+    private fun showFormatAux(): List<String> {
+        val list = ArrayList<String>()
+        val size = auxList.size
+        list.addAll(auxList)
+        for (i in size..4) {
+            list.add(" ")
+        }
+        return list
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt b/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
index 823c8ca..1ce8330 100644
--- a/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
@@ -1,138 +1,152 @@
-package com.supwisdom.activities.load
-
-import android.os.Handler
-import android.os.Looper
-import android.os.Message
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.YktSession
-import com.supwisdom.bean.AuthRetBean
-import com.supwisdom.exception.AuthEpayError
-import com.supwisdom.service.AuthEpay
-import com.supwisdom.service.EpayApiImpl
-import com.supwisdom.utils.CommonUtil
-import com.supwisdom.utils.PublicDef
-import com.supwisdom.utils.ThreadPool
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-class LoadPresenter constructor(iLoadView: ILoadView) {
-    private val iLoadView = iLoadView
-    private val pos = SPApplication.getInstance().getPos()
-    private lateinit var handler: Handler
-
-    init {
-        createHandler()
-    }
-
-    private val LOAD_SUCCESS = 1
-    private val JUMP_TO_UNREGISTER = 2
-    private val LOAD_PROGRESS = 3
-    private val LOAD_DONE = 4
-
-    private var hasInit: Boolean = false
-    @Volatile
-    private var loading: Boolean = false
-
-    fun isLoading(): Boolean {
-        return loading
-    }
-
-    fun start() {
-        loading = true
-        var cfgRecord = pos.getConfigPara()
-        hasInit = cfgRecord?.initOK ?: false
-
-        YktSession.getInstance().setWebAPISession(
-            cfgRecord!!.epayIP!!,
-            cfgRecord.epayPort,
-            cfgRecord.epayUri!!,
-            cfgRecord.tenantId!!,
-            CommonUtil.getCommunicateTime()
-        )
-
-        ThreadPool.getShortPool().execute(Runnable {
-            sendMessage(LOAD_PROGRESS, "正在系统签到...")
-            val bean = try {
-                AuthEpay().login()
-            } catch (ex: AuthEpayError) {
-                AuthRetBean(PublicDef.ERROR, ex.message ?: "null")
-            }
-            if (bean.retcode != PublicDef.SUCCESS) {
-                sendMessage(LOAD_DONE, bean.retmsg!!)
-                loading = false
-                if (!hasInit) {
-                    sendMessage(JUMP_TO_UNREGISTER, "签到失败:${bean.retmsg}")
-                    return@Runnable
-                }
-            } else {
-                val dyRecord = pos.getDynamicPara()
-                dyRecord!!.deviceid = bean.deviceid
-                dyRecord.merchaccno = bean.merchaccno
-                dyRecord.shopname = bean.shopname
-                dyRecord.onlineseqno = bean.onlineseqno
-                dyRecord.offlineseqno = bean.offlineseqno
-                dyRecord.paragroupid = bean.paragroupid
-                pos.replaceDynamicPara(dyRecord)
-
-                SPApplication.getInstance().setEpayLinking(true)
-                sendMessage(LOAD_DONE, "系统签到成功")
-            }
-
-            // 设置通讯参数
-            val apiInterface = EpayApiImpl()
-            try {
-                sendMessage(LOAD_PROGRESS, "加载系统参数...")
-                apiInterface.downloadSyspara(bean.paragroupid, bean.paraverno)
-                sendMessage(LOAD_DONE, "加载系统参数成功")
-            } catch (ex: Exception) {
-                sendMessage(LOAD_DONE, "加载系统参数失败:${ex.message}")
-                if (!hasInit) {
-                    loading = false
-                    return@Runnable
-                }
-            }
-
-            try {
-                sendMessage(LOAD_PROGRESS, "加载白名单...")
-                apiInterface.downloadWhitelist(bean.whitelistid, bean.cardverno!!)
-                sendMessage(LOAD_DONE, "加载白名单成功")
-            } catch (ex: Exception) {
-                sendMessage(LOAD_DONE, "加载白名单失败:${ex.message}")
-                if (!hasInit) {
-                    loading = false
-                    return@Runnable
-                }
-            }
-
-            cfgRecord = pos.getConfigPara()
-            cfgRecord!!.initOK = true
-            pos.replaceConfigPara(cfgRecord!!)
-            sendMessage(LOAD_SUCCESS, "加载成功")
-        })
-    }
-
-    private fun createHandler() {
-        handler = object : Handler(Looper.getMainLooper()) {
-            override fun handleMessage(msg: Message) {
-                when (msg.what) {
-                    LOAD_DONE -> iLoadView.showProgress(msg.obj as String, true)
-                    LOAD_PROGRESS -> iLoadView.showProgress(msg.obj as String, false)
-                    JUMP_TO_UNREGISTER -> iLoadView.jumpToUnregister(msg.obj as String)
-                    LOAD_SUCCESS -> {
-                        CommonUtil.doSleep(3000)
-                        iLoadView.showFinish()
-                    }
-                }
-            }
-        }
-    }
-
-    private fun sendMessage(code: Int, info: String) {
-        val msg = Message()
-        msg.what = code
-        msg.obj = info
-        handler.sendMessage(msg)
-    }
+package com.supwisdom.activities.load
+
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.YktSession
+import com.supwisdom.bean.AuthRetBean
+import com.supwisdom.exception.AuthEpayError
+import com.supwisdom.service.AuthEpay
+import com.supwisdom.service.EpayApiImpl
+import com.supwisdom.service.SynoCodeService
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.PublicDef
+import com.supwisdom.utils.ThreadPool
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class LoadPresenter constructor(iLoadView: ILoadView) {
+    private val iLoadView = iLoadView
+    private val pos = SPApplication.getInstance().getPos()
+    private lateinit var handler: Handler
+
+    init {
+        createHandler()
+    }
+
+    private val LOAD_SUCCESS = 1
+    private val JUMP_TO_UNREGISTER = 2
+    private val LOAD_PROGRESS = 3
+    private val LOAD_DONE = 4
+
+    private var hasInit: Boolean = false
+
+    @Volatile
+    private var loading: Boolean = false
+
+    fun isLoading(): Boolean {
+        return loading
+    }
+
+    fun start() {
+        loading = true
+        var cfgRecord = pos.getConfigPara()
+        hasInit = cfgRecord?.initOK ?: false
+
+        YktSession.getInstance().setWebAPISession(
+            cfgRecord!!.epayIP!!,
+            cfgRecord.epayPort,
+            cfgRecord.epayUri!!,
+            cfgRecord.tenantId!!,
+            CommonUtil.getCommunicateTime()
+        )
+
+        ThreadPool.getShortPool().execute(Runnable {
+            sendMessage(LOAD_PROGRESS, "正在系统签到...")
+            val bean = try {
+                AuthEpay().login()
+            } catch (ex: AuthEpayError) {
+                AuthRetBean(PublicDef.ERROR, ex.message ?: "null")
+            }
+            if (bean.retcode != PublicDef.SUCCESS) {
+                sendMessage(LOAD_DONE, bean.getErrorMsg())
+                loading = false
+                if (!hasInit) {
+                    sendMessage(JUMP_TO_UNREGISTER, "签到失败:${bean.getErrorMsg()}")
+                    return@Runnable
+                }
+            } else {
+                val dyRecord = pos.getDynamicPara()
+                dyRecord!!.deviceid = bean.deviceid
+                dyRecord.merchaccno = bean.merchaccno
+                dyRecord.shopname = bean.shopname
+                dyRecord.onlineseqno = bean.onlineseqno
+                dyRecord.offlineseqno = bean.offlineseqno
+                dyRecord.paragroupid = bean.paragroupid
+                pos.replaceDynamicPara(dyRecord)
+
+                SPApplication.getInstance().setEpayLinking(true)
+                sendMessage(LOAD_DONE, "系统签到成功")
+            }
+
+            // 设置通讯参数
+            val apiInterface = EpayApiImpl()
+            try {
+                sendMessage(LOAD_PROGRESS, "加载系统参数...")
+                apiInterface.downloadSyspara(bean.paragroupid, bean.paraverno)
+                sendMessage(LOAD_DONE, "加载系统参数成功")
+            } catch (ex: Exception) {
+                sendMessage(LOAD_DONE, "加载系统参数失败:${ex.message}")
+                if (!hasInit) {
+                    loading = false
+                    return@Runnable
+                }
+            }
+
+            try {
+                sendMessage(LOAD_PROGRESS, "加载白名单...")
+                apiInterface.downloadWhitelist(bean.whitelistid, bean.cardverno!!)
+                sendMessage(LOAD_DONE, "加载白名单成功")
+            } catch (ex: Exception) {
+                sendMessage(LOAD_DONE, "加载白名单失败:${ex.message}")
+                if (!hasInit) {
+                    loading = false
+                    return@Runnable
+                }
+            }
+            if (pos.getSysPara()!!.synoCode) {
+                sendMessage(LOAD_PROGRESS, "激活扫码算法...")
+                if (SynoCodeService().activeByLocalLicense(iLoadView.getActivity().applicationContext)) {
+                    SPApplication.getInstance().setSynoCodeActive(true)
+                    sendMessage(LOAD_DONE, "晟元算法激活成功")
+                } else {
+                    sendMessage(LOAD_DONE, "晟元算法激活失败")
+                    SPApplication.getInstance().setSynoCodeActive(false)
+                }
+            } else {
+                SPApplication.getInstance().setSynoCodeActive(false)
+            }
+
+            cfgRecord = pos.getConfigPara()
+            cfgRecord!!.initOK = true
+            pos.replaceConfigPara(cfgRecord!!)
+            sendMessage(LOAD_SUCCESS, "加载成功")
+        })
+    }
+
+    private fun createHandler() {
+        handler = object : Handler(Looper.getMainLooper()) {
+            override fun handleMessage(msg: Message) {
+                when (msg.what) {
+                    LOAD_DONE -> iLoadView.showProgress(msg.obj as String, true)
+                    LOAD_PROGRESS -> iLoadView.showProgress(msg.obj as String, false)
+                    JUMP_TO_UNREGISTER -> iLoadView.jumpToUnregister(msg.obj as String)
+                    LOAD_SUCCESS -> {
+                        CommonUtil.doSleep(3000)
+                        iLoadView.showFinish()
+                    }
+                }
+            }
+        }
+    }
+
+    private fun sendMessage(code: Int, info: String) {
+        val msg = Message()
+        msg.what = code
+        msg.obj = info
+        handler.sendMessage(msg)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/manage/IManageView.kt b/app/src/main/java/com/supwisdom/activities/manage/IManageView.kt
index 27bb27f..08627b1 100644
--- a/app/src/main/java/com/supwisdom/activities/manage/IManageView.kt
+++ b/app/src/main/java/com/supwisdom/activities/manage/IManageView.kt
@@ -1,11 +1,15 @@
-package com.supwisdom.activities.manage
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc
- **/
-interface IManageView {
-    fun showOperHint(hint: String, result: String)
-
-    fun showOperResult(hint: String, result: String)
+package com.supwisdom.activities.manage
+
+import android.app.Activity
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+interface IManageView {
+    fun getActivity(): Activity
+
+    fun showOperHint(hint: String, result: String)
+
+    fun showOperResult(hint: String, result: String)
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt b/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt
index ec4b7be..d07836b 100644
--- a/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/manage/ManageActivity.kt
@@ -1,170 +1,182 @@
-package com.supwisdom.activities.manage
-
-import android.os.Bundle
-import android.os.CountDownTimer
-import android.view.KeyEvent
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.communicate.CommunicateActivity
-import com.supwisdom.activities.control.ControlActivity
-import com.supwisdom.activities.menu.MenuActivity
-import com.supwisdom.activities.upgrade.UpgradeActivity
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.utils.AppExitUtil
-import com.supwisdom.utils.CommonUtil
-import com.supwisdom.utils.DateUtil
-import java.util.*
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc
- **/
-class ManageActivity : BaseActivity(), IManageView {
-    private var presenter: ManagePresenter? = null
-    private var flag: Boolean = false
-    private var isRunning: Boolean = false
-    private val pos = SPApplication.getInstance().getPos()
-    @Volatile
-    private var keyActive = true
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_manage)
-        initView()
-        initData()
-    }
-
-    private fun initView() {
-
-    }
-
-    private fun initData() {
-        presenter = ManagePresenter(this)
-    }
-
-    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
-        if (event.action == KeyEvent.ACTION_DOWN) {
-            if (isRunning || !keyActive) {
-                return super.dispatchKeyEvent(event)
-            }
-            resetCounter(200)
-
-            val keyCode = event.keyCode
-            if (flag) {
-                return if (KeyEvent.KEYCODE_DEL == keyCode) {
-                    refresh()
-                    true
-                } else {
-                    false
-                }
-            }
-            when (keyCode) {
-                KeyEvent.KEYCODE_1 -> {
-                    flag = true
-                    showShopPassword()
-                }
-                KeyEvent.KEYCODE_2 -> jumpActivity(CommunicateActivity::class.java)
-                KeyEvent.KEYCODE_3 -> {
-                    //查询流水
-                    flag = true
-                    AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("流水查询:", "暂不支持"))
-                }
-                KeyEvent.KEYCODE_4 -> {
-                    flag = true
-                    isRunning = true
-                    AuxScreenController.getInstance()
-                        .refreshContent(Arrays.asList<String>("正在导出流水", "请稍等..."))
-                    presenter!!.outTransdtl()
-                }
-                KeyEvent.KEYCODE_5 -> jumpActivity(UpgradeActivity::class.java)
-                KeyEvent.KEYCODE_6 -> {
-                    AuxScreenController.getInstance()
-                        .refreshContent(Arrays.asList<String>("应用程序已退出", "请到大屏操作"))
-                    AppExitUtil.exit()
-                }
-                KeyEvent.KEYCODE_7 -> {
-                    AuxScreenController.getInstance()
-                        .refreshContent(Arrays.asList<String>("应用程序已退出", "请到大屏操作"))
-                    CommonUtil.startNetSetting(this)
-                }
-                KeyEvent.KEYCODE_8 -> {
-                    flag = true
-                    isRunning = true
-                    AuxScreenController.getInstance()
-                        .refreshContent(Arrays.asList<String>("正在清空白名单", "请稍等..."))
-                    presenter!!.clearAndUpdateWhitelist()
-                }
-                KeyEvent.KEYCODE_9 -> jumpActivity(ControlActivity::class.java)
-                KeyEvent.KEYCODE_DEL ->
-                    //cancel
-                    jumpActivity(MenuActivity::class.java)
-            }
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
-    override fun showOperHint(hint: String, result: String) {
-        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(hint, result))
-    }
-
-    override fun showOperResult(hint: String, result: String) {
-        flag = true
-        isRunning = false
-        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(hint, result))
-    }
-
-    override fun onResume() {
-        super.onResume()
-        keyActive = true
-        refresh()
-    }
-
-    private fun refresh() {
-        flag = false
-        isRunning = false
-        AuxScreenController.getInstance().refreshTitle("设备管理界面")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
-        AuxScreenController.getInstance().refreshContent(
-            Arrays.asList(
-                getString(R.string.consume_menu_shop_passwd),
-                getString(R.string.consume_menu_comm_set),
-                getString(R.string.consume_menu_unconfirm_transdtl),
-                getString(R.string.consume_menu_out_dtl),
-                getString(R.string.consume_menu_upgrade),
-                getString(R.string.consume_menu_app_exit),
-                getString(R.string.consume_menu_setting),
-                getString(R.string.consume_menu_clear_blklist),
-                getString(R.string.consume_menu_control_set)
-            )
-        )
-    }
-
-    private fun showShopPassword() {
-        AuxScreenController.getInstance()
-            .refreshContent(Arrays.asList<String>("商户密码:", pos.getConfigPara()!!.shopPwd))
-    }
-
-    private var counter: ContinuePressTimer? = null
-
-    private fun resetCounter(timems: Long) {
-        counter?.cancel()
-        if (counter == null) {
-            counter = ContinuePressTimer(timems, 100)
-        }
-        keyActive = false
-        counter!!.start()
-    }
-
-    private inner class ContinuePressTimer internal constructor(millisInFuture: Long, countDownInterval: Long) :
-        CountDownTimer(millisInFuture, countDownInterval) {
-
-        override fun onTick(millisUntilFinished: Long) {
-
-        }
-
-        override fun onFinish() {
-            keyActive = true
-        }
-    }
+package com.supwisdom.activities.manage
+
+import android.app.Activity
+import android.os.Bundle
+import android.os.CountDownTimer
+import android.view.KeyEvent
+import android.view.View
+import android.widget.LinearLayout
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.communicate.CommunicateActivity
+import com.supwisdom.activities.control.ControlActivity
+import com.supwisdom.activities.menu.MenuActivity
+import com.supwisdom.activities.upgrade.UpgradeActivity
+import com.supwisdom.utils.AppExitUtil
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.PublicDef
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class ManageActivity : BaseActivity(), IManageView {
+    private lateinit var presenter: ManagePresenter
+    private var flag: Boolean = false
+    private var isRunning: Boolean = false
+    private val pos = SPApplication.getInstance().getPos()
+    private lateinit var vOperateHint: TextView
+    private lateinit var vOperateResult: TextView
+    private lateinit var llOperate: LinearLayout
+    private lateinit var llMenu: LinearLayout
+    private var keyActive = true
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_manage)
+        initView()
+        initData()
+    }
+
+    private fun initView() {
+        llOperate = findViewById<View>(R.id.ll_operate) as LinearLayout
+        llMenu = findViewById<View>(R.id.ll_menu) as LinearLayout
+        vOperateHint = findViewById<View>(R.id.tv_operate_hint) as TextView
+        vOperateResult = findViewById<View>(R.id.tv_operate_result) as TextView
+    }
+
+    private fun initData() {
+        presenter = ManagePresenter(this)
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            if (isRunning || !keyActive) {
+                return super.dispatchKeyEvent(event)
+            }
+            resetCounter(200)
+
+            val keyCode = event.keyCode
+            if (flag) {
+                return if (KeyEvent.KEYCODE_DEL == keyCode) {
+                    refresh()
+                    true
+                } else {
+                    false
+                }
+            }
+            when (keyCode) {
+                KeyEvent.KEYCODE_1 -> {
+                    showOperHint(
+                        "商户密码:",
+                        pos.getConfigPara()!!.shopPwd ?: PublicDef.PASSWD_SHOP_DEFAULT
+                    )
+                }
+                KeyEvent.KEYCODE_2 -> jumpActivity(CommunicateActivity::class.java)
+                KeyEvent.KEYCODE_3 -> {
+                    //查询流水
+                    showOperHint("流水查询:", "暂不支持")
+                }
+                KeyEvent.KEYCODE_4 -> {
+                    presenter.doSynoActive()
+                }
+                KeyEvent.KEYCODE_5 -> jumpActivity(UpgradeActivity::class.java)
+                KeyEvent.KEYCODE_6 -> {
+                    showOperHint("应用程序已退出", "请到大屏操作")
+                    AppExitUtil.exit()
+                }
+                KeyEvent.KEYCODE_7 -> {
+                    showOperHint("应用程序已退出", "请到大屏操作")
+                    CommonUtil.startNetSetting(this)
+                }
+                KeyEvent.KEYCODE_8 -> {
+                    presenter.clearAndUpdateWhitelist()
+                }
+                KeyEvent.KEYCODE_9 -> jumpActivity(ControlActivity::class.java)
+                KeyEvent.KEYCODE_DEL ->
+                    //cancel
+                    jumpActivity(MenuActivity::class.java)
+            }
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    override fun showOperHint(hint: String, result: String) {
+        flag = true
+        isRunning = false
+        llOperate.visibility = View.VISIBLE
+        llMenu.visibility = View.GONE
+        vOperateHint.text = hint
+        vOperateResult.text = result
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(hint, result))
+    }
+
+    override fun showOperResult(hint: String, result: String) {
+        vOperateHint.text = hint
+        vOperateResult.text = result
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(hint, result))
+    }
+
+    override fun onResume() {
+        super.onResume()
+        keyActive = true
+        refresh()
+    }
+
+    private fun refresh() {
+        flag = false
+        isRunning = false
+        llMenu.visibility = View.VISIBLE
+        llOperate.visibility = View.GONE
+        AuxScreenController.getInstance().refreshTitle("设备管理界面")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
+        AuxScreenController.getInstance().refreshContent(
+            Arrays.asList(
+                getString(R.string.consume_menu_shop_passwd),
+                getString(R.string.consume_menu_comm_set),
+                getString(R.string.consume_menu_unconfirm_transdtl),
+                getString(R.string.consume_menu_syno_active),
+                getString(R.string.consume_menu_upgrade),
+                getString(R.string.consume_menu_app_exit),
+                getString(R.string.consume_menu_setting),
+                getString(R.string.consume_menu_clear_blklist),
+                getString(R.string.consume_menu_control_set)
+            )
+        )
+    }
+
+    override fun getActivity(): Activity {
+        return this
+    }
+
+    private var counter: ContinuePressTimer? = null
+
+    private fun resetCounter(timems: Long) {
+        counter?.cancel()
+        if (counter == null) {
+            counter = ContinuePressTimer(timems, 100)
+        }
+        keyActive = false
+        counter!!.start()
+    }
+
+    private inner class ContinuePressTimer internal constructor(
+        millisInFuture: Long,
+        countDownInterval: Long
+    ) :
+        CountDownTimer(millisInFuture, countDownInterval) {
+
+        override fun onTick(millisUntilFinished: Long) {
+
+        }
+
+        override fun onFinish() {
+            keyActive = true
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt b/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
index 681d57d..9e3be40 100644
--- a/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/manage/ManagePresenter.kt
@@ -1,102 +1,134 @@
-package com.supwisdom.activities.manage
-
-import android.os.AsyncTask
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.bean.BaseResp
-import com.supwisdom.exception.WhiteListError
-import com.supwisdom.service.EpayApiImpl
-import com.supwisdom.utils.FileUtil
-import com.supwisdom.utils.PublicDef
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc
- **/
-class ManagePresenter constructor(iManageView: IManageView) {
-    private val iManageView = iManageView
-    private val pos = SPApplication.getInstance().getPos()
-
-    fun clearAndUpdateWhitelist() {
-        if (!SPApplication.getInstance().isOnline()) {
-            iManageView.showOperHint("重置黑名单失败", "网络未联通")
-            return
-        }
-        ClearWhiteList().execute()
-    }
-
-    fun reloadTransdtl() {
-        if (!SPApplication.getInstance().isOnline()) {
-            iManageView.showOperHint("补采流水失败", "网络未联通")
-            return
-        }
-        iManageView.showOperHint("正在补采流水", "请稍等...")
-        ReloadTransdtl().execute()
-    }
-
-    fun outTransdtl() {
-        iManageView.showOperHint("正在导出流水", "请稍等...")
-        OutTransdtl().execute()
-    }
-
-    private inner class ReloadTransdtl : AsyncTask<Void, Int, BaseResp>() {
-        override fun onPostExecute(resp: BaseResp) {
-            if (resp.retcode == PublicDef.SUCCESS) {
-                iManageView.showOperResult("补采流水成功", resp.retmsg!!)
-            } else {
-                iManageView.showOperResult("补采流水失败", resp.retmsg!!)
-            }
-        }
-
-        override fun doInBackground(vararg params: Void): BaseResp {
-            return BaseResp(PublicDef.ERROR, "暂未实现")
-        }
-    }
-
-    private inner class ClearWhiteList : AsyncTask<Void, Int, BaseResp>() {
-        override fun onPostExecute(resp: BaseResp) {
-            if (resp.retcode == PublicDef.SUCCESS) {
-                iManageView.showOperResult("白名单更新成功", "")
-            } else {
-                iManageView.showOperResult("白名单更新失败", resp.retmsg!!)
-            }
-        }
-
-        override fun doInBackground(vararg params: Void): BaseResp {
-            if (!pos.clearWhiteList()) {
-                return BaseResp(PublicDef.ERROR, "清空白名单失败")
-            }
-            val dyRecord = pos.getDynamicPara()
-            dyRecord!!.cardverno = "0"
-            pos.replaceDynamicPara(dyRecord)
-            return try {
-                EpayApiImpl().downloadWhitelist(dyRecord.whitelistid, "0")
-                BaseResp(PublicDef.SUCCESS, "更新成功")
-            } catch (ex: Exception) {
-                BaseResp(PublicDef.ERROR, ex.message)
-            }
-        }
-    }
-
-    private inner class OutTransdtl : AsyncTask<Void, Int, BaseResp>() {
-        override fun doInBackground(vararg params: Void): BaseResp {
-            var num = 0
-            pos.getTransdtlOnline().forEach {
-                num++
-                FileUtil.writeDtlFile(it.toString())
-            }
-            pos.getTransdtlOffline().forEach {
-                num++
-                FileUtil.writeDtlFile(it.toString())
-            }
-            return BaseResp(PublicDef.SUCCESS, "共导出" + num + "笔")
-        }
-
-        override fun onPostExecute(resp: BaseResp) {
-            if (resp.retcode == PublicDef.SUCCESS) {
-                iManageView.showOperResult("导出流水成功", resp.retmsg!!)
-            } else {
-                iManageView.showOperResult("导出流水失败", resp.retmsg!!)
-            }
-        }
-    }
+package com.supwisdom.activities.manage
+
+import android.os.AsyncTask
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.bean.BaseResp
+import com.supwisdom.service.EpayApiImpl
+import com.supwisdom.service.SynoCodeService
+import com.supwisdom.utils.FileUtil
+import com.supwisdom.utils.PublicDef
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class ManagePresenter constructor(private val iManageView: IManageView) {
+    private val pos = SPApplication.getInstance().getPos()
+
+    fun doSynoActive() {
+        if (pos.getSysPara()!!.synoCode) {
+            //晟元激活
+            iManageView.showOperHint("晟元激活", "请连外网激活")
+            SynoActive().execute()
+        } else {
+            SPApplication.getInstance().setSynoCodeActive(false)
+            iManageView.showOperResult("晟元激活结果:", "前台未开启")
+        }
+    }
+
+    private inner class SynoActive : AsyncTask<Void, Int, BaseResp>() {
+        override fun onPostExecute(resp: BaseResp) {
+            if (resp.retcode == PublicDef.SUCCESS) {
+                iManageView.showOperResult("晟元激活结果", resp.getErrorMsg())
+            } else {
+                iManageView.showOperResult("晟元激活失败", resp.getErrorMsg())
+            }
+        }
+
+        override fun doInBackground(vararg params: Void): BaseResp {
+            val resp = SynoCodeService().synoCodeActive(iManageView.getActivity())
+            return if (resp.retcode == PublicDef.SUCCESS) {
+                SPApplication.getInstance().setSynoCodeActive(true)
+                SynoCodeService().uploadActiveLicense()
+            } else {
+                SPApplication.getInstance().setSynoCodeActive(false)
+                resp
+            }
+        }
+    }
+
+    fun clearAndUpdateWhitelist() {
+        if (!SPApplication.getInstance().isOnline()) {
+            iManageView.showOperHint("重置黑名单失败", "网络未联通")
+            return
+        }
+        iManageView.showOperHint("正在清空白名单", "请稍等...")
+        ClearWhiteList().execute()
+    }
+
+    fun reloadTransdtl() {
+        if (!SPApplication.getInstance().isOnline()) {
+            iManageView.showOperHint("补采流水失败", "网络未联通")
+            return
+        }
+        iManageView.showOperHint("正在补采流水", "请稍等...")
+        ReloadTransdtl().execute()
+    }
+
+    fun outTransdtl() {
+        iManageView.showOperHint("正在导出流水", "请稍等...")
+        OutTransdtl().execute()
+    }
+
+    private inner class ReloadTransdtl : AsyncTask<Void, Int, BaseResp>() {
+        override fun onPostExecute(resp: BaseResp) {
+            if (resp.retcode == PublicDef.SUCCESS) {
+                iManageView.showOperResult("补采流水成功", resp.getErrorMsg())
+            } else {
+                iManageView.showOperResult("补采流水失败", resp.getErrorMsg())
+            }
+        }
+
+        override fun doInBackground(vararg params: Void): BaseResp {
+            return BaseResp(PublicDef.ERROR, "暂未实现")
+        }
+    }
+
+    private inner class ClearWhiteList : AsyncTask<Void, Int, BaseResp>() {
+        override fun onPostExecute(resp: BaseResp) {
+            if (resp.retcode == PublicDef.SUCCESS) {
+                iManageView.showOperResult("白名单更新成功", "")
+            } else {
+                iManageView.showOperResult("白名单更新失败", resp.getErrorMsg())
+            }
+        }
+
+        override fun doInBackground(vararg params: Void): BaseResp {
+            if (!pos.clearWhiteList()) {
+                return BaseResp(PublicDef.ERROR, "清空白名单失败")
+            }
+            val dyRecord = pos.getDynamicPara()
+            dyRecord!!.cardverno = "0"
+            pos.replaceDynamicPara(dyRecord)
+            return try {
+                EpayApiImpl().downloadWhitelist(dyRecord.whitelistid, "0")
+                BaseResp(PublicDef.SUCCESS, "更新成功")
+            } catch (ex: Exception) {
+                BaseResp(PublicDef.ERROR, ex.message)
+            }
+        }
+    }
+
+    private inner class OutTransdtl : AsyncTask<Void, Int, BaseResp>() {
+        override fun doInBackground(vararg params: Void): BaseResp {
+            var num = 0
+            pos.getTransdtlOnline().forEach {
+                num++
+                FileUtil.writeDtlFile(it.toString())
+            }
+            pos.getTransdtlOffline().forEach {
+                num++
+                FileUtil.writeDtlFile(it.toString())
+            }
+            return BaseResp(PublicDef.SUCCESS, "共导出" + num + "笔")
+        }
+
+        override fun onPostExecute(resp: BaseResp) {
+            if (resp.retcode == PublicDef.SUCCESS) {
+                iManageView.showOperResult("导出流水成功", resp.getErrorMsg())
+            } else {
+                iManageView.showOperResult("导出流水失败", resp.getErrorMsg())
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt b/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt
index 4c92368..43f1bc9 100644
--- a/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/menu/MenuActivity.kt
@@ -1,172 +1,192 @@
-package com.supwisdom.activities.menu
-
-import android.app.Activity
-import android.content.Intent
-import android.os.Bundle
-import android.os.CountDownTimer
-import android.view.KeyEvent
-import android.view.View
-import android.widget.TextView
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.checkMngpwd.CheckMngpwdActivity
-import com.supwisdom.activities.consume.ConsumeActivity
-import com.supwisdom.activities.consumeMode.ConsumeModeActivity
-import com.supwisdom.activities.passwd.PasswdActivity
-import com.supwisdom.activities.revenue.RevenueActivity
-import com.supwisdom.activities.syspara.SysparaActivity
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.utils.DateUtil
-import java.util.*
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc
- **/
-class MenuActivity : BaseActivity(), IMenuView {
-    private lateinit var presenter: MenuPresenter
-    private val pos = SPApplication.getInstance().getPos()
-    private var isRunning: Boolean = false
-    private var flag: Boolean = false
-    private lateinit var vReverse: TextView
-    private var keyActive = true
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        this.setContentView(R.layout.activity_menu)
-        initView()
-        initData()
-    }
-
-    private fun initData() {
-        presenter = MenuPresenter(this)
-    }
-
-    private fun initView() {
-        vReverse = this.findViewById<View>(R.id.tv_reverse) as TextView
-    }
-
-    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
-        if (event.action == KeyEvent.ACTION_DOWN) {
-            if (isRunning || !keyActive) {
-                return super.dispatchKeyEvent(event)
-            }
-            resetCounter(200)
-
-            val keyCode = event.keyCode
-            if (flag) {
-                return if (KeyEvent.KEYCODE_DEL == keyCode) {
-                    refresh()
-                    true
-                } else {
-                    false
-                }
-            }
-            when (keyCode) {
-                KeyEvent.KEYCODE_1 -> jumpActivity(RevenueActivity::class.java)
-                KeyEvent.KEYCODE_2 -> {
-                    isRunning = true
-                    presenter.uploadTransdtl()
-                }
-                KeyEvent.KEYCODE_3 -> {
-                    isRunning = true
-                    presenter.linkCheck()
-                }
-                KeyEvent.KEYCODE_4 -> {
-                    isRunning = true
-                    presenter.manualAuth()
-                }
-                KeyEvent.KEYCODE_5 -> jumpActivity(SysparaActivity::class.java)
-                KeyEvent.KEYCODE_6 -> {
-                    val intent = Intent()
-                    intent.putExtra("password", pos.getSysPara()!!.mngPasswd)
-                    intent.setClass(this, CheckMngpwdActivity::class.java)
-                    startActivity(intent)
-                }
-                KeyEvent.KEYCODE_7 -> jumpActivity(PasswdActivity::class.java)
-                KeyEvent.KEYCODE_8 -> jumpActivity(ConsumeModeActivity::class.java)
-                KeyEvent.KEYCODE_9 -> if (isSupportReverse()) {
-                    presenter.doReverse()
-                }
-                KeyEvent.KEYCODE_DEL -> {
-                    //cancel
-                    jumpActivity(ConsumeActivity::class.java)
-                }
-                KeyEvent.KEYCODE_ENTER -> jumpActivity(ConsumeActivity::class.java)
-            }
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
-    override fun onResume() {
-        super.onResume()
-        keyActive = true
-        refresh()
-    }
-
-    override fun showOperHint(title: String, result: String) {
-        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(title, result))
-    }
-
-    override fun showOperResult(title: String, result: String) {
-        flag = true
-        isRunning = false
-        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(title, result))
-    }
-
-    override fun getActivity(): Activity {
-        return this
-    }
-
-    private fun refresh() {
-        isRunning = false
-        flag = false
-        val secList = ArrayList<String>()
-        secList.add(getString(R.string.consume_menu_revenue))
-        secList.add(getString(R.string.consume_menu_transdtl_upload))
-        secList.add(getString(R.string.consume_menu_link_check))
-        secList.add(getString(R.string.consume_menu_auth))
-        secList.add(getString(R.string.consume_menu_syspara_query))
-        secList.add(getString(R.string.consume_menu_manage))
-        secList.add(getString(R.string.consume_menu_shop_password_set))
-        secList.add(getString(R.string.consume_menu_consume_mode))
-        if (isSupportReverse()) {
-            vReverse.visibility = View.VISIBLE
-            secList.add(getString(R.string.consume_menu_reverse))
-        } else {
-            vReverse.visibility = View.GONE
-        }
-        AuxScreenController.getInstance().refreshTitle("设备管理界面")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
-        AuxScreenController.getInstance().refreshContent(secList)
-    }
-
-    private fun isSupportReverse(): Boolean {
-        val sysRecord = SPApplication.getInstance().getPos().getSysPara()
-        return sysRecord != null && sysRecord.returnFlag and 0x1 == 1
-    }
-
-    private var counter: ContinuePressTimer? = null
-
-    private fun resetCounter(timems: Long) {
-        counter?.cancel()
-        if (counter == null) {
-            counter = ContinuePressTimer(timems, 100)
-        }
-        keyActive = false
-        counter!!.start()
-    }
-
-    private inner class ContinuePressTimer internal constructor(millisInFuture: Long, countDownInterval: Long) :
-        CountDownTimer(millisInFuture, countDownInterval) {
-
-        override fun onTick(millisUntilFinished: Long) {
-
-        }
-
-        override fun onFinish() {
-            keyActive = true
-        }
-    }
+package com.supwisdom.activities.menu
+
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import android.os.CountDownTimer
+import android.view.KeyEvent
+import android.view.View
+import android.widget.LinearLayout
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.checkMngpwd.CheckMngpwdActivity
+import com.supwisdom.activities.consume.ConsumeActivity
+import com.supwisdom.activities.consumeMode.ConsumeModeActivity
+import com.supwisdom.activities.passwd.PasswdActivity
+import com.supwisdom.activities.revenue.RevenueActivity
+import com.supwisdom.activities.syspara.SysparaActivity
+import com.supwisdom.utils.DateUtil
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class MenuActivity : BaseActivity(), IMenuView {
+    private lateinit var presenter: MenuPresenter
+    private val pos = SPApplication.getInstance().getPos()
+    private var isRunning: Boolean = false
+    private var flag: Boolean = false
+    private lateinit var vReverse: TextView
+    private lateinit var vOperateHint: TextView
+    private lateinit var vOperateResult: TextView
+    private lateinit var llOperate: LinearLayout
+    private lateinit var llMenu: LinearLayout
+    private var keyActive = true
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        this.setContentView(R.layout.activity_menu)
+        initView()
+        initData()
+    }
+
+    private fun initData() {
+        presenter = MenuPresenter(this)
+    }
+
+    private fun initView() {
+        llOperate = findViewById<View>(R.id.ll_operate) as LinearLayout
+        llMenu = findViewById<View>(R.id.ll_menu) as LinearLayout
+        vReverse = this.findViewById<View>(R.id.tv_reverse) as TextView
+        vOperateHint = findViewById<View>(R.id.tv_operate_hint) as TextView
+        vOperateResult = findViewById<View>(R.id.tv_operate_result) as TextView
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            if (isRunning || !keyActive) {
+                return super.dispatchKeyEvent(event)
+            }
+            resetCounter(200)
+
+            val keyCode = event.keyCode
+            if (flag) {
+                return if (KeyEvent.KEYCODE_DEL == keyCode) {
+                    refresh()
+                    true
+                } else {
+                    false
+                }
+            }
+            when (keyCode) {
+                KeyEvent.KEYCODE_1 -> jumpActivity(RevenueActivity::class.java)
+                KeyEvent.KEYCODE_2 -> {
+                    isRunning = true
+                    presenter.uploadTransdtl()
+                }
+                KeyEvent.KEYCODE_3 -> {
+                    isRunning = true
+                    presenter.linkCheck()
+                }
+                KeyEvent.KEYCODE_4 -> {
+                    isRunning = true
+                    presenter.manualAuth()
+                }
+                KeyEvent.KEYCODE_5 -> jumpActivity(SysparaActivity::class.java)
+                KeyEvent.KEYCODE_6 -> {
+                    val intent = Intent()
+                    intent.putExtra("password", pos.getSysPara()!!.mngPasswd)
+                    intent.setClass(this, CheckMngpwdActivity::class.java)
+                    startActivity(intent)
+                }
+                KeyEvent.KEYCODE_7 -> jumpActivity(PasswdActivity::class.java)
+                KeyEvent.KEYCODE_8 -> jumpActivity(ConsumeModeActivity::class.java)
+                KeyEvent.KEYCODE_9 -> if (isSupportReverse()) {
+                    presenter.doReverse()
+                }
+                KeyEvent.KEYCODE_DEL -> {
+                    //cancel
+                    jumpActivity(ConsumeActivity::class.java)
+                }
+                KeyEvent.KEYCODE_ENTER -> jumpActivity(ConsumeActivity::class.java)
+            }
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        keyActive = true
+        refresh()
+    }
+
+    override fun showOperHint(hint: String, result: String) {
+        flag = true
+        isRunning = false
+        llOperate.visibility = View.VISIBLE
+        llMenu.visibility = View.GONE
+        vOperateHint.text = hint
+        vOperateResult.text = result
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(hint, result))
+    }
+
+    override fun showOperResult(hint: String, result: String) {
+        vOperateHint.text = hint
+        vOperateResult.text = result
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(hint, result))
+    }
+
+    override fun getActivity(): Activity {
+        return this
+    }
+
+    private fun refresh() {
+        isRunning = false
+        flag = false
+        llMenu.visibility = View.VISIBLE
+        llOperate.visibility = View.GONE
+        val secList = ArrayList<String>()
+        secList.add(getString(R.string.consume_menu_revenue))
+        secList.add(getString(R.string.consume_menu_transdtl_upload))
+        secList.add(getString(R.string.consume_menu_link_check))
+        secList.add(getString(R.string.consume_menu_auth))
+        secList.add(getString(R.string.consume_menu_syspara_query))
+        secList.add(getString(R.string.consume_menu_manage))
+        secList.add(getString(R.string.consume_menu_shop_password_set))
+        secList.add(getString(R.string.consume_menu_consume_mode))
+        if (isSupportReverse()) {
+            vReverse.visibility = View.VISIBLE
+            secList.add(getString(R.string.consume_menu_reverse))
+        } else {
+            vReverse.visibility = View.GONE
+        }
+        AuxScreenController.getInstance().refreshTitle("设备管理界面")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
+        AuxScreenController.getInstance().refreshContent(secList)
+    }
+
+    private fun isSupportReverse(): Boolean {
+        val sysRecord = SPApplication.getInstance().getPos().getSysPara()
+        return sysRecord != null && sysRecord.returnFlag and 0x1 == 1
+    }
+
+    private var counter: ContinuePressTimer? = null
+
+    private fun resetCounter(timems: Long) {
+        counter?.cancel()
+        if (counter == null) {
+            counter = ContinuePressTimer(timems, 100)
+        }
+        keyActive = false
+        counter!!.start()
+    }
+
+    private inner class ContinuePressTimer internal constructor(
+        millisInFuture: Long,
+        countDownInterval: Long
+    ) :
+        CountDownTimer(millisInFuture, countDownInterval) {
+
+        override fun onTick(millisUntilFinished: Long) {
+
+        }
+
+        override fun onFinish() {
+            keyActive = true
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt b/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
index 8f49136..0171852 100644
--- a/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/menu/MenuPresenter.kt
@@ -1,151 +1,154 @@
-package com.supwisdom.activities.menu
-
-import android.content.Intent
-import android.os.AsyncTask
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.consume.ConsumeActivity
-import com.supwisdom.bean.AuthRetBean
-import com.supwisdom.bean.BaseResp
-import com.supwisdom.entity.PayStatus
-import com.supwisdom.entity.ReversalFlag
-import com.supwisdom.exception.AuthEpayError
-import com.supwisdom.exception.HeartBeatError
-import com.supwisdom.exception.TransdtlUploadError
-import com.supwisdom.service.AuthEpay
-import com.supwisdom.service.EpayApiImpl
-import com.supwisdom.utils.DateUtil
-import com.supwisdom.utils.PublicDef
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc
- **/
-class MenuPresenter constructor(iMenuView: IMenuView) {
-    private val iMenuView = iMenuView
-    private val pos = SPApplication.getInstance().getPos()
-    fun manualAuth() {
-        iMenuView.showOperHint("正在签到", "请稍等...")
-        AsyncAuth().execute()
-    }
-
-    fun linkCheck() {
-        iMenuView.showOperHint("正在链路检测", "请稍等...")
-        AsyncLink().execute()
-    }
-
-    private inner class AsyncAuth : AsyncTask<Void, Void, AuthRetBean>() {
-        override fun doInBackground(vararg voids: Void): AuthRetBean {
-            val retBean = try {
-                AuthEpay().login()
-            } catch (ex: AuthEpayError) {
-                AuthRetBean(PublicDef.ERROR, ex.message ?: "null")
-            }
-            if (retBean.retcode == PublicDef.SUCCESS) {
-                val record = pos.getDynamicPara()
-                record!!.deviceid = retBean.deviceid
-                record.merchaccno = retBean.merchaccno
-                record.shopname = retBean.shopname
-                record.paragroupid = retBean.paragroupid
-                pos.replaceDynamicPara(record)
-
-                SPApplication.getInstance().setEpayLinking(true)
-            } else {
-                SPApplication.getInstance().setEpayLinking(false)
-            }
-            return retBean
-        }
-
-        override fun onPostExecute(retBean: AuthRetBean?) {
-            when {
-                retBean == null -> iMenuView.showOperResult("签到失败", "请求超时")
-                retBean.retcode != PublicDef.SUCCESS -> iMenuView.showOperResult("签到失败", retBean.retmsg ?: "null")
-                else -> iMenuView.showOperResult("签到成功", " ")
-            }
-        }
-    }
-
-    private inner class AsyncLink : AsyncTask<Void, Void, BaseResp>() {
-        override fun doInBackground(vararg voids: Void): BaseResp {
-            return try {
-                EpayApiImpl().linkCheck()
-                BaseResp(PublicDef.SUCCESS, "连接成功")
-            } catch (ex: HeartBeatError) {
-                BaseResp(PublicDef.ERROR, ex.message)
-            }
-        }
-
-        override fun onPostExecute(baseResp: BaseResp) {
-            SPApplication.getInstance().setEpayLinking(baseResp.retcode == PublicDef.SUCCESS)
-            iMenuView.showOperResult("检测结果", baseResp.retmsg!!)
-        }
-    }
-
-    fun doReverse() {
-        val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), 0, 0, 1)
-        if (list.isEmpty()) {
-            iMenuView.showOperResult("冲正失败", "未找到消费记录")
-            return
-        }
-        val record = list[0]
-        if (record.reversalflag == ReversalFlag.AUTO ||
-            record.reversalflag == ReversalFlag.MANUAL
-        ) {
-            iMenuView.showOperResult("冲正失败", "已冲正")
-            return
-        }
-        if (record.status != PayStatus.SUC) {
-            iMenuView.showOperResult("冲正失败", "消费失败不能冲正")
-            return
-        }
-        val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
-        val t2 = System.currentTimeMillis()
-        if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
-            iMenuView.showOperResult("冲正失败", "消费已过期")
-            return
-        }
-        val intent = Intent()
-        intent.putExtra("datetime", DateUtil.getNowDateNoFormat())
-        intent.putExtra("amount", record.payamt.toString())
-        intent.putExtra("payway", record.payway)
-        intent.putExtra("operation", "reverse")
-        intent.setClass(iMenuView.getActivity(), ConsumeActivity::class.java)
-        iMenuView.getActivity().startActivity(intent)
-    }
-
-    fun uploadTransdtl() {
-        iMenuView.showOperHint("正在上传流水", "请稍等...")
-        UploadTransdtl().execute()
-    }
-
-    private inner class UploadTransdtl : AsyncTask<Void, Void, BaseResp>() {
-        override fun doInBackground(vararg voids: Void): BaseResp {
-            val apiInterface = EpayApiImpl()
-            var num = 0
-            try {
-                pos.getTransdtlOfflineUnconfirm().forEach {
-                    apiInterface.uploadTransdtl(it)
-                    it.upflag = 1
-                    pos.updateTransdtlOffline(it)
-                    num += 1
-                }
-                pos.getTransdtlOnlineUnconfirm().forEach {
-                    apiInterface.uploadTransdtl(it)
-                    it.upflag = 1
-                    pos.updateTransdtlOnline(it)
-                    num += 1
-                }
-                return BaseResp(PublicDef.SUCCESS, "上传共" + num + "条")
-            } catch (ex: TransdtlUploadError) {
-                return BaseResp(PublicDef.ERROR, ex.message)
-            }
-        }
-
-        override fun onPostExecute(resp: BaseResp) {
-            if (resp.retcode == PublicDef.SUCCESS) {
-                iMenuView.showOperResult("上传流水成功", resp.retmsg!!)
-            } else {
-                iMenuView.showOperResult("上传流水失败", resp.retmsg!!)
-            }
-        }
-    }
+package com.supwisdom.activities.menu
+
+import android.content.Intent
+import android.os.AsyncTask
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.consume.ConsumeActivity
+import com.supwisdom.bean.AuthRetBean
+import com.supwisdom.bean.BaseResp
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
+import com.supwisdom.exception.AuthEpayError
+import com.supwisdom.exception.HeartBeatError
+import com.supwisdom.exception.TransdtlUploadError
+import com.supwisdom.service.AuthEpay
+import com.supwisdom.service.EpayApiImpl
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.PublicDef
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class MenuPresenter constructor(iMenuView: IMenuView) {
+    private val iMenuView = iMenuView
+    private val pos = SPApplication.getInstance().getPos()
+    fun manualAuth() {
+        iMenuView.showOperHint("正在签到", "请稍等...")
+        AsyncAuth().execute()
+    }
+
+    fun linkCheck() {
+        iMenuView.showOperHint("正在链路检测", "请稍等...")
+        AsyncLink().execute()
+    }
+
+    private inner class AsyncAuth : AsyncTask<Void, Void, AuthRetBean>() {
+        override fun doInBackground(vararg voids: Void): AuthRetBean {
+            val retBean = try {
+                AuthEpay().login()
+            } catch (ex: AuthEpayError) {
+                AuthRetBean(PublicDef.ERROR, ex.message ?: "null")
+            }
+            if (retBean.retcode == PublicDef.SUCCESS) {
+                val record = pos.getDynamicPara()
+                record!!.deviceid = retBean.deviceid
+                record.merchaccno = retBean.merchaccno
+                record.shopname = retBean.shopname
+                record.paragroupid = retBean.paragroupid
+                pos.replaceDynamicPara(record)
+
+                SPApplication.getInstance().setEpayLinking(true)
+            } else {
+                SPApplication.getInstance().setEpayLinking(false)
+            }
+            return retBean
+        }
+
+        override fun onPostExecute(retBean: AuthRetBean?) {
+            when {
+                retBean == null -> iMenuView.showOperResult("签到失败", "请求超时")
+                retBean.retcode != PublicDef.SUCCESS -> iMenuView.showOperResult(
+                    "签到失败",
+                    retBean.getErrorMsg()
+                )
+                else -> iMenuView.showOperResult("签到成功", " ")
+            }
+        }
+    }
+
+    private inner class AsyncLink : AsyncTask<Void, Void, BaseResp>() {
+        override fun doInBackground(vararg voids: Void): BaseResp {
+            return try {
+                EpayApiImpl().linkCheck()
+                BaseResp(PublicDef.SUCCESS, "连接成功")
+            } catch (ex: HeartBeatError) {
+                BaseResp(PublicDef.ERROR, ex.message)
+            }
+        }
+
+        override fun onPostExecute(baseResp: BaseResp) {
+            SPApplication.getInstance().setEpayLinking(baseResp.retcode == PublicDef.SUCCESS)
+            iMenuView.showOperResult("检测结果", baseResp.getErrorMsg())
+        }
+    }
+
+    fun doReverse() {
+        val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), 0, 0, 1)
+        if (list.isEmpty()) {
+            iMenuView.showOperResult("冲正失败", "未找到消费记录")
+            return
+        }
+        val record = list[0]
+        if (record.reversalflag == ReversalFlag.AUTO ||
+            record.reversalflag == ReversalFlag.MANUAL
+        ) {
+            iMenuView.showOperResult("冲正失败", "已冲正")
+            return
+        }
+        if (record.status != PayStatus.SUC) {
+            iMenuView.showOperResult("冲正失败", "消费失败不能冲正")
+            return
+        }
+        val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
+        val t2 = System.currentTimeMillis()
+        if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
+            iMenuView.showOperResult("冲正失败", "消费已过期")
+            return
+        }
+        val intent = Intent()
+        intent.putExtra("datetime", DateUtil.getNowDateNoFormat())
+        intent.putExtra("amount", record.payamt.toString())
+        intent.putExtra("payway", record.payway)
+        intent.putExtra("operation", "reverse")
+        intent.setClass(iMenuView.getActivity(), ConsumeActivity::class.java)
+        iMenuView.getActivity().startActivity(intent)
+    }
+
+    fun uploadTransdtl() {
+        iMenuView.showOperHint("正在上传流水", "请稍等...")
+        UploadTransdtl().execute()
+    }
+
+    private inner class UploadTransdtl : AsyncTask<Void, Void, BaseResp>() {
+        override fun doInBackground(vararg voids: Void): BaseResp {
+            val apiInterface = EpayApiImpl()
+            var num = 0
+            try {
+                pos.getTransdtlOfflineUnconfirm().forEach {
+                    apiInterface.uploadTransdtl(it)
+                    it.upflag = 1
+                    pos.updateTransdtlOffline(it)
+                    num += 1
+                }
+                pos.getTransdtlOnlineUnconfirm().forEach {
+                    apiInterface.uploadTransdtl(it)
+                    it.upflag = 1
+                    pos.updateTransdtlOnline(it)
+                    num += 1
+                }
+                return BaseResp(PublicDef.SUCCESS, "上传共" + num + "条")
+            } catch (ex: TransdtlUploadError) {
+                return BaseResp(PublicDef.ERROR, ex.message)
+            }
+        }
+
+        override fun onPostExecute(resp: BaseResp) {
+            if (resp.retcode == PublicDef.SUCCESS) {
+                iMenuView.showOperResult("上传流水成功", resp.getErrorMsg())
+            } else {
+                iMenuView.showOperResult("上传流水失败", resp.getErrorMsg())
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/passwd/PasswdActivity.kt b/app/src/main/java/com/supwisdom/activities/passwd/PasswdActivity.kt
index a288b3f..4fd3122 100644
--- a/app/src/main/java/com/supwisdom/activities/passwd/PasswdActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/passwd/PasswdActivity.kt
@@ -1,189 +1,212 @@
-package com.supwisdom.activities.passwd
-
-import android.os.Bundle
-import android.os.CountDownTimer
-import android.view.KeyEvent
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.utils.CommonUtil
-import com.supwisdom.utils.DateUtil
-import java.util.*
-
-/**
- ** create by zzq on 2019/7/26
- ** @desc 商户密码修改
- **/
-class PasswdActivity : BaseActivity() {
-    private lateinit var oldPwd: String
-    private lateinit var newPwd: String
-    private lateinit var newPwd1: String
-    private lateinit var tmpPwd: String
-    private lateinit var passwdHint: String
-    private val pos = SPApplication.getInstance().getPos()
-    private var step = 0
-    private var keyActive = true
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        this.setContentView(R.layout.activity_password)
-    }
-
-    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
-        if (event.action == KeyEvent.ACTION_DOWN) {
-            if (!keyActive) {
-                return super.dispatchKeyEvent(event)
-            }
-            resetCounter(200)
-
-            if (step == 3) {
-                refresh()
-            }
-            val keyCode = event.keyCode
-            when (keyCode) {
-                KeyEvent.KEYCODE_0,
-                KeyEvent.KEYCODE_1,
-                KeyEvent.KEYCODE_2,
-                KeyEvent.KEYCODE_3,
-                KeyEvent.KEYCODE_4,
-                KeyEvent.KEYCODE_5,
-                KeyEvent.KEYCODE_6,
-                KeyEvent.KEYCODE_7,
-                KeyEvent.KEYCODE_8,
-                KeyEvent.KEYCODE_9 -> {
-                    if (step == 4) {
-                        step = 0
-                        passwdHint = "输入原密码:"
-                    }
-                    tmpPwd += keyCode - KeyEvent.KEYCODE_0
-                    if (tmpPwd.length == 6) {
-                        when (step) {
-                            0 -> {
-                                oldPwd = tmpPwd
-                                tmpPwd = ""
-                                if (checkOldPasswd()) {
-                                    step = 1
-                                    passwdHint = "输入新密码:"
-                                    AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(passwdHint, " "))
-                                    return true
-                                } else {
-                                    step = 4
-                                }
-                                return true
-                            }
-                            1 -> {
-                                newPwd = tmpPwd
-                                tmpPwd = ""
-                                step = 2
-                                passwdHint = "确认新密码:"
-                                AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(passwdHint, " "))
-                                return true
-                            }
-                            2 -> {
-                                newPwd1 = tmpPwd
-                                step = 3
-                                tmpPwd = ""
-                                if (checkAndUpdate()) {
-                                    AuxScreenController.getInstance()
-                                        .refreshContent(Arrays.asList<String>("密码修改成功", " "))
-                                    step = 3
-                                    return true
-                                }
-                                step = 4
-                                return true
-                            }
-                            else -> tmpPwd = ""
-                        }
-                    }
-                    AuxScreenController.getInstance()
-                        .refreshContent(Arrays.asList(passwdHint, CommonUtil.getPasswordStar(tmpPwd.length)))
-                    return true
-                }
-                KeyEvent.KEYCODE_ENTER -> {
-                }
-                KeyEvent.KEYCODE_DEL -> {
-                    val len = tmpPwd.length
-                    when {
-                        len == 1 -> {
-                            tmpPwd = ""
-                            AuxScreenController.getInstance()
-                                .refreshContent(Arrays.asList(passwdHint, CommonUtil.getPasswordStar(tmpPwd.length)))
-                        }
-                        len > 1 -> {
-                            tmpPwd = tmpPwd.substring(0, len - 1)
-                            AuxScreenController.getInstance()
-                                .refreshContent(Arrays.asList(passwdHint, CommonUtil.getPasswordStar(tmpPwd.length)))
-                        }
-                        else -> finish()
-                    }
-                    return true
-                }
-            }
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
-    override fun onResume() {
-        super.onResume()
-        keyActive = true
-        refresh()
-    }
-
-    private fun refresh() {
-        step = 0
-        oldPwd = ""
-        newPwd = ""
-        newPwd1 = ""
-        tmpPwd = ""
-        passwdHint = "输入原密码"
-        AuxScreenController.getInstance().refreshTitle("商户密码修改")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
-        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(passwdHint, " "))
-    }
-
-    private fun checkOldPasswd(): Boolean {
-        if (oldPwd != pos.getConfigPara()!!.shopPwd) {
-            AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("修改密码错误", "原密码错误"))
-            return false
-        }
-        return true
-    }
-
-    private fun checkAndUpdate(): Boolean {
-        if (newPwd != newPwd1) {
-            AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("修改密码错误", "新密码不一致"))
-            return false
-        }
-        val record = pos.getConfigPara()
-        record!!.shopPwd = newPwd
-        if (!pos.replaceConfigPara(record)) {
-            AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("修改密码错误", "密码保存失败"))
-            return false
-        }
-        return true
-    }
-
-    private var counter: ContinuePressTimer? = null
-
-    private fun resetCounter(timems: Long) {
-        if (counter == null) {
-            counter = ContinuePressTimer(timems, 100)
-        }
-        counter!!.cancel()
-        keyActive = false
-        counter!!.start()
-    }
-
-    private inner class ContinuePressTimer internal constructor(millisInFuture: Long, countDownInterval: Long) :
-        CountDownTimer(millisInFuture, countDownInterval) {
-
-        override fun onTick(millisUntilFinished: Long) {
-
-        }
-
-        override fun onFinish() {
-            keyActive = true
-        }
-    }
+package com.supwisdom.activities.passwd
+
+import android.os.Bundle
+import android.os.CountDownTimer
+import android.view.KeyEvent
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.DateUtil
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/26
+ ** @desc 商户密码修改
+ **/
+class PasswdActivity : BaseActivity() {
+    private lateinit var oldPwd: String
+    private lateinit var newPwd: String
+    private lateinit var newPwd1: String
+    private lateinit var tmpPwd: String
+    private lateinit var passwdHint: String
+    private val pos = SPApplication.getInstance().getPos()
+    private var step = 0
+    private var keyActive = true
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        this.setContentView(R.layout.activity_password)
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            if (!keyActive) {
+                return super.dispatchKeyEvent(event)
+            }
+            resetCounter(200)
+
+            if (step == 3) {
+                refresh()
+            }
+            val keyCode = event.keyCode
+            when (keyCode) {
+                KeyEvent.KEYCODE_0,
+                KeyEvent.KEYCODE_1,
+                KeyEvent.KEYCODE_2,
+                KeyEvent.KEYCODE_3,
+                KeyEvent.KEYCODE_4,
+                KeyEvent.KEYCODE_5,
+                KeyEvent.KEYCODE_6,
+                KeyEvent.KEYCODE_7,
+                KeyEvent.KEYCODE_8,
+                KeyEvent.KEYCODE_9 -> {
+                    if (step == 4) {
+                        step = 0
+                        passwdHint = "输入原密码:"
+                    }
+                    tmpPwd += keyCode - KeyEvent.KEYCODE_0
+                    if (tmpPwd.length == 6) {
+                        when (step) {
+                            0 -> {
+                                oldPwd = tmpPwd
+                                tmpPwd = ""
+                                if (checkOldPasswd()) {
+                                    step = 1
+                                    passwdHint = "输入新密码:"
+                                    AuxScreenController.getInstance()
+                                        .refreshContent(Arrays.asList<String>(passwdHint, " "))
+                                    return true
+                                } else {
+                                    step = 4
+                                }
+                                return true
+                            }
+                            1 -> {
+                                newPwd = tmpPwd
+                                tmpPwd = ""
+                                step = 2
+                                passwdHint = "确认新密码:"
+                                AuxScreenController.getInstance()
+                                    .refreshContent(Arrays.asList<String>(passwdHint, " "))
+                                return true
+                            }
+                            2 -> {
+                                newPwd1 = tmpPwd
+                                step = 3
+                                tmpPwd = ""
+                                if (checkAndUpdate()) {
+                                    AuxScreenController.getInstance()
+                                        .refreshContent(Arrays.asList<String>("密码修改成功", " "))
+                                    step = 3
+                                    return true
+                                }
+                                step = 4
+                                return true
+                            }
+                            else -> tmpPwd = ""
+                        }
+                    }
+                    AuxScreenController.getInstance()
+                        .refreshContent(
+                            Arrays.asList(
+                                passwdHint,
+                                CommonUtil.getPasswordStar(tmpPwd.length)
+                            )
+                        )
+                    return true
+                }
+                KeyEvent.KEYCODE_ENTER -> {
+                }
+                KeyEvent.KEYCODE_DEL -> {
+                    val len = tmpPwd.length
+                    when {
+                        len == 1 -> {
+                            tmpPwd = ""
+                            AuxScreenController.getInstance()
+                                .refreshContent(
+                                    Arrays.asList(
+                                        passwdHint,
+                                        CommonUtil.getPasswordStar(tmpPwd.length)
+                                    )
+                                )
+                        }
+                        len > 1 -> {
+                            tmpPwd = tmpPwd.substring(0, len - 1)
+                            AuxScreenController.getInstance()
+                                .refreshContent(
+                                    Arrays.asList(
+                                        passwdHint,
+                                        CommonUtil.getPasswordStar(tmpPwd.length)
+                                    )
+                                )
+                        }
+                        else -> finish()
+                    }
+                    return true
+                }
+            }
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        keyActive = true
+        refresh()
+    }
+
+    private fun refresh() {
+        step = 0
+        oldPwd = ""
+        newPwd = ""
+        newPwd1 = ""
+        tmpPwd = ""
+        passwdHint = "输入原密码"
+        AuxScreenController.getInstance().refreshTitle("商户密码修改")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
+        AuxScreenController.getInstance().refreshContent(Arrays.asList<String>(passwdHint, " "))
+    }
+
+    private fun checkOldPasswd(): Boolean {
+        if (oldPwd != pos.getConfigPara()!!.shopPwd) {
+            AuxScreenController.getInstance()
+                .refreshContent(Arrays.asList<String>("修改密码错误", "原密码错误"))
+            return false
+        }
+        return true
+    }
+
+    private fun checkAndUpdate(): Boolean {
+        if (newPwd != newPwd1) {
+            AuxScreenController.getInstance()
+                .refreshContent(Arrays.asList<String>("修改密码错误", "新密码不一致"))
+            return false
+        }
+        val record = pos.getConfigPara()
+        record!!.shopPwd = newPwd
+        if (!pos.replaceConfigPara(record)) {
+            AuxScreenController.getInstance()
+                .refreshContent(Arrays.asList<String>("修改密码错误", "密码保存失败"))
+            return false
+        }
+        return true
+    }
+
+    private var counter: ContinuePressTimer? = null
+
+    private fun resetCounter(timems: Long) {
+        if (counter == null) {
+            counter = ContinuePressTimer(timems, 100)
+        }
+        counter!!.cancel()
+        keyActive = false
+        counter!!.start()
+    }
+
+    private inner class ContinuePressTimer internal constructor(
+        millisInFuture: Long,
+        countDownInterval: Long
+    ) :
+        CountDownTimer(millisInFuture, countDownInterval) {
+
+        override fun onTick(millisUntilFinished: Long) {
+
+        }
+
+        override fun onFinish() {
+            keyActive = true
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/revenue/RevenueActivity.kt b/app/src/main/java/com/supwisdom/activities/revenue/RevenueActivity.kt
index 895d5b4..34516e4 100644
--- a/app/src/main/java/com/supwisdom/activities/revenue/RevenueActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/revenue/RevenueActivity.kt
@@ -1,148 +1,169 @@
-package com.supwisdom.activities.revenue
-
-import android.os.Bundle
-import android.view.KeyEvent
-import android.widget.TextView
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.menu.MenuActivity
-import com.supwisdom.activities.revenue.bean.RevenueAmtRetBean
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.utils.DateUtil
-import java.util.*
-
-/**
- ** create by zzq on 2019/7/26
- ** @desc
- **/
-class RevenueActivity : BaseActivity(), IRevenueView {
-    private lateinit var vContent: TextView
-    private lateinit var vSearchDate: TextView
-    private lateinit var presenter: RevenuePresenter
-    private var isSearching: Boolean = false
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        this.setContentView(R.layout.activity_revenue)
-        initView()
-        initData()
-    }
-
-    private fun initData() {
-        presenter = RevenuePresenter(this)
-    }
-
-    private fun initView() {
-        vContent = this.findViewById<TextView>(R.id.revenue_content)
-        vSearchDate = this.findViewById<TextView>(R.id.revenue_date)
-    }
-
-    private fun refresh() {
-        AuxScreenController.getInstance().refreshTitle("营业额查询")
-        AuxScreenController.getInstance().refreshBottom("F3/F4 切换日期")
-        AuxScreenController.getInstance()
-            .refreshContent(Arrays.asList<String>("查询日期:" + DateUtil.getNowDateSpecFormat(), "正在查询.", "请稍等...", " "))
-
-        val searchDate = DateUtil.getNowDateNoFormat()
-        vSearchDate.text = searchDate
-        isSearching = false
-        presenter.queryRevenue(searchDate)
-    }
-
-    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
-        if (event.action == KeyEvent.ACTION_DOWN) {
-            if (isSearching) {
-                return false
-            }
-            when (event.keyCode) {
-                //case KeyEvent.KEYCODE_DPAD_UP:
-                //F2
-                KeyEvent.KEYCODE_DPAD_DOWN -> {
-                    //F3
-                    movePredate()
-                    return true
-                }
-                KeyEvent.KEYCODE_DPAD_RIGHT -> {
-                    //F4
-                    moveNextDate()
-                    return true
-                }
-                KeyEvent.KEYCODE_DEL -> {
-                    //cancel
-                    jumpActivity(MenuActivity::class.java)
-                    return true
-                }
-            }//case KeyEvent.KEYCODE_ENTER:
-            //ok
-            //  return true;
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
-    private fun moveNextDate() {
-        val date = getSearchDate()
-        if (date >= DateUtil.getNowDateNoFormat()) {
-            return
-        }
-        isSearching = true
-        val nextdate = DateUtil.getSpecifiedDayAfter(date)
-        vSearchDate.text = nextdate
-        AuxScreenController.getInstance()
-            .refreshContent(Arrays.asList<String>("查询日期:" + convertDateToShow(nextdate), "正在查询", "请稍等...", " "))
-        presenter.queryRevenue(nextdate)
-    }
-
-    private fun movePredate() {
-        isSearching = true
-        val predate = DateUtil.getSpecifiedDayBefore(getSearchDate())
-        vSearchDate.text = predate
-        AuxScreenController.getInstance()
-            .refreshContent(Arrays.asList<String>("查询日期:" + convertDateToShow(predate), "正在查询", "请稍等...", " "))
-        presenter.queryRevenue(predate)
-    }
-
-    private fun convertDateToShow(date: String): String {
-        return date.substring(0, 4) + "/" + date.substring(4, 6) + "/" + date.substring(6)
-    }
-
-    override fun onResume() {
-        super.onResume()
-        refresh()
-    }
-
-    override fun onDestroy() {
-        super.onDestroy()
-    }
-
-    override fun showRevenueFail(msg: String) {
-        isSearching = false
-        vContent.text = "查询失败\n原因: $msg"
-        AuxScreenController.getInstance().refreshContent(
-            Arrays.asList<String>(
-                "查询日期:" + convertDateToShow(getSearchDate()),
-                "查询失败:", "原因:$msg", " "
-            )
-        )
-    }
-
-    override fun showRevenueSuc(record: RevenueAmtRetBean) {
-        isSearching = false
-        val sb = StringBuilder("查询成功\n")
-        sb.append("有效笔数 : ").append(record.salescnt).append("笔\n")
-            .append("营业汇总 : ").append(String.format("%.02f 元", record.salesamt / 100.0f))
-        vContent.text = sb.toString()
-
-        AuxScreenController.getInstance().refreshContent(
-            Arrays.asList<String>(
-                "查询日期:" + convertDateToShow(getSearchDate()),
-                "查询成功:",
-                "有效笔数:" + record.salescnt + "笔",
-                "营业汇总:" + String.format("%.02f元", record.salesamt / 100.0f)
-            )
-        )
-    }
-
-    private fun getSearchDate(): String {
-        return vSearchDate.text.toString()
-    }
+package com.supwisdom.activities.revenue
+
+import android.os.Bundle
+import android.view.KeyEvent
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.menu.MenuActivity
+import com.supwisdom.activities.revenue.bean.RevenueAmtRetBean
+import com.supwisdom.utils.DateUtil
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/26
+ ** @desc
+ **/
+class RevenueActivity : BaseActivity(), IRevenueView {
+    private lateinit var vContent: TextView
+    private lateinit var vSearchDate: TextView
+    private lateinit var presenter: RevenuePresenter
+    private var isSearching: Boolean = false
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        this.setContentView(R.layout.activity_revenue)
+        initView()
+        initData()
+    }
+
+    private fun initData() {
+        presenter = RevenuePresenter(this)
+    }
+
+    private fun initView() {
+        vContent = this.findViewById<TextView>(R.id.revenue_content)
+        vSearchDate = this.findViewById<TextView>(R.id.revenue_date)
+    }
+
+    private fun refresh() {
+        AuxScreenController.getInstance().refreshTitle("营业额查询")
+        AuxScreenController.getInstance().refreshBottom("F3/F4 切换日期")
+        AuxScreenController.getInstance()
+            .refreshContent(
+                Arrays.asList<String>(
+                    "查询日期:" + DateUtil.getNowDateSpecFormat(),
+                    "正在查询.",
+                    "请稍等...",
+                    " "
+                )
+            )
+
+        val searchDate = DateUtil.getNowDateNoFormat()
+        vSearchDate.text = searchDate
+        isSearching = false
+        presenter.queryRevenue(searchDate)
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            if (isSearching) {
+                return false
+            }
+            when (event.keyCode) {
+                //case KeyEvent.KEYCODE_DPAD_UP:
+                //F2
+                KeyEvent.KEYCODE_DPAD_DOWN -> {
+                    //F3
+                    movePredate()
+                    return true
+                }
+                KeyEvent.KEYCODE_DPAD_RIGHT -> {
+                    //F4
+                    moveNextDate()
+                    return true
+                }
+                KeyEvent.KEYCODE_DEL -> {
+                    //cancel
+                    jumpActivity(MenuActivity::class.java)
+                    return true
+                }
+            }//case KeyEvent.KEYCODE_ENTER:
+            //ok
+            //  return true;
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    private fun moveNextDate() {
+        val date = getSearchDate()
+        if (date >= DateUtil.getNowDateNoFormat()) {
+            return
+        }
+        isSearching = true
+        val nextdate = DateUtil.getSpecifiedDayAfter(date)
+        vSearchDate.text = nextdate
+        AuxScreenController.getInstance()
+            .refreshContent(
+                Arrays.asList<String>(
+                    "查询日期:" + convertDateToShow(nextdate),
+                    "正在查询",
+                    "请稍等...",
+                    " "
+                )
+            )
+        presenter.queryRevenue(nextdate)
+    }
+
+    private fun movePredate() {
+        isSearching = true
+        val predate = DateUtil.getSpecifiedDayBefore(getSearchDate())
+        vSearchDate.text = predate
+        AuxScreenController.getInstance()
+            .refreshContent(
+                Arrays.asList<String>(
+                    "查询日期:" + convertDateToShow(predate),
+                    "正在查询",
+                    "请稍等...",
+                    " "
+                )
+            )
+        presenter.queryRevenue(predate)
+    }
+
+    private fun convertDateToShow(date: String): String {
+        return date.substring(0, 4) + "/" + date.substring(4, 6) + "/" + date.substring(6)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        refresh()
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+
+    override fun showRevenueFail(msg: String) {
+        isSearching = false
+        vContent.text = "查询失败\n原因: $msg"
+        AuxScreenController.getInstance().refreshContent(
+            Arrays.asList<String>(
+                "查询日期:" + convertDateToShow(getSearchDate()),
+                "查询失败:", "原因:$msg", " "
+            )
+        )
+    }
+
+    override fun showRevenueSuc(record: RevenueAmtRetBean) {
+        isSearching = false
+        val sb = StringBuilder("查询成功\n")
+        sb.append("有效笔数 : ").append(record.salescnt).append("笔\n")
+            .append("营业汇总 : ").append(String.format("%.02f 元", record.salesamt / 100.0f))
+        vContent.text = sb.toString()
+
+        AuxScreenController.getInstance().refreshContent(
+            Arrays.asList<String>(
+                "查询日期:" + convertDateToShow(getSearchDate()),
+                "查询成功:",
+                "有效笔数:" + record.salescnt + "笔",
+                "营业汇总:" + String.format("%.02f元", record.salesamt / 100.0f)
+            )
+        )
+    }
+
+    private fun getSearchDate(): String {
+        return vSearchDate.text.toString()
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/splash/SplashActivity.kt b/app/src/main/java/com/supwisdom/activities/splash/SplashActivity.kt
index fd80a3a..1446525 100644
--- a/app/src/main/java/com/supwisdom/activities/splash/SplashActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/splash/SplashActivity.kt
@@ -1,84 +1,89 @@
-package com.supwisdom.activities.splash
-
-import android.Manifest
-import android.content.pm.PackageManager
-import android.os.Build
-import android.os.Bundle
-import android.view.View
-import android.widget.TextView
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.cardlib.CardlibActivity
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.utils.CommonUtil
-import com.supwisdom.utils.DateUtil
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc
- **/
-class SplashActivity : BaseActivity() {
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_splash)
-        initView()
-    }
-
-    override fun onResume() {
-        super.onResume()
-        refresh()
-        if (hasSdcardPermession()) {
-            processStart()
-        }
-    }
-
-    private fun processStart() {
-        CommonUtil.writeLinnuuxParams()
-        jumpActivity(CardlibActivity::class.java)
-    }
-
-    private fun refresh() {
-        AuxScreenController.getInstance().refreshTitle("新开普智能设备")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
-        AuxScreenController.getInstance().refreshContent(listOf<String>("欢迎使用智能设备"))
-    }
-
-    private fun initView() {
-        val tv = findViewById<View>(R.id.versionNumber) as TextView
-        tv.text = CommonUtil.getVersionName(applicationContext)
-        AuxScreenController.getInstance().open()
-    }
-
-    private val REQUEST_RETCODE = 99
-
-    private fun hasSdcardPermession(): Boolean {
-        /**
-         * 动态获取权限，Android 6.0 新特性，一些保护权限，除了要在AndroidManifest中声明权限，还要使用如下代码动态获取
-         */
-        if (Build.VERSION.SDK_INT >= 23) {
-            val permissions = arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA)
-            //验证是否许可权限
-            for (str in permissions) {
-                if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
-                    //申请权限
-                    this.requestPermissions(permissions, REQUEST_RETCODE)
-                    return false
-                }
-            }
-        }
-        return true
-    }
-
-    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
-        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
-        if (requestCode == REQUEST_RETCODE) {
-            for (i in grantResults.indices) {
-                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
-                    return
-                }
-            }
-            // 请求权限的结果  true代表用户同意了
-            processStart()
-        }
-    }
+package com.supwisdom.activities.splash
+
+import android.Manifest
+import android.content.pm.PackageManager
+import android.os.Build
+import android.os.Bundle
+import android.view.View
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.cardlib.CardlibActivity
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.DateUtil
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class SplashActivity : BaseActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_splash)
+        initView()
+    }
+
+    override fun onResume() {
+        super.onResume()
+        refresh()
+        if (hasSdcardPermession()) {
+            processStart()
+        }
+    }
+
+    private fun processStart() {
+        CommonUtil.writeLinnuuxParams()
+        jumpActivity(CardlibActivity::class.java)
+    }
+
+    private fun refresh() {
+        AuxScreenController.getInstance().refreshTitle("新开普智能设备")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
+        AuxScreenController.getInstance().refreshContent(listOf<String>("欢迎使用智能设备"))
+    }
+
+    private fun initView() {
+        val tv = findViewById<View>(R.id.versionNumber) as TextView
+        tv.text = CommonUtil.getVersionName(applicationContext)
+        AuxScreenController.getInstance().open()
+    }
+
+    private val REQUEST_RETCODE = 99
+
+    private fun hasSdcardPermession(): Boolean {
+        /**
+         * 动态获取权限，Android 6.0 新特性，一些保护权限，除了要在AndroidManifest中声明权限，还要使用如下代码动态获取
+         */
+        if (Build.VERSION.SDK_INT >= 23) {
+            val permissions =
+                arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA)
+            //验证是否许可权限
+            for (str in permissions) {
+                if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
+                    //申请权限
+                    this.requestPermissions(permissions, REQUEST_RETCODE)
+                    return false
+                }
+            }
+        }
+        return true
+    }
+
+    override fun onRequestPermissionsResult(
+        requestCode: Int,
+        permissions: Array<String>,
+        grantResults: IntArray
+    ) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+        if (requestCode == REQUEST_RETCODE) {
+            for (i in grantResults.indices) {
+                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
+                    return
+                }
+            }
+            // 请求权限的结果  true代表用户同意了
+            processStart()
+        }
+    }
 }
\ No newline at end of file
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 82d0bf8..c3a16c7 100644
--- a/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/syspara/SysparaActivity.kt
@@ -1,175 +1,192 @@
-package com.supwisdom.activities.syspara
-
-import android.os.Bundle
-import android.os.CountDownTimer
-import android.view.KeyEvent
-import android.widget.ListView
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.menu.MenuActivity
-import com.supwisdom.activities.syspara.adapter.SysparaAdapter
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.entity.ControlParaRecord
-import com.supwisdom.utils.CommonUtil
-import java.util.*
-
-/**
- ** create by zzq on 2019/7/26
- ** @desc
- **/
-class SysparaActivity : BaseActivity() {
-    private var pageno: Int = 0
-    private val PAGENUM = 3
-    private val kvMap = hashMapOf<Int, ControlParaRecord>()
-    private var index: Int = 0
-    private val pos = SPApplication.getInstance().getPos()
-    private var keyActive = true
-    private var adapter: SysparaAdapter? = null
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_syspara)
-        initView()
-        initData()
-    }
-
-    private fun initData() {
-        index = 0
-        kvMap[index++] = ControlParaRecord("软件版本>>", CommonUtil.getVersionName(applicationContext))
-        val cfgRecord = pos.getConfigPara()
-        val sysRecord = pos.getSysPara()
-        val dyRecord = pos.getDynamicPara()
-        kvMap[index++] = ControlParaRecord("租户名>>", cfgRecord!!.tenantId!!)
-        kvMap[index++] = ControlParaRecord("物理编号>>", cfgRecord.devphyid!!)
-        kvMap[index++] = ControlParaRecord("服务器地址>>", cfgRecord.epayIP!!)
-        kvMap[index++] = ControlParaRecord("服务器标识>>", cfgRecord.epayUri!!)
-        kvMap[index++] = ControlParaRecord("服务器端口>>", "" + cfgRecord.epayPort)
-        kvMap[index++] =
-            ControlParaRecord("参数版本号>>", "no:${dyRecord!!.paraverno},id:${dyRecord.paragroupid}")
-        kvMap[index++] = ControlParaRecord("白名单版本>>", dyRecord.cardverno ?: "null")
-        kvMap[index++] = ControlParaRecord("通讯超时>>", "${CommonUtil.getCommunicateTime()}s")
-        if (sysRecord!!.returnFlag and 0x1 == 1) {
-            kvMap[index++] = ControlParaRecord("冲正使能>>", "启用")
-        } else {
-            kvMap[index++] = ControlParaRecord("冲正使能>>", "禁止")
-        }
-//        if (sysRecord.getSocketSwitch() === 0) {
-//            kvMap[index++] = ControlParaRecord("长连接使能>>", "禁止")
-//        } else {
-//            kvMap[index++] = ControlParaRecord("长连接使能>>", "启用")
-//        }
-//        if (SPApplication.getInstance().isOnline()) {
-//            kvMap[index++] = ControlParaRecord("网络状态>>", "联机")
-//        } else {
-//            kvMap[index++] = ControlParaRecord("网络状态>>", "脱机")
-//        }
-        kvMap[index++] = ControlParaRecord("成功显时间>>", "${sysRecord.sucShowtime}s")
-        kvMap[index++] = ControlParaRecord("失败显时间>>", "${sysRecord.failShowtime}s")
-        kvMap[index++] = ControlParaRecord("联机流水号>>", pos.getTransdtlOnlineMaxSeqno().toString())
-        kvMap[index++] = ControlParaRecord("离线流水号>>", pos.getTransdtlOfflineMaxSeqno().toString())
-        kvMap[index++] = ControlParaRecord("未上传流水>>", pos.getTransdtlUnconfirmNum().toString())
-        kvMap[index++] = ControlParaRecord("最大脱机天数>>", String.format("%d天", sysRecord.maxOfflineDays))
-        kvMap[index++] = ControlParaRecord("当天离线最大金额>>", String.format("%.02f元", sysRecord.maxDayOfflineAmt / 100.0f))
-        kvMap[index++] = ControlParaRecord("定额间隔时间(s)>>", "${sysRecord.fixpayGap}s")
-        kvMap[index++] = ControlParaRecord("心跳间隔>>", "${sysRecord.heatBeat}s")
-    }
-
-    private fun initView() {
-        val vParamList = this.findViewById<ListView>(R.id.lv_param) as ListView
-        adapter = SysparaAdapter(this)
-        vParamList.adapter = adapter
-    }
-
-    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
-        if (event.action == KeyEvent.ACTION_DOWN) {
-            if (!keyActive) {
-                return super.dispatchKeyEvent(event)
-            }
-            resetCounter(200)
-
-            when (event.keyCode) {
-                KeyEvent.KEYCODE_DPAD_DOWN -> {
-                    //F3
-                    pageno++
-                    if (kvMap.size <= pageno * PAGENUM) {
-                        pageno--
-                    } else {
-                        showPara()
-                    }
-                    return true
-                }
-                KeyEvent.KEYCODE_DPAD_RIGHT -> {
-                    //F4
-                    if (pageno > 0) {
-                        pageno--
-                        showPara()
-                    }
-                    return true
-                }
-                //case KeyEvent.KEYCODE_DPAD_UP:
-                //F2
-                KeyEvent.KEYCODE_DEL -> {
-                    //cancel
-                    jumpActivity(MenuActivity::class.java)
-                    return true
-                }
-            }
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
-    override fun onResume() {
-        super.onResume()
-        keyActive = true
-        pageno = 0
-        showPara()
-    }
-
-    private fun showPara() {
-        val paraList = ArrayList<ControlParaRecord>()
-        val auxList = ArrayList<String>()
-        for (i in 0 until PAGENUM) {
-            val index = pageno * PAGENUM + i
-            if (index < kvMap.size) {
-                auxList.add(kvMap[index]!!.paraname!!)
-                auxList.add(kvMap[index]!!.paraval!!)
-            } else {
-                auxList.add(" ")
-                auxList.add(" ")
-            }
-        }
-        for (i in 0 until kvMap.size) {
-            paraList.add(kvMap[i]!!)
-        }
-        adapter!!.setList(paraList)
-        adapter!!.notifyDataSetChanged()
-
-        AuxScreenController.getInstance().refreshTitle("设备参数查询")
-        AuxScreenController.getInstance().refreshBottom("F3/F4 切换翻页")
-        AuxScreenController.getInstance().refreshContent(auxList)
-    }
-
-    private var counter: ContinuePressTimer? = null
-
-    private fun resetCounter(timems: Long) {
-        counter?.cancel()
-        if (counter == null) {
-            counter = ContinuePressTimer(timems, 100)
-        }
-        keyActive = false
-        counter!!.start()
-    }
-
-    private inner class ContinuePressTimer internal constructor(millisInFuture: Long, countDownInterval: Long) :
-        CountDownTimer(millisInFuture, countDownInterval) {
-
-        override fun onTick(millisUntilFinished: Long) {
-
-        }
-
-        override fun onFinish() {
-            keyActive = true
-        }
-    }
+package com.supwisdom.activities.syspara
+
+import android.os.Bundle
+import android.os.CountDownTimer
+import android.view.KeyEvent
+import android.widget.ListView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.menu.MenuActivity
+import com.supwisdom.activities.syspara.adapter.SysparaAdapter
+import com.supwisdom.entity.ControlParaRecord
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.PublicDef
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/26
+ ** @desc
+ **/
+class SysparaActivity : BaseActivity() {
+    private var pageno: Int = 0
+    private val PAGENUM = 3
+    private val kvMap = hashMapOf<Int, ControlParaRecord>()
+    private var index: Int = 0
+    private val pos = SPApplication.getInstance().getPos()
+    private var keyActive = true
+    private var adapter: SysparaAdapter? = null
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_syspara)
+        initView()
+        initData()
+    }
+
+    private fun initData() {
+        index = 0
+        kvMap[index++] = ControlParaRecord("软件版本>>", CommonUtil.getVersionName(applicationContext))
+        kvMap[index++] = ControlParaRecord("启动时间>>", SPApplication.getInstance().getStartime())
+        kvMap[index++] = ControlParaRecord("设备序列号>>", CommonUtil.getSerialNumber())
+        val cfgRecord = pos.getConfigPara()
+        val sysRecord = pos.getSysPara()
+        val dyRecord = pos.getDynamicPara()
+        kvMap[index++] = ControlParaRecord("租户名>>", cfgRecord!!.tenantId!!)
+        kvMap[index++] = ControlParaRecord("物理编号>>", cfgRecord.devphyid!!)
+        kvMap[index++] = ControlParaRecord("服务器地址>>", cfgRecord.epayIP!!)
+        kvMap[index++] = ControlParaRecord("服务器标识>>", cfgRecord.epayUri!!)
+        kvMap[index++] = ControlParaRecord("服务器端口>>", "" + cfgRecord.epayPort)
+        kvMap[index++] =
+            ControlParaRecord("参数版本号>>", "no:${dyRecord!!.paraverno},id:${dyRecord.paragroupid}")
+        kvMap[index++] = ControlParaRecord("白名单版本>>", dyRecord.cardverno ?: "null")
+        kvMap[index++] = ControlParaRecord("通讯超时>>", "${CommonUtil.getCommunicateTime()}s")
+        if (sysRecord!!.returnFlag and 0x1 == 1) {
+            kvMap[index++] = ControlParaRecord("冲正使能>>", "启用")
+        } else {
+            kvMap[index++] = ControlParaRecord("冲正使能>>", "禁止")
+        }
+        if (sysRecord.synoCode) {
+            kvMap[index++] = ControlParaRecord("晟元扫码>>", "开启")
+            val ctlRecord = pos.getControlPara(PublicDef.CONTROL_SYNOCODE_ACTIVE)
+            if (ctlRecord != null) {
+                kvMap[index++] = ControlParaRecord("晟元扫码>>", ctlRecord.paraval ?: "null")
+            } else {
+                kvMap[index++] = ControlParaRecord("晟元扫码>>", "未使用")
+            }
+        } else {
+            kvMap[index++] = ControlParaRecord("晟元扫码>>", "关闭")
+        }
+        kvMap[index++] = ControlParaRecord("成功显时间>>", "${sysRecord.sucShowtime}s")
+        kvMap[index++] = ControlParaRecord("失败显时间>>", "${sysRecord.failShowtime}s")
+        kvMap[index++] = ControlParaRecord("联机流水号>>", pos.getTransdtlOnlineMaxSeqno().toString())
+        kvMap[index++] = ControlParaRecord("离线流水号>>", pos.getTransdtlOfflineMaxSeqno().toString())
+        kvMap[index++] = ControlParaRecord("未上传流水>>", pos.getTransdtlUnconfirmNum().toString())
+        kvMap[index++] = ControlParaRecord(
+            "最大脱机天数>>", String.format(
+                "%d天",
+                sysRecord.maxOfflineDays
+            )
+        )
+        kvMap[index++] = ControlParaRecord(
+            "当天离线最大金额>>", String.format(
+                "%.02f元",
+                sysRecord.maxDayOfflineAmt / 100.0f
+            )
+        )
+        kvMap[index++] = ControlParaRecord("定额间隔时间(s)>>", "${sysRecord.fixpayGap}s")
+        kvMap[index++] = ControlParaRecord("心跳间隔>>", "${sysRecord.heatBeat}s")
+    }
+
+    private fun initView() {
+        val vParamList = this.findViewById<ListView>(R.id.lv_param) as ListView
+        adapter = SysparaAdapter(this)
+        vParamList.adapter = adapter
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            if (!keyActive) {
+                return super.dispatchKeyEvent(event)
+            }
+            resetCounter(200)
+
+            when (event.keyCode) {
+                KeyEvent.KEYCODE_DPAD_DOWN -> {
+                    //F3
+                    pageno++
+                    if (kvMap.size <= pageno * PAGENUM) {
+                        pageno--
+                    } else {
+                        showPara()
+                    }
+                    return true
+                }
+                KeyEvent.KEYCODE_DPAD_RIGHT -> {
+                    //F4
+                    if (pageno > 0) {
+                        pageno--
+                        showPara()
+                    }
+                    return true
+                }
+                //case KeyEvent.KEYCODE_DPAD_UP:
+                //F2
+                KeyEvent.KEYCODE_DEL -> {
+                    //cancel
+                    jumpActivity(MenuActivity::class.java)
+                    return true
+                }
+            }
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        keyActive = true
+        pageno = 0
+        showPara()
+    }
+
+    private fun showPara() {
+        val paraList = ArrayList<ControlParaRecord>()
+        val auxList = ArrayList<String>()
+        for (i in 0 until PAGENUM) {
+            val index = pageno * PAGENUM + i
+            if (index < kvMap.size) {
+                auxList.add(kvMap[index]!!.paraname!!)
+                auxList.add(kvMap[index]!!.paraval!!)
+            } else {
+                auxList.add(" ")
+                auxList.add(" ")
+            }
+        }
+        for (i in 0 until kvMap.size) {
+            paraList.add(kvMap[i]!!)
+        }
+        adapter!!.setList(paraList)
+        adapter!!.notifyDataSetChanged()
+
+        AuxScreenController.getInstance().refreshTitle("设备参数查询")
+        AuxScreenController.getInstance().refreshBottom("F3/F4 切换翻页")
+        AuxScreenController.getInstance().refreshContent(auxList)
+    }
+
+    private var counter: ContinuePressTimer? = null
+
+    private fun resetCounter(timems: Long) {
+        counter?.cancel()
+        if (counter == null) {
+            counter = ContinuePressTimer(timems, 100)
+        }
+        keyActive = false
+        counter!!.start()
+    }
+
+    private inner class ContinuePressTimer internal constructor(
+        millisInFuture: Long,
+        countDownInterval: Long
+    ) :
+        CountDownTimer(millisInFuture, countDownInterval) {
+
+        override fun onTick(millisUntilFinished: Long) {
+
+        }
+
+        override fun onFinish() {
+            keyActive = true
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt b/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt
index 35a0be7..e76c109 100644
--- a/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt
@@ -1,234 +1,241 @@
-package com.supwisdom.activities.transdtl
-
-import android.os.AsyncTask
-import android.os.Bundle
-import android.os.CountDownTimer
-import android.view.KeyEvent
-import android.widget.TextView
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.consume.ConsumeActivity
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.entity.PayStatus
-import com.supwisdom.entity.ReversalFlag
-import com.supwisdom.entity.TransdtlUnionRecord
-import com.supwisdom.utils.DateUtil
-import java.util.*
-
-/**
- ** create by zzq on 2019/7/26
- ** @desc
- **/
-class TransdtlActivity : BaseActivity() {
-    private val pos = SPApplication.getInstance().getPos()
-    private lateinit var vSeqno: TextView
-    private lateinit var vContent: TextView
-    private var isSearching: Boolean = false
-    @Volatile
-    private var keyActive = true
-    private var hasdtlFlag = true
-    private val MAX_SEARCH_NUM = 19
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        this.setContentView(R.layout.activity_transdtl)
-        initView()
-    }
-
-    private fun initView() {
-        vSeqno = findViewById<TextView>(R.id.transdtl_seqno)
-        vContent = findViewById<TextView>(R.id.transdtl_content)
-    }
-
-    private fun refresh() {
-        setShowSeqno(1)
-        doSearch(1)
-    }
-
-    private fun showCustomQuery(seqno: Int) {
-        AuxScreenController.getInstance().refreshTitle("流水记录查询")
-        AuxScreenController.getInstance().refreshBottom("F3/F4 切换记录")
-        AuxScreenController.getInstance()
-            .refreshContent(Arrays.asList<String>("流水索引号:$seqno", "正在查询", "请稍等...", " ", " ", " "))
-    }
-
-    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
-        if (event.action == KeyEvent.ACTION_DOWN) {
-            if (isSearching || !keyActive) {
-                return super.dispatchKeyEvent(event)
-            }
-            resetCounter(200)
-
-            when (event.keyCode) {
-                KeyEvent.KEYCODE_DPAD_UP -> {
-                }
-                KeyEvent.KEYCODE_DPAD_DOWN ->
-                    //F3
-                    movePreSeqno()
-                KeyEvent.KEYCODE_DPAD_RIGHT ->
-                    //F4
-                    moveNextSeqno()
-                KeyEvent.KEYCODE_DEL ->
-                    //cancel
-                    jumpActivity(ConsumeActivity::class.java)
-            }//F2
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
-    private fun moveNextSeqno() {
-        if (!hasdtlFlag) {
-            return
-        }
-        var seqno = getShowSeqno()
-        if (seqno > MAX_SEARCH_NUM) {
-            return
-        }
-        seqno += 1
-        setShowSeqno(seqno)
-        doSearch(seqno)
-    }
-
-    private fun movePreSeqno() {
-        var seqno = getShowSeqno()
-        if (seqno > 1) {
-            seqno -= 1
-            setShowSeqno(seqno)
-            doSearch(seqno)
-        }
-    }
-
-    private fun doSearch(seqno: Int) {
-        isSearching = true
-        showCustomQuery(seqno)
-        queryTransdtl(seqno - 1)
-    }
-
-    override fun onDestroy() {
-        super.onDestroy()
-    }
-
-    override fun onResume() {
-        super.onResume()
-        hasdtlFlag = true
-        keyActive = true
-        refresh()
-    }
-
-    fun showTransdtlResult(record: TransdtlUnionRecord?) {
-        isSearching = false
-        if (record == null) {
-            hasdtlFlag = false
-            vContent.text = "未找到消费记录"
-            AuxScreenController.getInstance().refreshContent(
-                Arrays.asList<String>(
-                    "流水索引号:" + getShowSeqno(),
-                    "查询失败:", "未找到消费记录", " ", " ", " "
-                )
-            )
-        } else {
-            hasdtlFlag = true
-            val transdatetime = StringBuilder()
-            transdatetime.append(record.transdate!!.substring(0, 4)).append("-")
-                .append(record.transdate!!.substring(4, 6)).append("-")
-                .append(record.transdate!!.substring(6)).append(" ")
-                .append(record.transtime!!.substring(0, 2)).append(":")
-                .append(record.transtime!!.substring(2, 4)).append(":")
-                .append(record.transtime!!.substring(4))
-            val result = if (record.status == PayStatus.SUC) {
-                if (record.reversalflag == ReversalFlag.AUTO ||
-                    record.reversalflag == ReversalFlag.MANUAL
-                ) {
-                    "已退款"
-                } else {
-                    "消费成功"
-                }
-            } else {
-                if (record.reversalflag == ReversalFlag.AUTO ||
-                    record.reversalflag == ReversalFlag.MANUAL
-                ) {
-                    "冲正失败"
-                } else {
-                    "消费失败"
-                }
-            }
-            val payWay = if (record.payway == "code") {
-                "二维码"
-            } else {
-                "市民卡"
-            }
-            val sb = StringBuilder("查询成功   \n")
-            if (record.username != null) {
-                sb.append("姓名: ").append(record.username)
-            } else {
-                sb.append("卡号: ").append(record.cardno)
-            }
-            sb.append("\n").append("支付方式: ").append(payWay).append("\n")
-                .append(String.format("支付金额: %.02f元", record.payamt / 100.0f)).append("\n")
-                .append("支付时间: ").append(transdatetime.toString()).append("\n")
-                .append("支付结果: ").append(result)
-            vContent.text = sb.toString()
-
-            AuxScreenController.getInstance().refreshContent(
-                Arrays.asList(
-                    "时间:$transdatetime",
-                    "姓名:" + record.username,
-                    String.format("金额:%.02f元", record.payamt / 100.0f),
-                    "方式:$payWay", "结果:$result"
-                )
-            )
-        }
-    }
-
-    private fun getShowSeqno(): Int {
-        return Integer.parseInt(vSeqno.text.toString())
-    }
-
-    private fun setShowSeqno(seqno: Int) {
-        vSeqno.text = seqno.toString()
-    }
-
-    private fun queryTransdtl(seqno: Int) {
-        AsyncTransdtl().execute(seqno)
-    }
-
-    private inner class AsyncTransdtl : AsyncTask<Int, Void, TransdtlUnionRecord?>() {
-        override fun onPostExecute(record: TransdtlUnionRecord?) {
-            showTransdtlResult(record)
-        }
-
-        override fun doInBackground(vararg integers: Int?): TransdtlUnionRecord? {
-            val searchSeqno = integers[0]!!
-            val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), searchSeqno, 1, 1)
-            return if (list.isNotEmpty()) {
-                list[0]
-            } else {
-                null
-            }
-        }
-    }
-
-    private var counter: ContinuePressTimer? = null
-
-    private fun resetCounter(timems: Long) {
-        counter?.cancel()
-        if (counter == null) {
-            counter = ContinuePressTimer(timems, 100)
-        }
-        keyActive = false
-        counter!!.start()
-    }
-
-    private inner class ContinuePressTimer internal constructor(millisInFuture: Long, countDownInterval: Long) :
-        CountDownTimer(millisInFuture, countDownInterval) {
-
-        override fun onTick(millisUntilFinished: Long) {
-
-        }
-
-        override fun onFinish() {
-            keyActive = true
-        }
-    }
+package com.supwisdom.activities.transdtl
+
+import android.os.AsyncTask
+import android.os.Bundle
+import android.os.CountDownTimer
+import android.view.KeyEvent
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.consume.ConsumeActivity
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
+import com.supwisdom.entity.TransdtlUnionRecord
+import com.supwisdom.utils.DateUtil
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/26
+ ** @desc
+ **/
+class TransdtlActivity : BaseActivity() {
+    private val pos = SPApplication.getInstance().getPos()
+    private lateinit var vSeqno: TextView
+    private lateinit var vContent: TextView
+    private var isSearching: Boolean = false
+
+    @Volatile
+    private var keyActive = true
+    private var hasdtlFlag = true
+    private val MAX_SEARCH_NUM = 19
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        this.setContentView(R.layout.activity_transdtl)
+        initView()
+    }
+
+    private fun initView() {
+        vSeqno = findViewById<TextView>(R.id.transdtl_seqno)
+        vContent = findViewById<TextView>(R.id.transdtl_content)
+    }
+
+    private fun refresh() {
+        setShowSeqno(1)
+        doSearch(1)
+    }
+
+    private fun showCustomQuery(seqno: Int) {
+        AuxScreenController.getInstance().refreshTitle("流水记录查询")
+        AuxScreenController.getInstance().refreshBottom("F3/F4 切换记录")
+        AuxScreenController.getInstance()
+            .refreshContent(Arrays.asList<String>("流水索引号:$seqno", "正在查询", "请稍等...", " ", " ", " "))
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            if (isSearching || !keyActive) {
+                return super.dispatchKeyEvent(event)
+            }
+            resetCounter(200)
+
+            when (event.keyCode) {
+                KeyEvent.KEYCODE_DPAD_UP -> {
+                }
+                KeyEvent.KEYCODE_DPAD_DOWN ->
+                    //F3
+                    movePreSeqno()
+                KeyEvent.KEYCODE_DPAD_RIGHT ->
+                    //F4
+                    moveNextSeqno()
+                KeyEvent.KEYCODE_DEL ->
+                    //cancel
+                    jumpActivity(ConsumeActivity::class.java)
+            }//F2
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    private fun moveNextSeqno() {
+        if (!hasdtlFlag) {
+            return
+        }
+        var seqno = getShowSeqno()
+        if (seqno > MAX_SEARCH_NUM) {
+            return
+        }
+        seqno += 1
+        setShowSeqno(seqno)
+        doSearch(seqno)
+    }
+
+    private fun movePreSeqno() {
+        var seqno = getShowSeqno()
+        if (seqno > 1) {
+            seqno -= 1
+            setShowSeqno(seqno)
+            doSearch(seqno)
+        }
+    }
+
+    private fun doSearch(seqno: Int) {
+        isSearching = true
+        showCustomQuery(seqno)
+        queryTransdtl(seqno - 1)
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+
+    override fun onResume() {
+        super.onResume()
+        hasdtlFlag = true
+        keyActive = true
+        refresh()
+    }
+
+    fun showTransdtlResult(record: TransdtlUnionRecord?) {
+        isSearching = false
+        if (record == null) {
+            hasdtlFlag = false
+            vContent.text = "未找到消费记录"
+            AuxScreenController.getInstance().refreshContent(
+                Arrays.asList<String>(
+                    "流水索引号:" + getShowSeqno(),
+                    "查询失败:", "未找到消费记录", " ", " ", " "
+                )
+            )
+        } else {
+            hasdtlFlag = true
+            val transdatetime = StringBuilder()
+            transdatetime.append(record.transdate!!.substring(0, 4)).append("-")
+                .append(record.transdate!!.substring(4, 6)).append("-")
+                .append(record.transdate!!.substring(6)).append(" ")
+                .append(record.transtime!!.substring(0, 2)).append(":")
+                .append(record.transtime!!.substring(2, 4)).append(":")
+                .append(record.transtime!!.substring(4))
+            val result = if (record.status == PayStatus.SUC) {
+                if (record.reversalflag == ReversalFlag.AUTO ||
+                    record.reversalflag == ReversalFlag.MANUAL
+                ) {
+                    "已退款"
+                } else {
+                    "消费成功"
+                }
+            } else if (record.status == PayStatus.UNCONFIRM) {
+                //反扫消费查询超时
+                "以手机结果为准"
+            } else {
+                if (record.reversalflag == ReversalFlag.AUTO ||
+                    record.reversalflag == ReversalFlag.MANUAL
+                ) {
+                    "冲正失败"
+                } else {
+                    "消费失败"
+                }
+            }
+            val payWay = if (record.payway == "code") {
+                "二维码"
+            } else {
+                "市民卡"
+            }
+            val sb = StringBuilder("查询成功   \n")
+            if (record.username != null) {
+                sb.append("姓名: ").append(record.username)
+            } else {
+                sb.append("卡号: ").append(record.cardno)
+            }
+            sb.append("\n").append("支付方式: ").append(payWay).append("\n")
+                .append(String.format("支付金额: %.02f元", record.payamt / 100.0f)).append("\n")
+                .append("支付时间: ").append(transdatetime.toString()).append("\n")
+                .append("支付结果: ").append(result)
+            vContent.text = sb.toString()
+
+            AuxScreenController.getInstance().refreshContent(
+                Arrays.asList(
+                    "时间:$transdatetime",
+                    "姓名:" + record.username,
+                    String.format("金额:%.02f元", record.payamt / 100.0f),
+                    "方式:$payWay", "结果:$result"
+                )
+            )
+        }
+    }
+
+    private fun getShowSeqno(): Int {
+        return Integer.parseInt(vSeqno.text.toString())
+    }
+
+    private fun setShowSeqno(seqno: Int) {
+        vSeqno.text = seqno.toString()
+    }
+
+    private fun queryTransdtl(seqno: Int) {
+        AsyncTransdtl().execute(seqno)
+    }
+
+    private inner class AsyncTransdtl : AsyncTask<Int, Void, TransdtlUnionRecord?>() {
+        override fun onPostExecute(record: TransdtlUnionRecord?) {
+            showTransdtlResult(record)
+        }
+
+        override fun doInBackground(vararg integers: Int?): TransdtlUnionRecord? {
+            val searchSeqno = integers[0]!!
+            val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), searchSeqno, 1, 1)
+            return if (list.isNotEmpty()) {
+                list[0]
+            } else {
+                null
+            }
+        }
+    }
+
+    private var counter: ContinuePressTimer? = null
+
+    private fun resetCounter(timems: Long) {
+        counter?.cancel()
+        if (counter == null) {
+            counter = ContinuePressTimer(timems, 100)
+        }
+        keyActive = false
+        counter!!.start()
+    }
+
+    private inner class ContinuePressTimer internal constructor(
+        millisInFuture: Long,
+        countDownInterval: Long
+    ) :
+        CountDownTimer(millisInFuture, countDownInterval) {
+
+        override fun onTick(millisUntilFinished: Long) {
+
+        }
+
+        override fun onFinish() {
+            keyActive = true
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt b/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt
index 14e8c6f..ecbf57a 100644
--- a/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/unregister/UnregisterActivity.kt
@@ -1,60 +1,60 @@
-package com.supwisdom.activities.unregister
-
-import android.content.Intent
-import android.os.Bundle
-import android.view.KeyEvent
-import android.widget.TextView
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.init.InitActivity
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.utils.DateUtil
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-class UnregisterActivity:BaseActivity() {
-    private lateinit var vErrmsg: TextView
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        this.setContentView(R.layout.activity_unregister)
-
-        initView()
-    }
-
-    private fun initView() {
-        val backBtn = this.findViewById(R.id.tv_back) as TextView
-        backBtn.setOnClickListener {
-            jumpActivity(InitActivity::class.java)
-        }
-        vErrmsg = this.findViewById(R.id.tv_errmsg) as TextView
-    }
-
-    override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
-        return super.dispatchKeyEvent(event)
-    }
-
-    override fun onDestroy() {
-        super.onDestroy()
-    }
-
-    override fun onResume() {
-        super.onResume()
-        val errmsg = intent.getStringExtra("errmsg")
-        refresh(errmsg)
-        vErrmsg.text = errmsg
-    }
-
-    private fun refresh(errmsg: String) {
-        AuxScreenController.getInstance().refreshTitle("设备注册状态")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
-        AuxScreenController.getInstance().refreshContent(listOf("设备未注册", errmsg))
-    }
-
-    override fun onNewIntent(intent: Intent) {
-        super.onNewIntent(intent)
-        this.intent.putExtra("errmsg", intent.getStringExtra("errmsg"))
-    }
+package com.supwisdom.activities.unregister
+
+import android.content.Intent
+import android.os.Bundle
+import android.view.KeyEvent
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.init.InitActivity
+import com.supwisdom.utils.DateUtil
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class UnregisterActivity : BaseActivity() {
+    private lateinit var vErrmsg: TextView
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        this.setContentView(R.layout.activity_unregister)
+
+        initView()
+    }
+
+    private fun initView() {
+        val backBtn = this.findViewById(R.id.tv_back) as TextView
+        backBtn.setOnClickListener {
+            jumpActivity(InitActivity::class.java)
+        }
+        vErrmsg = this.findViewById(R.id.tv_errmsg) as TextView
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
+        return super.dispatchKeyEvent(event)
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+
+    override fun onResume() {
+        super.onResume()
+        val errmsg = intent.getStringExtra("errmsg")
+        refresh(errmsg)
+        vErrmsg.text = errmsg
+    }
+
+    private fun refresh(errmsg: String) {
+        AuxScreenController.getInstance().refreshTitle("设备注册状态")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
+        AuxScreenController.getInstance().refreshContent(listOf("设备未注册", errmsg))
+    }
+
+    override fun onNewIntent(intent: Intent) {
+        super.onNewIntent(intent)
+        this.intent.putExtra("errmsg", intent.getStringExtra("errmsg"))
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeActivity.kt b/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeActivity.kt
index 91f304d..5449f29 100644
--- a/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeActivity.kt
@@ -1,187 +1,196 @@
-package com.supwisdom.activities.upgrade
-
-import android.content.Intent
-import android.net.Uri
-import android.os.Build
-import android.os.Bundle
-import android.os.CountDownTimer
-import android.support.v4.content.FileProvider
-import android.view.KeyEvent
-import android.widget.Button
-import android.widget.TextView
-import com.supwisdom.R
-import com.supwisdom.activities.BaseActivity
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.upgrade.mode.EpayUpgradeApi
-import com.supwisdom.auxscreen.AuxScreenController
-import com.supwisdom.utils.CommonUtil
-import com.supwisdom.utils.DateUtil
-import com.supwisdom.utils.ThreadPool
-import java.io.File
-import java.util.*
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-@Suppress("DEPRECATION")
-class UpgradeActivity : BaseActivity() {
-    private val pos = SPApplication.getInstance().getPos()
-    private lateinit var vResult: TextView
-    private lateinit var vUpgradeMsg: TextView
-    private lateinit var vServerUrl: TextView
-    private lateinit var vPosOldVersion: TextView
-    private lateinit var vPosVersion: TextView
-    @Volatile
-    private var isUpgrading = false
-    @Volatile
-    private var keyActive = true
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-        setContentView(R.layout.activity_upgrade)
-        initView()
-        initData()
-    }
-
-    private fun initData() {
-        vPosOldVersion.text = CommonUtil.getVersionName(this)
-    }
-
-    private fun initView() {
-        vResult = this.findViewById(R.id.tv_result) as TextView
-        vUpgradeMsg = this.findViewById(R.id.tv_upgrade_msg) as TextView
-
-        vServerUrl = this.findViewById(R.id.tv_server_url) as TextView
-        vPosOldVersion = this.findViewById(R.id.tv_old_version) as TextView
-        vPosVersion = this.findViewById(R.id.tv_pos_version) as TextView
-        this.findViewById<Button>(R.id.tv_upgrade).setOnClickListener {
-            asyncUpgrade()
-        }
-    }
-
-    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
-        if (event.action == KeyEvent.ACTION_DOWN) {
-            if (isUpgrading || !keyActive) {
-                return super.dispatchKeyEvent(event)
-            }
-            resetCounter(200)
-
-            when (event.keyCode) {
-                KeyEvent.KEYCODE_DEL ->
-                    //cancel
-                    finish()
-                KeyEvent.KEYCODE_ENTER -> {
-                    //ok
-                    asyncUpgrade()
-                }
-            }
-        }
-        return super.dispatchKeyEvent(event)
-    }
-
-    override fun onResume() {
-        super.onResume()
-        keyActive = true
-        refresh()
-    }
-
-    private fun refresh() {
-        isUpgrading = false
-        AuxScreenController.getInstance().refreshTitle("应用在线升级")
-        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime())
-        AuxScreenController.getInstance().refreshContent(
-            Arrays.asList(
-                "当前版本>>", CommonUtil.getVersionName(applicationContext),
-                "确认 --应用升级", "取消 --退出"
-            )
-        )
-    }
-
-    private val upgradeApiCallback = object : EpayUpgradeApi.CallbackInterface {
-        override fun progresss(pro: Int) {
-            runOnUiThread {
-                vUpgradeMsg.text = "$pro%"
-                vUpgradeMsg.setTextColor(resources.getColor(R.color.black))
-                AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("正在下载", "$pro%"))
-            }
-        }
-
-        override fun success(filepath: String) {
-            runOnUiThread {
-                isUpgrading = false
-                vUpgradeMsg.text = "下载成功"
-                vUpgradeMsg.setTextColor(resources.getColor(R.color.black))
-                AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("下载应用成功", "请在大屏确认升级"))
-                val apkFile = File(filepath)
-                installAPK(apkFile)
-            }
-        }
-
-        override fun failed(errmsg: String) {
-            runOnUiThread {
-                isUpgrading = false
-                vUpgradeMsg.text = errmsg
-                vUpgradeMsg.setTextColor(resources.getColor(R.color.cl_red))
-                AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("升级失败", "原因:", errmsg))
-            }
-        }
-    }
-
-    /**
-     * 开始下载apk
-     */
-    fun asyncUpgrade() {
-        if (!isUpgrading) {
-            isUpgrading = true
-            AuxScreenController.getInstance().refreshContent(Arrays.asList<String>("正在升级", "请稍等..."))
-            ThreadPool.getDownloadPool().execute(Runnable {
-                EpayUpgradeApi(upgradeApiCallback).upgrade(
-                    pos.getConfigPara()!!.devphyid!!,
-                    CommonUtil.getVersionName(this)
-                )
-            })
-        }
-    }
-
-    /**
-     * 安装apk
-     */
-    private fun installAPK(apkFile: File) {
-        val intent = Intent(Intent.ACTION_VIEW)
-        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
-            val contentUri = FileProvider.getUriForFile(
-                this, "com.supwisdom.charge.fileprovider", apkFile
-            )
-            intent.setDataAndType(contentUri, "application/vnd.android.package-archive")
-        } else {
-            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive")
-        }
-        startActivity(intent)
-    }
-
-    private var counter: ContinuePressTimer? = null
-
-    private fun resetCounter(timems: Long) {
-        counter?.cancel()
-        if (counter == null) {
-            counter = ContinuePressTimer(timems, 100)
-        }
-        keyActive = false
-        counter!!.start()
-    }
-
-    private inner class ContinuePressTimer internal constructor(millisInFuture: Long, countDownInterval: Long) :
-        CountDownTimer(millisInFuture, countDownInterval) {
-
-        override fun onTick(millisUntilFinished: Long) {
-
-        }
-
-        override fun onFinish() {
-            keyActive = true
-        }
-    }
+package com.supwisdom.activities.upgrade
+
+import android.content.Intent
+import android.net.Uri
+import android.os.Build
+import android.os.Bundle
+import android.os.CountDownTimer
+import android.support.v4.content.FileProvider
+import android.view.KeyEvent
+import android.widget.Button
+import android.widget.TextView
+import com.supwisdom.R
+import com.supwisdom.activities.BaseActivity
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.auxscreen.AuxScreenController
+import com.supwisdom.activities.upgrade.mode.EpayUpgradeApi
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.ThreadPool
+import java.io.File
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+@Suppress("DEPRECATION")
+class UpgradeActivity : BaseActivity() {
+    private val pos = SPApplication.getInstance().getPos()
+    private lateinit var vResult: TextView
+    private lateinit var vUpgradeMsg: TextView
+    private lateinit var vServerUrl: TextView
+    private lateinit var vPosOldVersion: TextView
+    private lateinit var vPosVersion: TextView
+
+    @Volatile
+    private var isUpgrading = false
+
+    @Volatile
+    private var keyActive = true
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_upgrade)
+        initView()
+        initData()
+    }
+
+    private fun initData() {
+        vPosOldVersion.text = CommonUtil.getVersionName(this)
+    }
+
+    private fun initView() {
+        vResult = this.findViewById(R.id.tv_result) as TextView
+        vUpgradeMsg = this.findViewById(R.id.tv_upgrade_msg) as TextView
+
+        vServerUrl = this.findViewById(R.id.tv_server_url) as TextView
+        vPosOldVersion = this.findViewById(R.id.tv_old_version) as TextView
+        vPosVersion = this.findViewById(R.id.tv_pos_version) as TextView
+        this.findViewById<Button>(R.id.tv_upgrade).setOnClickListener {
+            asyncUpgrade()
+        }
+    }
+
+    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
+        if (event.action == KeyEvent.ACTION_DOWN) {
+            if (isUpgrading || !keyActive) {
+                return super.dispatchKeyEvent(event)
+            }
+            resetCounter(200)
+
+            when (event.keyCode) {
+                KeyEvent.KEYCODE_DEL ->
+                    //cancel
+                    finish()
+                KeyEvent.KEYCODE_ENTER -> {
+                    //ok
+                    asyncUpgrade()
+                }
+            }
+        }
+        return super.dispatchKeyEvent(event)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        keyActive = true
+        refresh()
+    }
+
+    private fun refresh() {
+        isUpgrading = false
+        AuxScreenController.getInstance().refreshTitle("应用在线升级")
+        AuxScreenController.getInstance().refreshBottom(DateUtil.getNowDateTime1())
+        AuxScreenController.getInstance().refreshContent(
+            Arrays.asList(
+                "当前版本>>", CommonUtil.getVersionName(applicationContext),
+                "确认 --应用升级", "取消 --退出"
+            )
+        )
+    }
+
+    private val upgradeApiCallback = object : EpayUpgradeApi.CallbackInterface {
+        override fun progresss(pro: Int) {
+            runOnUiThread {
+                vUpgradeMsg.text = "$pro%"
+                vUpgradeMsg.setTextColor(resources.getColor(R.color.black))
+                AuxScreenController.getInstance()
+                    .refreshContent(Arrays.asList<String>("正在下载", "$pro%"))
+            }
+        }
+
+        override fun success(filepath: String) {
+            runOnUiThread {
+                isUpgrading = false
+                vUpgradeMsg.text = "下载成功"
+                vUpgradeMsg.setTextColor(resources.getColor(R.color.black))
+                AuxScreenController.getInstance()
+                    .refreshContent(Arrays.asList<String>("下载应用成功", "请在大屏确认升级"))
+                val apkFile = File(filepath)
+                installAPK(apkFile)
+            }
+        }
+
+        override fun failed(errmsg: String) {
+            runOnUiThread {
+                isUpgrading = false
+                vUpgradeMsg.text = errmsg
+                vUpgradeMsg.setTextColor(resources.getColor(R.color.cl_red))
+                AuxScreenController.getInstance()
+                    .refreshContent(Arrays.asList<String>("升级失败", "原因:", errmsg))
+            }
+        }
+    }
+
+    /**
+     * 开始下载apk
+     */
+    fun asyncUpgrade() {
+        if (!isUpgrading) {
+            isUpgrading = true
+            AuxScreenController.getInstance()
+                .refreshContent(Arrays.asList<String>("正在升级", "请稍等..."))
+            ThreadPool.getDownloadPool().execute(Runnable {
+                EpayUpgradeApi(upgradeApiCallback).upgrade(
+                    pos.getConfigPara()!!.devphyid!!,
+                    CommonUtil.getVersionName(this)
+                )
+            })
+        }
+    }
+
+    /**
+     * 安装apk
+     */
+    private fun installAPK(apkFile: File) {
+        val intent = Intent(Intent.ACTION_VIEW)
+        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
+            val contentUri = FileProvider.getUriForFile(
+                this, "com.supwisdom.charge.fileprovider", apkFile
+            )
+            intent.setDataAndType(contentUri, "application/vnd.android.package-archive")
+        } else {
+            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive")
+        }
+        startActivity(intent)
+    }
+
+    private var counter: ContinuePressTimer? = null
+
+    private fun resetCounter(timems: Long) {
+        counter?.cancel()
+        if (counter == null) {
+            counter = ContinuePressTimer(timems, 100)
+        }
+        keyActive = false
+        counter!!.start()
+    }
+
+    private inner class ContinuePressTimer internal constructor(
+        millisInFuture: Long,
+        countDownInterval: Long
+    ) :
+        CountDownTimer(millisInFuture, countDownInterval) {
+
+        override fun onTick(millisUntilFinished: Long) {
+
+        }
+
+        override fun onFinish() {
+            keyActive = true
+        }
+    }
 }
\ 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 110f204..d593610 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
@@ -1,178 +1,185 @@
-package com.supwisdom.activities.upgrade.mode
-
-import android.text.TextUtils
-import com.supwisdom.activities.YktSession
-import com.supwisdom.bean.UpgradeInfoRetBean
-import com.supwisdom.okhttp.WebParams
-import com.supwisdom.utils.*
-import org.apache.http.HttpStatus
-import java.io.File
-import java.io.FileInputStream
-import java.io.FileOutputStream
-import java.net.HttpURLConnection
-import java.net.URL
-import java.util.*
-
-/**
- * @author zzq
- * @date 2019/4/9
- * @desc 在线升级
- */
-class EpayUpgradeApi constructor(private val callback: CallbackInterface) {
-    private val TIMEOUT = 5 * 1000// 超时
-    private val POSID = "posa711dali"
-
-    fun upgrade(devphyid: String, version: String) {
-        val resp = getAppVersion(devphyid, version)
-        if (resp.retcode != PublicDef.SUCCESS) {
-            callback.failed(resp.retmsg!!)
-            return
-        }
-        val updateFile = FileUtil.getUpdateFile("$POSID.zip")
-        if (updateFile == null) {
-            callback.failed("创建本地文件失败")
-            return
-        }
-        if (!downloadUpdateFile(resp.upgrade_url!!, updateFile, resp.upgrade_version!!)) {
-            return
-        }
-        parseDownloadFile(updateFile.absolutePath, resp.upgrade_version!!)
-    }
-
-    private fun downloadUpdateFile(downUrl: String, file: File, versionName: String): Boolean {
-        var downStep = 0// 提示step
-        val totalSize: Int// 文件总大小
-        var downloadCount = 0// 已经下载好的大小
-        try {
-            val url = URL(downUrl)
-            val urlConnection = url.openConnection() as HttpURLConnection
-            urlConnection.connectTimeout = TIMEOUT
-            urlConnection.readTimeout = TIMEOUT
-            urlConnection.doOutput = true
-            urlConnection.doInput = true
-            urlConnection.useCaches = false
-            // setting serialized
-            urlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object")
-            //default is GET
-            urlConnection.requestMethod = "POST"
-            urlConnection.setRequestProperty("Charsert", "UTF-8")
-            urlConnection.setRequestProperty("connection", "Keep-Alive")
-            urlConnection.addRequestProperty("version", versionName)
-
-            urlConnection.addRequestProperty("username", "supwisdom")
-            urlConnection.addRequestProperty("password", "supwisdom")
-            urlConnection.addRequestProperty("filename", "$POSID.apk")
-
-            //connect to server (tcp)
-            urlConnection.connect()
-            // 获取下载文件的size
-            totalSize = urlConnection.contentLength
-            if (urlConnection.responseCode != HttpStatus.SC_OK) {
-                urlConnection.disconnect()
-                callback.failed("下载文件失败:错误码=${urlConnection.responseCode}")
-                return false
-            }
-            val inputStream = urlConnection.inputStream
-            val outputStream = FileOutputStream(file, false)// 文件存在则覆盖掉
-            val buffer = ByteArray(1024)
-            while (true) {
-                val readSize = inputStream.read(buffer)
-                if (readSize < 0) {
-                    break
-                }
-                outputStream.write(buffer, 0, readSize)
-                downloadCount += readSize// 实时获取下载到的大小
-
-                val progress = downloadCount * 1.0 / totalSize
-                val pro = Math.round(progress * 100).toInt()
-                if (pro - downStep >= 1) {
-                    downStep++
-                    CommonUtil.doSleep(100)
-                    callback.progresss(pro)
-                }
-            }
-            urlConnection.disconnect()
-            inputStream.close()
-            outputStream.close()
-            return true
-        } catch (e: Exception) {
-            e.printStackTrace()
-            callback.failed("下载文件异常:${e.message}")
-            return false
-        }
-    }
-
-    private fun parseDownloadFile(zipFilePath: String, versionName: String): Boolean {
-        try {
-            val index = zipFilePath.lastIndexOf("/")
-            val unZipFilePath = zipFilePath.substring(0, index)
-            ZipUtil.unzip(zipFilePath, unZipFilePath, false)
-            val apkFile = File("$unZipFilePath/$POSID.apk")
-            if (!apkFile.exists()) {
-                callback.failed("未找到文件$POSID.apk")
-                return false
-            }
-
-            val fileHash256 = CryptUtil.HASH256(FileInputStream(apkFile), "nzoqPYMIu91VViA/mEIG5FtJXi8=")
-            if (fileHash256 == null) {
-                callback.failed("计算文件校验数据错误")
-                return false
-            }
-            val signFile = FileInputStream("$unZipFilePath/hash256.sign")
-            val buffer = ByteArray(1024)
-            val length = signFile.read(buffer, 0, buffer.size)
-            if (length < 0) {
-                callback.failed("读取校验文件失败")
-                return false
-            }
-            signFile.close()
-            val signHash256 = String(Arrays.copyOfRange(buffer, 0, length))
-            if (!fileHash256.equals(signHash256, ignoreCase = true)) {
-                callback.failed("文件校验错误")
-                return false
-            }
-            callback.success("$unZipFilePath/$POSID.apk")
-            return true
-        } catch (e: Exception) {
-            e.printStackTrace()
-            callback.failed("文件校验异常:${e.message}")
-            return false
-        }
-    }
-
-    private fun getAppVersion(devphyid: String, version: String): UpgradeInfoRetBean {
-        val params = WebParams()
-        params.setParameter("upgrade_url", POSID)
-            .setParameter("upgrade_version", version)
-            .setParameter("devphyid", devphyid)
-            .setParameter("sourcetype", "pos")
-
-        val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/globalparam", "", params)
-            ?: return UpgradeInfoRetBean(PublicDef.ERROR, "获取版本超时")
-        if (resp.retcode != HttpStatus.SC_OK) {
-            return UpgradeInfoRetBean(resp.retcode, "获取版本错误码=${resp.retcode}")
-        }
-        return try {
-            val bean = GsonUtil.GsonToBean(resp.retjson!!, UpgradeInfoRetBean::class.java)
-            if (bean.retcode != PublicDef.SUCCESS) {
-                return UpgradeInfoRetBean(resp.retcode, "获取版本错误=" + bean.retmsg)
-            }
-            when {
-                TextUtils.isEmpty(bean.upgrade_version) -> UpgradeInfoRetBean(PublicDef.ERROR, "获取版本为空")
-                TextUtils.isEmpty(bean.upgrade_url) -> UpgradeInfoRetBean(PublicDef.ERROR, "获取升级地址为空")
-                else -> bean
-            }
-        } catch (e: Exception) {
-            e.printStackTrace()
-            UpgradeInfoRetBean(PublicDef.ERROR, "获取版本JSON异常:${e.message}")
-        }
-    }
-
-    interface CallbackInterface {
-        fun progresss(pro: Int)
-
-        fun success(filepath: String)
-
-        fun failed(errmsg: String)
-    }
+package com.supwisdom.activities.upgrade.mode
+
+import android.text.TextUtils
+import com.supwisdom.activities.YktSession
+import com.supwisdom.bean.UpgradeInfoRetBean
+import com.supwisdom.okhttp.WebParams
+import com.supwisdom.utils.*
+import org.apache.http.HttpStatus
+import java.io.File
+import java.io.FileInputStream
+import java.io.FileOutputStream
+import java.net.HttpURLConnection
+import java.net.URL
+import java.util.*
+
+/**
+ * @author zzq
+ * @date 2019/4/9
+ * @desc 在线升级
+ */
+class EpayUpgradeApi constructor(private val callback: CallbackInterface) {
+    private val TIMEOUT = 5 * 1000// 超时
+    private val POSID = "posa711dali"
+
+    fun upgrade(devphyid: String, version: String) {
+        val resp = getAppVersion(devphyid, version)
+        if (resp.retcode != PublicDef.SUCCESS) {
+            callback.failed(resp.getErrorMsg())
+            return
+        }
+        val updateFile = FileUtil.getUpdateFile("$POSID.zip")
+        if (updateFile == null) {
+            callback.failed("创建本地文件失败")
+            return
+        }
+        if (!downloadUpdateFile(resp.upgrade_url!!, updateFile, resp.upgrade_version!!)) {
+            return
+        }
+        parseDownloadFile(updateFile.absolutePath, resp.upgrade_version!!)
+    }
+
+    private fun downloadUpdateFile(downUrl: String, file: File, versionName: String): Boolean {
+        var downStep = 0// 提示step
+        val totalSize: Int// 文件总大小
+        var downloadCount = 0// 已经下载好的大小
+        try {
+            val url = URL(downUrl)
+            val urlConnection = url.openConnection() as HttpURLConnection
+            urlConnection.connectTimeout = TIMEOUT
+            urlConnection.readTimeout = TIMEOUT
+            urlConnection.doOutput = true
+            urlConnection.doInput = true
+            urlConnection.useCaches = false
+            // setting serialized
+            urlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object")
+            //default is GET
+            urlConnection.requestMethod = "POST"
+            urlConnection.setRequestProperty("Charsert", "UTF-8")
+            urlConnection.setRequestProperty("connection", "Keep-Alive")
+            urlConnection.addRequestProperty("version", versionName)
+
+            urlConnection.addRequestProperty("username", "supwisdom")
+            urlConnection.addRequestProperty("password", "supwisdom")
+            urlConnection.addRequestProperty("filename", "$POSID.apk")
+
+            //connect to server (tcp)
+            urlConnection.connect()
+            // 获取下载文件的size
+            totalSize = urlConnection.contentLength
+            if (urlConnection.responseCode != HttpStatus.SC_OK) {
+                urlConnection.disconnect()
+                callback.failed("下载文件失败:错误码=${urlConnection.responseCode}")
+                return false
+            }
+            val inputStream = urlConnection.inputStream
+            val outputStream = FileOutputStream(file, false)// 文件存在则覆盖掉
+            val buffer = ByteArray(1024)
+            while (true) {
+                val readSize = inputStream.read(buffer)
+                if (readSize < 0) {
+                    break
+                }
+                outputStream.write(buffer, 0, readSize)
+                downloadCount += readSize// 实时获取下载到的大小
+
+                val progress = downloadCount * 1.0 / totalSize
+                val pro = Math.round(progress * 100).toInt()
+                if (pro - downStep >= 1) {
+                    downStep++
+                    CommonUtil.doSleep(100)
+                    callback.progresss(pro)
+                }
+            }
+            urlConnection.disconnect()
+            inputStream.close()
+            outputStream.close()
+            return true
+        } catch (e: Exception) {
+            e.printStackTrace()
+            callback.failed("下载文件异常:${e.message}")
+            return false
+        }
+    }
+
+    private fun parseDownloadFile(zipFilePath: String, versionName: String): Boolean {
+        try {
+            val index = zipFilePath.lastIndexOf("/")
+            val unZipFilePath = zipFilePath.substring(0, index)
+            ZipUtil.unzip(zipFilePath, unZipFilePath, false)
+            val apkFile = File("$unZipFilePath/$POSID.apk")
+            if (!apkFile.exists()) {
+                callback.failed("未找到文件$POSID.apk")
+                return false
+            }
+
+            val fileHash256 =
+                CryptUtil.HASH256(FileInputStream(apkFile), "nzoqPYMIu91VViA/mEIG5FtJXi8=")
+            if (fileHash256 == null) {
+                callback.failed("计算文件校验数据错误")
+                return false
+            }
+            val signFile = FileInputStream("$unZipFilePath/hash256.sign")
+            val buffer = ByteArray(1024)
+            val length = signFile.read(buffer, 0, buffer.size)
+            if (length < 0) {
+                callback.failed("读取校验文件失败")
+                return false
+            }
+            signFile.close()
+            val signHash256 = String(Arrays.copyOfRange(buffer, 0, length))
+            if (!fileHash256.equals(signHash256, ignoreCase = true)) {
+                callback.failed("文件校验错误")
+                return false
+            }
+            callback.success("$unZipFilePath/$POSID.apk")
+            return true
+        } catch (e: Exception) {
+            e.printStackTrace()
+            callback.failed("文件校验异常:${e.message}")
+            return false
+        }
+    }
+
+    private fun getAppVersion(devphyid: String, version: String): UpgradeInfoRetBean {
+        val params = WebParams()
+        params.setParameter("upgrade_url", POSID)
+            .setParameter("upgrade_version", version)
+            .setParameter("devphyid", devphyid)
+            .setParameter("sourcetype", "pos")
+
+        val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/globalparam", "", params)
+            ?: return UpgradeInfoRetBean(PublicDef.ERROR, "获取版本超时")
+        if (resp.retcode != HttpStatus.SC_OK) {
+            return UpgradeInfoRetBean(resp.retcode, "获取版本错误码=${resp.retcode}")
+        }
+        return try {
+            val bean = GsonUtil.GsonToBean(resp.retjson!!, UpgradeInfoRetBean::class.java)
+            if (bean.retcode != PublicDef.SUCCESS) {
+                return UpgradeInfoRetBean(resp.retcode, "获取版本错误=" + bean.getErrorMsg())
+            }
+            when {
+                TextUtils.isEmpty(bean.upgrade_version) -> UpgradeInfoRetBean(
+                    PublicDef.ERROR,
+                    "获取版本为空"
+                )
+                TextUtils.isEmpty(bean.upgrade_url) -> UpgradeInfoRetBean(
+                    PublicDef.ERROR,
+                    "获取升级地址为空"
+                )
+                else -> bean
+            }
+        } catch (e: Exception) {
+            e.printStackTrace()
+            UpgradeInfoRetBean(PublicDef.ERROR, "获取版本JSON异常:${e.message}")
+        }
+    }
+
+    interface CallbackInterface {
+        fun progresss(pro: Int)
+
+        fun success(filepath: String)
+
+        fun failed(errmsg: String)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/bean/EpaySynoActiveReqBean.java b/app/src/main/java/com/supwisdom/bean/EpaySynoActiveReqBean.java
new file mode 100644
index 0000000..0cc0280
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/bean/EpaySynoActiveReqBean.java
@@ -0,0 +1,17 @@
+package com.supwisdom.bean;
+
+/**
+ * * create by zzq on 2020/8/24
+ * * @desc
+ **/
+public class EpaySynoActiveReqBean {
+    private String license;
+
+    public String getLicense() {
+        return license;
+    }
+
+    public void setLicense(String license) {
+        this.license = license;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/bean/EpaySynoActiveRetBean.java b/app/src/main/java/com/supwisdom/bean/EpaySynoActiveRetBean.java
new file mode 100644
index 0000000..ec06e46
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/bean/EpaySynoActiveRetBean.java
@@ -0,0 +1,26 @@
+package com.supwisdom.bean;
+
+/**
+ * * create by zzq on 2020/8/24
+ * * @desc
+ **/
+public class EpaySynoActiveRetBean {
+    private String license; // 授权文件
+    private String timestamp; // 时间戳
+
+    public String getLicense() {
+        return license;
+    }
+
+    public void setLicense(String license) {
+        this.license = license;
+    }
+
+    public String getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(String timestamp) {
+        this.timestamp = timestamp;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/bean/EpaySynoLicenseUploadRetBean.java b/app/src/main/java/com/supwisdom/bean/EpaySynoLicenseUploadRetBean.java
new file mode 100644
index 0000000..554b4ec
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/bean/EpaySynoLicenseUploadRetBean.java
@@ -0,0 +1,35 @@
+package com.supwisdom.bean;
+
+/**
+ * * create by zzq on 2020/8/24
+ * * @desc
+ **/
+public class EpaySynoLicenseUploadRetBean {
+    private int code;
+    private String message;
+    private String timestamp;
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(String timestamp) {
+        this.timestamp = timestamp;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/bean/EpaySynoRegisterReqBean.java b/app/src/main/java/com/supwisdom/bean/EpaySynoRegisterReqBean.java
new file mode 100644
index 0000000..920551b
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/bean/EpaySynoRegisterReqBean.java
@@ -0,0 +1,26 @@
+package com.supwisdom.bean;
+
+/**
+ * * create by zzq on 2020/8/24
+ * * @desc
+ **/
+public class EpaySynoRegisterReqBean {
+    private String schoolCode;
+    private String termDateTime;
+
+    public String getSchoolCode() {
+        return schoolCode;
+    }
+
+    public void setSchoolCode(String schoolCode) {
+        this.schoolCode = schoolCode;
+    }
+
+    public String getTermDateTime() {
+        return termDateTime;
+    }
+
+    public void setTermDateTime(String termDateTime) {
+        this.termDateTime = termDateTime;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/bean/EpaySynoRegisterStatusRetBean.java b/app/src/main/java/com/supwisdom/bean/EpaySynoRegisterStatusRetBean.java
new file mode 100644
index 0000000..bb51445
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/bean/EpaySynoRegisterStatusRetBean.java
@@ -0,0 +1,26 @@
+package com.supwisdom.bean;
+
+/**
+ * * create by zzq on 2020/8/24
+ * * @desc
+ **/
+public class EpaySynoRegisterStatusRetBean {
+    private String timestamp;
+    private String status; //可选值：unregister , unauthorized , authorized , activated
+
+    public String getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(String timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+}
diff --git a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
index 66047bc..57adf5a 100644
--- a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
+++ b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
@@ -1,124 +1,125 @@
-package com.supwisdom.db
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-object BeanPropEnum {
-    enum class Syspara {
-        id,
-        returnFlag,
-        heatBeat,
-        offlineEnable,
-        maxOfflineDays,
-        maxDayOfflineAmt,
-        mngpasswd,
-        fixpayGap,
-        consumeShowtime,
-        consumeFailShowtime,
-        commTime
-    }
-
-    enum class ConfigPara {
-        id,
-        mode,
-        tenantid,
-        devphyid,
-        psamno,
-        epayIP,
-        epayPort,
-        epayUri,
-        managePwd,
-        initOK
-    }
-
-    enum class DynamicPara {
-        id,
-        appid,
-        appsecret,
-        deviceid,
-        merchaccno,
-        shopname,
-        onlineseqno,
-        offlineseqno,
-        paraverno,
-        paragroupid,
-        whitelistid,
-        cardverno,
-        jwt,
-        jwtexpire,
-        token
-    }
-
-    enum class ControlPara {
-        paraname,
-        paraval
-    }
-
-    enum class TransdtlOnline {
-        devphyid,
-        transdate,
-        transtime,
-        devseqno,
-        cardno,
-        cardphyid,
-        qrcode,
-        transtype,
-        payamt,
-        extraamt,
-        managefeetype,
-        username,
-        billno,
-        reversalflag,
-        reversalbillno,
-        status,
-        upflag
-    }
-
-    enum class TransdtlOffline {
-        devphyid,
-        transdate,
-        transtime,
-        devseqno,
-        cardno,
-        cardphyid,
-        payamt,
-        extraamt,
-        reversalflag,
-        reversalseqno,
-        reversaltransdate,
-        reversaltranstime,
-        status,
-        upflag
-    }
-
-    enum class WhiteList {
-        cardphyid,
-        cardno,
-        status
-    }
-
-    enum class TransdtlUnion {
-        username,
-        cardno,
-        transdate,
-        transtime,
-        devseqno,
-        payway,
-        reversalflag,
-        payamt,
-        status,
-        upflag
-    }
-
-    enum class HotkeyPay {
-        key,
-        amount
-    }
-    enum class PeriodFixPay{
-        id,
-        begintime,
-        endtime,
-        amount
-    }
+package com.supwisdom.db
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+object BeanPropEnum {
+    enum class Syspara {
+        id,
+        returnFlag,
+        heatBeat,
+        offlineEnable,
+        maxOfflineDays,
+        maxDayOfflineAmt,
+        mngpasswd,
+        fixpayGap,
+        consumeShowtime,
+        consumeFailShowtime,
+        commTime,
+        synoCode
+    }
+
+    enum class ConfigPara {
+        id,
+        mode,
+        tenantid,
+        devphyid,
+        psamno,
+        epayIP,
+        epayPort,
+        epayUri,
+        managePwd,
+        initOK
+    }
+
+    enum class DynamicPara {
+        id,
+        appid,
+        appsecret,
+        deviceid,
+        merchaccno,
+        shopname,
+        onlineseqno,
+        offlineseqno,
+        paraverno,
+        paragroupid,
+        whitelistid,
+        cardverno,
+        jwt,
+        jwtexpire,
+        token
+    }
+
+    enum class ControlPara {
+        paraname,
+        paraval
+    }
+
+    enum class TransdtlOnline {
+        devphyid,
+        transdate,
+        transtime,
+        devseqno,
+        cardno,
+        cardphyid,
+        qrcode,
+        transtype,
+        payamt,
+        extraamt,
+        managefeetype,
+        username,
+        billno,
+        reversalflag,
+        reversalbillno,
+        status,
+        upflag
+    }
+
+    enum class TransdtlOffline {
+        devphyid,
+        transdate,
+        transtime,
+        devseqno,
+        cardno,
+        cardphyid,
+        payamt,
+        extraamt,
+        reversalflag,
+        reversalseqno,
+        reversaltransdate,
+        reversaltranstime,
+        status,
+        upflag
+    }
+
+    enum class WhiteList {
+        cardphyid,
+        cardno,
+        status
+    }
+
+    enum class TransdtlUnion {
+        username,
+        cardno,
+        transdate,
+        transtime,
+        devseqno,
+        payway,
+        reversalflag,
+        payamt,
+        status,
+        upflag
+    }
+
+    enum class HotkeyPay {
+        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/ConfigParaDao.kt b/app/src/main/java/com/supwisdom/db/ConfigParaDao.kt
index 1b7df2d..4d6a35b 100644
--- a/app/src/main/java/com/supwisdom/db/ConfigParaDao.kt
+++ b/app/src/main/java/com/supwisdom/db/ConfigParaDao.kt
@@ -1,120 +1,122 @@
-package com.supwisdom.db
-
-import android.content.ContentValues
-import android.content.Context
-import android.database.Cursor
-import com.supwisdom.entity.ConfigParaRecord
-import java.util.concurrent.locks.Lock
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-class ConfigParaDao constructor(context: Context) {
-    private val INDEX = "1"
-    private val TABLE = DBLocalHelper.TABLE_NAME_CONFIGPARA
-    private val dbHelper = DBLocalHelper.getInstance(context)
-
-    fun getLock(): Lock {
-        return dbHelper.getLock()
-    }
-
-    fun replace(record: ConfigParaRecord): 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 update(record: ConfigParaRecord): Boolean {
-        val db = dbHelper.writableDatabase
-        val values = getContentValues(record)
-        try {
-            db.beginTransaction()
-            if (db.update(
-                    TABLE,
-                    values,
-                    BeanPropEnum.ConfigPara.id.toString() + "=?",
-                    arrayOf(INDEX)
-                ) > 0
-            ) {
-                db.setTransactionSuccessful()
-                return true
-            }
-        } finally {
-            db.endTransaction()
-        }
-        return false
-    }
-
-    fun get(): ConfigParaRecord? {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        try {
-            cursor = db.query(
-                TABLE, null, BeanPropEnum.ConfigPara.id.toString() + "=?",
-                arrayOf(INDEX), null, null, null
-            )
-            if (cursor != null && cursor.moveToNext()) {
-                return getRecord(cursor)
-            }
-        } finally {
-            cursor?.close()
-        }
-        return null
-    }
-
-    private fun getRecord(cursor: Cursor): ConfigParaRecord {
-        val record = ConfigParaRecord()
-        record.mode = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.ConfigPara.mode.toString()))
-        record.tenantId = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ConfigPara.tenantid.toString()))
-        record.devphyid = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ConfigPara.devphyid.toString()))
-        record.epayIP = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ConfigPara.epayIP.toString()))
-        record.epayPort = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.ConfigPara.epayPort.toString()))
-        record.epayUri = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ConfigPara.epayUri.toString()))
-        record.shopPwd = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ConfigPara.managePwd.toString()))
-        val value = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.ConfigPara.initOK.toString()))
-        record.initOK = value == 1
-        return record
-    }
-
-    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 getContentValues(record: ConfigParaRecord): ContentValues {
-        val values = ContentValues()
-        values.put(BeanPropEnum.ConfigPara.id.toString(), INDEX)
-        values.put(BeanPropEnum.ConfigPara.mode.toString(), record.mode)
-        values.put(BeanPropEnum.ConfigPara.tenantid.toString(), record.tenantId)
-        values.put(BeanPropEnum.ConfigPara.devphyid.toString(), record.devphyid)
-        values.put(BeanPropEnum.ConfigPara.epayIP.toString(), record.epayIP)
-        values.put(BeanPropEnum.ConfigPara.epayPort.toString(), record.epayPort)
-        values.put(BeanPropEnum.ConfigPara.epayUri.toString(), record.epayUri)
-        values.put(BeanPropEnum.ConfigPara.managePwd.toString(), record.shopPwd)
-        if (record.initOK) {
-            values.put(BeanPropEnum.ConfigPara.initOK.toString(), 1)
-        } else {
-            values.put(BeanPropEnum.ConfigPara.initOK.toString(), 0)
-        }
-        return values
-    }
+package com.supwisdom.db
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import com.supwisdom.entity.ConfigParaRecord
+import java.util.concurrent.locks.Lock
+import java.util.concurrent.locks.ReentrantLock
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class ConfigParaDao constructor(context: Context) {
+    private val INDEX = "1"
+    private val TABLE = DBLocalHelper.TABLE_NAME_CONFIGPARA
+    private val dbHelper = DBLocalHelper.getInstance(context)
+
+    private val lock = ReentrantLock()
+    fun getLock(): Lock {
+        return lock
+    }
+
+    fun replace(record: ConfigParaRecord): 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 update(record: ConfigParaRecord): Boolean {
+        val db = dbHelper.writableDatabase
+        val values = getContentValues(record)
+        try {
+            db.beginTransaction()
+            if (db.update(
+                    TABLE,
+                    values,
+                    BeanPropEnum.ConfigPara.id.toString() + "=?",
+                    arrayOf(INDEX)
+                ) > 0
+            ) {
+                db.setTransactionSuccessful()
+                return true
+            }
+        } finally {
+            db.endTransaction()
+        }
+        return false
+    }
+
+    fun get(): ConfigParaRecord? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        try {
+            cursor = db.query(
+                TABLE, null, BeanPropEnum.ConfigPara.id.toString() + "=?",
+                arrayOf(INDEX), null, null, null
+            )
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor)
+            }
+        } finally {
+            cursor?.close()
+        }
+        return null
+    }
+
+    private fun getRecord(cursor: Cursor): ConfigParaRecord {
+        val record = ConfigParaRecord()
+        record.mode = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.ConfigPara.mode.toString()))
+        record.tenantId = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ConfigPara.tenantid.toString()))
+        record.devphyid = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ConfigPara.devphyid.toString()))
+        record.epayIP = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ConfigPara.epayIP.toString()))
+        record.epayPort = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.ConfigPara.epayPort.toString()))
+        record.epayUri = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ConfigPara.epayUri.toString()))
+        record.shopPwd = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ConfigPara.managePwd.toString()))
+        val value = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.ConfigPara.initOK.toString()))
+        record.initOK = value == 1
+        return record
+    }
+
+    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 getContentValues(record: ConfigParaRecord): ContentValues {
+        val values = ContentValues()
+        values.put(BeanPropEnum.ConfigPara.id.toString(), INDEX)
+        values.put(BeanPropEnum.ConfigPara.mode.toString(), record.mode)
+        values.put(BeanPropEnum.ConfigPara.tenantid.toString(), record.tenantId)
+        values.put(BeanPropEnum.ConfigPara.devphyid.toString(), record.devphyid)
+        values.put(BeanPropEnum.ConfigPara.epayIP.toString(), record.epayIP)
+        values.put(BeanPropEnum.ConfigPara.epayPort.toString(), record.epayPort)
+        values.put(BeanPropEnum.ConfigPara.epayUri.toString(), record.epayUri)
+        values.put(BeanPropEnum.ConfigPara.managePwd.toString(), record.shopPwd)
+        if (record.initOK) {
+            values.put(BeanPropEnum.ConfigPara.initOK.toString(), 1)
+        } else {
+            values.put(BeanPropEnum.ConfigPara.initOK.toString(), 0)
+        }
+        return values
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/ControlParaDao.kt b/app/src/main/java/com/supwisdom/db/ControlParaDao.kt
index d683d9c..6e92af4 100644
--- a/app/src/main/java/com/supwisdom/db/ControlParaDao.kt
+++ b/app/src/main/java/com/supwisdom/db/ControlParaDao.kt
@@ -1,118 +1,120 @@
-package com.supwisdom.db
-
-import android.content.ContentValues
-import android.content.Context
-import android.database.Cursor
-import com.supwisdom.entity.ControlParaRecord
-import java.util.concurrent.locks.Lock
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-class ControlParaDao constructor(context: Context) {
-    private val dbHelper = DBParaHelper.getInstance(context)
-    private val TABLE = DBParaHelper.TABLE_NAME_CONTROLPARA
-
-    fun getLock(): Lock {
-        return dbHelper.getLock()
-    }
-
-    fun replace(record: ControlParaRecord): Boolean {
-        val db = dbHelper.readableDatabase
-        val values = getContentValues(record)
-        try {
-            db.beginTransaction()
-            if (db.replace(TABLE, null, values) > 0) {
-                return false
-            }
-            db.setTransactionSuccessful()
-            return true
-        } finally {
-            db.endTransaction()
-        }
-    }
-
-    fun replace(paraname: String, paraval: String): Boolean {
-        val db = dbHelper.readableDatabase
-        val values = ContentValues()
-        values.put(BeanPropEnum.ControlPara.paraname.toString(), paraname)
-        values.put(BeanPropEnum.ControlPara.paraval.toString(), paraval)
-        try {
-            db.beginTransaction()
-            if (db.replace(TABLE, null, values) < 0) {
-                return false
-            }
-            db.setTransactionSuccessful()
-            return true
-        } finally {
-            db.endTransaction()
-        }
-    }
-
-    fun update(record: ControlParaRecord): Boolean {
-        val db = dbHelper.writableDatabase
-        val values = getContentValues(record)
-        try {
-            db.beginTransaction()
-            if (db.update(
-                    TABLE,
-                    values,
-                    BeanPropEnum.ControlPara.paraname.toString() + "=?",
-                    arrayOf(record.paraname)
-                ) > 0
-            ) {
-                db.setTransactionSuccessful()
-                return true
-            }
-        } finally {
-            db.endTransaction()
-        }
-        return false
-    }
-
-    fun get(paraname: String): ControlParaRecord? {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        try {
-            cursor = db.query(
-                TABLE, null, BeanPropEnum.ControlPara.paraname.toString() + "=?",
-                arrayOf(paraname), null, null, null
-            )
-            if (cursor != null && cursor.moveToNext()) {
-                return getRecord(cursor)
-            }
-        } finally {
-            cursor?.close()
-        }
-        return null
-    }
-
-    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): ControlParaRecord {
-        val record = ControlParaRecord()
-        record.paraname = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ControlPara.paraname.toString()))
-        record.paraval = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ControlPara.paraval.toString()))
-        return record
-    }
-
-    private fun getContentValues(record: ControlParaRecord): ContentValues {
-        val values = ContentValues()
-        values.put(BeanPropEnum.ControlPara.paraname.toString(), record.paraname)
-        values.put(BeanPropEnum.ControlPara.paraval.toString(), record.paraval)
-        return values
-    }
+package com.supwisdom.db
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import com.supwisdom.entity.ControlParaRecord
+import java.util.concurrent.locks.Lock
+import java.util.concurrent.locks.ReentrantLock
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class ControlParaDao constructor(context: Context) {
+    private val dbHelper = DBParaHelper.getInstance(context)
+    private val TABLE = DBParaHelper.TABLE_NAME_CONTROLPARA
+
+    private val lock = ReentrantLock()
+    fun getLock(): Lock {
+        return lock
+    }
+
+    fun replace(record: ControlParaRecord): Boolean {
+        val db = dbHelper.readableDatabase
+        val values = getContentValues(record)
+        try {
+            db.beginTransaction()
+            if (db.replace(TABLE, null, values) > 0) {
+                return false
+            }
+            db.setTransactionSuccessful()
+            return true
+        } finally {
+            db.endTransaction()
+        }
+    }
+
+    fun replace(paraname: String, paraval: String): Boolean {
+        val db = dbHelper.readableDatabase
+        val values = ContentValues()
+        values.put(BeanPropEnum.ControlPara.paraname.toString(), paraname)
+        values.put(BeanPropEnum.ControlPara.paraval.toString(), paraval)
+        try {
+            db.beginTransaction()
+            if (db.replace(TABLE, null, values) < 0) {
+                return false
+            }
+            db.setTransactionSuccessful()
+            return true
+        } finally {
+            db.endTransaction()
+        }
+    }
+
+    fun update(record: ControlParaRecord): Boolean {
+        val db = dbHelper.writableDatabase
+        val values = getContentValues(record)
+        try {
+            db.beginTransaction()
+            if (db.update(
+                    TABLE,
+                    values,
+                    BeanPropEnum.ControlPara.paraname.toString() + "=?",
+                    arrayOf(record.paraname)
+                ) > 0
+            ) {
+                db.setTransactionSuccessful()
+                return true
+            }
+        } finally {
+            db.endTransaction()
+        }
+        return false
+    }
+
+    fun get(paraname: String): ControlParaRecord? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        try {
+            cursor = db.query(
+                TABLE, null, BeanPropEnum.ControlPara.paraname.toString() + "=?",
+                arrayOf(paraname), null, null, null
+            )
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor)
+            }
+        } finally {
+            cursor?.close()
+        }
+        return null
+    }
+
+    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): ControlParaRecord {
+        val record = ControlParaRecord()
+        record.paraname = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ControlPara.paraname.toString()))
+        record.paraval = cursor.getString(cursor.getColumnIndex(BeanPropEnum.ControlPara.paraval.toString()))
+        return record
+    }
+
+    private fun getContentValues(record: ControlParaRecord): ContentValues {
+        val values = ContentValues()
+        values.put(BeanPropEnum.ControlPara.paraname.toString(), record.paraname)
+        values.put(BeanPropEnum.ControlPara.paraval.toString(), record.paraval)
+        return values
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/DBLocalHelper.kt b/app/src/main/java/com/supwisdom/db/DBLocalHelper.kt
index 6b11ddf..39dedd6 100644
--- a/app/src/main/java/com/supwisdom/db/DBLocalHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBLocalHelper.kt
@@ -1,67 +1,60 @@
-package com.supwisdom.db
-
-import android.content.Context
-import android.database.sqlite.SQLiteDatabase
-import android.database.sqlite.SQLiteOpenHelper
-import java.util.concurrent.locks.Lock
-import java.util.concurrent.locks.ReentrantLock
-
-/**
- ** create by zzq on 2019/7/31
- ** @desc 本地配置文件
- **/
-class DBLocalHelper private constructor(context: Context) :
-    SQLiteOpenHelper(context, DB_NAME, null, VERSION) {
-    companion object {
-        private val DB_NAME = "db_local_config"
-        private val VERSION = 2
-        private var instance: DBLocalHelper? = null
-
-        const val TABLE_NAME_CONFIGPARA = "tb_configpara"
-
-        fun getInstance(context: Context): DBLocalHelper {
-            if (null == instance) {
-                synchronized(DBLocalHelper::class.java) {
-                    if (null == instance) {
-                        instance = DBLocalHelper(context)
-                    }
-                }
-            }
-            return instance!!
-        }
-    }
-
-    /**
-     * SQL for create table
-     */
-    private val CREATE_TABLE_NAME_CONFIGPARA = ("create table IF NOT EXISTS "
-            + TABLE_NAME_CONFIGPARA + " ( "
-            + BeanPropEnum.ConfigPara.id + " long primary key, "
-            + BeanPropEnum.ConfigPara.mode + " integer, "
-            + BeanPropEnum.ConfigPara.tenantid + " varchar(64), "
-            + BeanPropEnum.ConfigPara.devphyid + " varchar(8), "
-            + BeanPropEnum.ConfigPara.psamno + " varchar(12), "
-            + BeanPropEnum.ConfigPara.epayIP + " varchar(128), "
-            + BeanPropEnum.ConfigPara.epayPort + " integer, "
-            + BeanPropEnum.ConfigPara.epayUri + " varchar(128), "
-            + BeanPropEnum.ConfigPara.managePwd + " varchar(6),"
-            + BeanPropEnum.ConfigPara.initOK + " integer ) ")
-    private val DROP_TABLE_NAME_CONFIGPARA = "DROP TABLE IF EXISTS $TABLE_NAME_CONFIGPARA"
-
-    private val lock = ReentrantLock()
-    fun getLock(): Lock {
-        return lock
-    }
-
-    override fun onCreate(db: SQLiteDatabase) {
-        db.execSQL(CREATE_TABLE_NAME_CONFIGPARA)
-    }
-
-    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
-        if (oldVersion < newVersion) {
-            if (2 <= newVersion && oldVersion < 2) {
-                db.execSQL("alter table $TABLE_NAME_CONFIGPARA add column ${BeanPropEnum.ConfigPara.tenantid} varchar(64)")
-            }
-        }
-    }
+package com.supwisdom.db
+
+import android.content.Context
+import android.database.sqlite.SQLiteDatabase
+import android.database.sqlite.SQLiteOpenHelper
+
+/**
+ ** create by zzq on 2019/7/31
+ ** @desc 本地配置文件
+ **/
+class DBLocalHelper private constructor(context: Context) :
+    SQLiteOpenHelper(context, DB_NAME, null, VERSION) {
+    companion object {
+        private val DB_NAME = "db_local_config"
+        private val VERSION = 2
+        private var instance: DBLocalHelper? = null
+
+        const val TABLE_NAME_CONFIGPARA = "tb_configpara"
+
+        fun getInstance(context: Context): DBLocalHelper {
+            if (null == instance) {
+                synchronized(DBLocalHelper::class.java) {
+                    if (null == instance) {
+                        instance = DBLocalHelper(context)
+                    }
+                }
+            }
+            return instance!!
+        }
+    }
+
+    /**
+     * SQL for create table
+     */
+    private val CREATE_TABLE_NAME_CONFIGPARA = ("create table IF NOT EXISTS "
+            + TABLE_NAME_CONFIGPARA + " ( "
+            + BeanPropEnum.ConfigPara.id + " long primary key, "
+            + BeanPropEnum.ConfigPara.mode + " integer, "
+            + BeanPropEnum.ConfigPara.tenantid + " varchar(64), "
+            + BeanPropEnum.ConfigPara.devphyid + " varchar(8), "
+            + BeanPropEnum.ConfigPara.psamno + " varchar(12), "
+            + BeanPropEnum.ConfigPara.epayIP + " varchar(128), "
+            + BeanPropEnum.ConfigPara.epayPort + " integer, "
+            + BeanPropEnum.ConfigPara.epayUri + " varchar(128), "
+            + BeanPropEnum.ConfigPara.managePwd + " varchar(6),"
+            + BeanPropEnum.ConfigPara.initOK + " integer ) ")
+    private val DROP_TABLE_NAME_CONFIGPARA = "DROP TABLE IF EXISTS $TABLE_NAME_CONFIGPARA"
+
+    override fun onCreate(db: SQLiteDatabase) {
+        db.execSQL(CREATE_TABLE_NAME_CONFIGPARA)
+    }
+
+    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
+        if (oldVersion < newVersion) {
+            if (2 <= newVersion && oldVersion < 2) {
+                db.execSQL("alter table $TABLE_NAME_CONFIGPARA add column ${BeanPropEnum.ConfigPara.tenantid} varchar(64)")
+            }
+        }
+    }
 }
\ 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 8a0f51d..0743d76 100644
--- a/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
@@ -1,119 +1,119 @@
-package com.supwisdom.db
-
-import android.content.Context
-import android.database.sqlite.SQLiteDatabase
-import android.database.sqlite.SQLiteOpenHelper
-import java.util.concurrent.locks.Lock
-import java.util.concurrent.locks.ReentrantLock
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-class DBParaHelper private constructor(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, VERSION) {
-    companion object {
-        private val DB_NAME = "db_para"
-        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 {
-            if (null == instance) {
-                synchronized(DBParaHelper::class.java) {
-                    if (null == instance) {
-                        instance = DBParaHelper(context)
-                    }
-                }
-            }
-            return instance!!
-        }
-    }
-
-
-    /**
-     * 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 + " long primary key,"
-            + BeanPropEnum.HotkeyPay.amount + " integer)")
-    private val CREATE_TABLE_NAME_WHITELIST = ("create table IF NOT EXISTS "
-            + TABLE_NAME_WHITELIST + " ( "
-            + BeanPropEnum.WhiteList.cardphyid + " varchar(32),"
-            + BeanPropEnum.WhiteList.cardno + " varchar(32),"
-            + BeanPropEnum.WhiteList.status + " varchar(16),"
-            + "primary key ("
-            + BeanPropEnum.WhiteList.cardphyid + ","
-            + BeanPropEnum.WhiteList.cardno + ") )")
-
-    private val CREATE_TABLE_NAME_CONTROLPARA = ("create table IF NOT EXISTS "
-            + TABLE_NAME_CONTROLPARA + " ( "
-            + BeanPropEnum.ControlPara.paraname + " varchar(64) primary key,"
-            + BeanPropEnum.ControlPara.paraval + " varchar(64) )")
-    private val CREATE_TABLE_NAME_DYNAMICPARA = ("create table IF NOT EXISTS "
-            + TABLE_NAME_DYNAMICPARA + " ( "
-            + BeanPropEnum.DynamicPara.id + " long primary key, "
-            + BeanPropEnum.DynamicPara.appid + " varchar(16), "
-            + BeanPropEnum.DynamicPara.appsecret + " varchar(128), "
-            + BeanPropEnum.DynamicPara.deviceid + " integer, "
-            + BeanPropEnum.DynamicPara.merchaccno + " integer, "
-            + BeanPropEnum.DynamicPara.shopname + " varchar(32), "
-            + BeanPropEnum.DynamicPara.onlineseqno + " integer, "
-            + BeanPropEnum.DynamicPara.offlineseqno + " integer, "
-            + BeanPropEnum.DynamicPara.paraverno + " integer, "
-            + BeanPropEnum.DynamicPara.paragroupid + " integer, "
-            + BeanPropEnum.DynamicPara.whitelistid + " integer, "
-            + BeanPropEnum.DynamicPara.cardverno + " varchar(32),"
-            + BeanPropEnum.DynamicPara.jwt + " varchar(254),"
-            + BeanPropEnum.DynamicPara.jwtexpire + " varchar(16),"
-            + BeanPropEnum.DynamicPara.token + " varchar(32) )")
-    private val DROP_TABLE_NAME_DYNAMICPARA = "DROP TABLE IF EXISTS $TABLE_NAME_DYNAMICPARA"
-    private val CREATE_TABLE_NAME_SYSPARA = ("create table IF NOT EXISTS "
-            + TABLE_NAME_SYSPARA + " ( "
-            + BeanPropEnum.Syspara.id + " long primary key, "
-            + BeanPropEnum.Syspara.returnFlag + " integer, "
-            + BeanPropEnum.Syspara.heatBeat + " integer, "
-            + BeanPropEnum.Syspara.offlineEnable + " integer, "
-            + BeanPropEnum.Syspara.maxOfflineDays + " integer, "
-            + BeanPropEnum.Syspara.maxDayOfflineAmt + " integer, "
-            + BeanPropEnum.Syspara.mngpasswd + " char(6), "
-            + BeanPropEnum.Syspara.fixpayGap + " integer, "
-            + BeanPropEnum.Syspara.consumeShowtime + " integer, "
-            + BeanPropEnum.Syspara.consumeFailShowtime + " integer, "
-            + BeanPropEnum.Syspara.commTime + " integer )")
-    private val DROP_TABLE_NAME_SYSPARA = "DROP TABLE IF EXISTS $TABLE_NAME_SYSPARA"
-
-    private val lock = ReentrantLock()
-    fun getLock(): Lock {
-        return lock
-    }
-
-    override fun onCreate(db: SQLiteDatabase) {
-        db.execSQL(CREATE_TABLE_NAME_SYSPARA)
-        db.execSQL(CREATE_TABLE_NAME_DYNAMICPARA)
-        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(CREATE_TABLE_NAME_PERIOD_FIX)
-            }
-        }
-    }
+package com.supwisdom.db
+
+import android.content.Context
+import android.database.sqlite.SQLiteDatabase
+import android.database.sqlite.SQLiteOpenHelper
+import java.util.concurrent.locks.Lock
+import java.util.concurrent.locks.ReentrantLock
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class DBParaHelper private constructor(context: Context) :
+    SQLiteOpenHelper(context, DB_NAME, null, VERSION) {
+    companion object {
+        private val DB_NAME = "db_para"
+        private val VERSION = 3
+
+        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 {
+            if (null == instance) {
+                synchronized(DBParaHelper::class.java) {
+                    if (null == instance) {
+                        instance = DBParaHelper(context)
+                    }
+                }
+            }
+            return instance!!
+        }
+    }
+
+
+    /**
+     * 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) default 0,"
+            + BeanPropEnum.PeriodFixPay.endtime + " varchar(4) default 0,"
+            + BeanPropEnum.PeriodFixPay.amount + " integer default 0 )")
+    private val CREATE_TABLE_NAME_HOTKEY = ("create table IF NOT EXISTS "
+            + TABLE_NAME_HOTKEY + " ( "
+            + BeanPropEnum.HotkeyPay.key + " long primary key,"
+            + BeanPropEnum.HotkeyPay.amount + " integer)")
+    private val CREATE_TABLE_NAME_WHITELIST = ("create table IF NOT EXISTS "
+            + TABLE_NAME_WHITELIST + " ( "
+            + BeanPropEnum.WhiteList.cardphyid + " varchar(32) default 0,"
+            + BeanPropEnum.WhiteList.cardno + " varchar(32) default 0,"
+            + BeanPropEnum.WhiteList.status + " varchar(16) default 0,"
+            + "primary key ("
+            + BeanPropEnum.WhiteList.cardphyid + ","
+            + BeanPropEnum.WhiteList.cardno + ") )")
+
+    private val CREATE_TABLE_NAME_CONTROLPARA = ("create table IF NOT EXISTS "
+            + TABLE_NAME_CONTROLPARA + " ( "
+            + BeanPropEnum.ControlPara.paraname + " varchar(64) primary key,"
+            + BeanPropEnum.ControlPara.paraval + " varchar(64) default 0)")
+    private val CREATE_TABLE_NAME_DYNAMICPARA = ("create table IF NOT EXISTS "
+            + TABLE_NAME_DYNAMICPARA + " ( "
+            + BeanPropEnum.DynamicPara.id + " long primary key, "
+            + BeanPropEnum.DynamicPara.appid + " varchar(16) default 0, "
+            + BeanPropEnum.DynamicPara.appsecret + " varchar(128) default 0, "
+            + BeanPropEnum.DynamicPara.deviceid + " integer default 0, "
+            + BeanPropEnum.DynamicPara.merchaccno + " integer default 0, "
+            + BeanPropEnum.DynamicPara.shopname + " varchar(32) default 0, "
+            + BeanPropEnum.DynamicPara.onlineseqno + " integer default 0, "
+            + BeanPropEnum.DynamicPara.offlineseqno + " integer default 0, "
+            + BeanPropEnum.DynamicPara.paraverno + " integer default 0, "
+            + BeanPropEnum.DynamicPara.paragroupid + " integer default 0, "
+            + BeanPropEnum.DynamicPara.whitelistid + " integer default 0, "
+            + BeanPropEnum.DynamicPara.cardverno + " varchar(32) default 0,"
+            + BeanPropEnum.DynamicPara.jwt + " varchar(254) default 0,"
+            + BeanPropEnum.DynamicPara.jwtexpire + " varchar(16) default 0,"
+            + BeanPropEnum.DynamicPara.token + " varchar(32) default 0)")
+    private val DROP_TABLE_NAME_DYNAMICPARA = "DROP TABLE IF EXISTS $TABLE_NAME_DYNAMICPARA"
+    private val CREATE_TABLE_NAME_SYSPARA = ("create table IF NOT EXISTS "
+            + TABLE_NAME_SYSPARA + " ( "
+            + BeanPropEnum.Syspara.id + " long primary key, "
+            + BeanPropEnum.Syspara.returnFlag + " integer default 0, "
+            + BeanPropEnum.Syspara.heatBeat + " integer default 0, "
+            + BeanPropEnum.Syspara.offlineEnable + " integer default 0, "
+            + BeanPropEnum.Syspara.maxOfflineDays + " integer default 0,"
+            + BeanPropEnum.Syspara.maxDayOfflineAmt + " integer default 0,"
+            + BeanPropEnum.Syspara.mngpasswd + " varchar(6) default 0, "
+            + BeanPropEnum.Syspara.fixpayGap + " integer default 0,"
+            + BeanPropEnum.Syspara.consumeShowtime + " integer default 0,"
+            + BeanPropEnum.Syspara.synoCode + " integer default 0,"
+            + BeanPropEnum.Syspara.consumeFailShowtime + " integer default 0,"
+            + BeanPropEnum.Syspara.commTime + " integer default 0)")
+    private val DROP_TABLE_NAME_SYSPARA = "DROP TABLE IF EXISTS $TABLE_NAME_SYSPARA"
+
+    override fun onCreate(db: SQLiteDatabase) {
+        db.execSQL(CREATE_TABLE_NAME_SYSPARA)
+        db.execSQL(CREATE_TABLE_NAME_DYNAMICPARA)
+        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(CREATE_TABLE_NAME_PERIOD_FIX)
+            }
+            if (oldVersion < 3 && newVersion >= 3) {
+                db.execSQL("alter table add column ${BeanPropEnum.Syspara.synoCode} integer default 0")
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt b/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
index 328f06d..790a7fb 100644
--- a/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
@@ -1,87 +1,91 @@
-package com.supwisdom.db
-
-import android.content.Context
-import android.database.sqlite.SQLiteDatabase
-import android.database.sqlite.SQLiteOpenHelper
-import java.util.concurrent.locks.Lock
-import java.util.concurrent.locks.ReentrantLock
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-class DBTransdtlHelper private constructor(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, VERSION) {
-    companion object {
-        private val DB_NAME = "db_transdtl"
-        private val VERSION = 1
-        private var instance: DBTransdtlHelper? = null
-
-        const val TABLE_NAME_DTL_ONLINE = "tb_dtl_online"
-        const val TABLE_NAME_DTL_OFFLINE = "tb_dtl_offline"
-
-        fun getInstance(context: Context): DBTransdtlHelper {
-            if (null == instance) {
-                synchronized(DBTransdtlHelper::class.java) {
-                    if (null == instance) {
-                        instance = DBTransdtlHelper(context)
-                    }
-                }
-            }
-            return instance!!
-        }
-    }
-
-    /**
-     * SQL for create table
-     */
-    private val CRAETE_TABLE_NAME_DTL_ONLINE = ("create table IF NOT EXISTS "
-            + TABLE_NAME_DTL_ONLINE + " ( "
-            + BeanPropEnum.TransdtlOnline.devphyid + " char(8),"
-            + BeanPropEnum.TransdtlOnline.transdate + " char(8),"
-            + BeanPropEnum.TransdtlOnline.transtime + " char(6),"
-            + BeanPropEnum.TransdtlOnline.devseqno + " long primary key,"
-            + BeanPropEnum.TransdtlOnline.cardno + " varchar(32),"
-            + BeanPropEnum.TransdtlOnline.cardphyid + " varchar(32),"
-            + BeanPropEnum.TransdtlOnline.qrcode + " varchar(254),"
-            + BeanPropEnum.TransdtlOnline.transtype + " varchar(8),"
-            + BeanPropEnum.TransdtlOnline.payamt + " integer,"
-            + BeanPropEnum.TransdtlOnline.extraamt + " integer,"
-            + BeanPropEnum.TransdtlOnline.managefeetype + " varchar(10),"
-            + BeanPropEnum.TransdtlOnline.username + " varchar(32),"
-            + BeanPropEnum.TransdtlOnline.billno + " varchar(32),"
-            + BeanPropEnum.TransdtlOnline.reversalflag + " varchar(8),"
-            + BeanPropEnum.TransdtlOnline.reversalbillno + " varchar(32),"
-            + BeanPropEnum.TransdtlOnline.status + " varchar(8),"
-            + BeanPropEnum.TransdtlOnline.upflag + " integer )")
-    private val CRAETE_TABLE_NAME_DTL_OFFLINE = ("create table IF NOT EXISTS "
-            + TABLE_NAME_DTL_OFFLINE + " ( "
-            + BeanPropEnum.TransdtlOffline.devphyid + " char(8),"
-            + BeanPropEnum.TransdtlOffline.transdate + " char(8),"
-            + BeanPropEnum.TransdtlOffline.transtime + " char(6),"
-            + BeanPropEnum.TransdtlOffline.devseqno + " long primary key,"
-            + BeanPropEnum.TransdtlOffline.cardno + " varchar(32),"
-            + BeanPropEnum.TransdtlOffline.cardphyid + " varchar(32),"
-            + BeanPropEnum.TransdtlOffline.payamt + " integer,"
-            + BeanPropEnum.TransdtlOffline.extraamt + " integer,"
-            + BeanPropEnum.TransdtlOffline.reversalflag + " varchar(8),"
-            + BeanPropEnum.TransdtlOffline.reversalseqno + " integer,"
-            + BeanPropEnum.TransdtlOffline.reversaltransdate + " char(8),"
-            + BeanPropEnum.TransdtlOffline.reversaltranstime + " char(6),"
-            + BeanPropEnum.TransdtlOffline.status + " varchar(8),"
-            + BeanPropEnum.TransdtlOffline.upflag + " integer )")
-
-    private val lock = ReentrantLock()
-    fun getLock(): Lock {
-        return lock
-    }
-
-    override fun onCreate(db: SQLiteDatabase) {
-        db.execSQL(CRAETE_TABLE_NAME_DTL_ONLINE)
-        db.execSQL(CRAETE_TABLE_NAME_DTL_OFFLINE)
-    }
-
-    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
-        if (oldVersion < newVersion) {
-        }
-    }
+package com.supwisdom.db
+
+import android.content.Context
+import android.database.sqlite.SQLiteDatabase
+import android.database.sqlite.SQLiteOpenHelper
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class DBTransdtlHelper private constructor(context: Context) :
+    SQLiteOpenHelper(context, DB_NAME, null, VERSION) {
+    companion object {
+        private val DB_NAME = "db_transdtl"
+        private val VERSION = 2
+        private var instance: DBTransdtlHelper? = null
+
+        const val TABLE_NAME_DTL_ONLINE = "tb_dtl_online"
+        const val TABLE_NAME_DTL_OFFLINE = "tb_dtl_offline"
+
+        fun getInstance(context: Context): DBTransdtlHelper {
+            if (null == instance) {
+                synchronized(DBTransdtlHelper::class.java) {
+                    if (null == instance) {
+                        instance = DBTransdtlHelper(context)
+                    }
+                }
+            }
+            return instance!!
+        }
+    }
+
+    /**
+     * SQL for create table
+     */
+    private val CRAETE_TABLE_NAME_DTL_ONLINE = ("create table IF NOT EXISTS "
+            + TABLE_NAME_DTL_ONLINE + " ( "
+            + BeanPropEnum.TransdtlOnline.devphyid + " varchar(8) default 0,"
+            + BeanPropEnum.TransdtlOnline.transdate + " varchar(8) default 0,"
+            + BeanPropEnum.TransdtlOnline.transtime + " varchar(6) default 0,"
+            + BeanPropEnum.TransdtlOnline.devseqno + " long primary key,"
+            + BeanPropEnum.TransdtlOnline.cardno + " varchar(32) default 0,"
+            + BeanPropEnum.TransdtlOnline.cardphyid + " varchar(32) default 0,"
+            + BeanPropEnum.TransdtlOnline.qrcode + " varchar(254) default 0,"
+            + BeanPropEnum.TransdtlOnline.transtype + " varchar(8) default 0,"
+            + BeanPropEnum.TransdtlOnline.payamt + " integer default 0,"
+            + BeanPropEnum.TransdtlOnline.extraamt + " integer default 0,"
+            + BeanPropEnum.TransdtlOnline.managefeetype + " varchar(10) default 0,"
+            + BeanPropEnum.TransdtlOnline.username + " varchar(32) default 0,"
+            + BeanPropEnum.TransdtlOnline.billno + " varchar(32) default 0,"
+            + BeanPropEnum.TransdtlOnline.reversalflag + " varchar(8) default 0,"
+            + BeanPropEnum.TransdtlOnline.reversalbillno + " varchar(32) default 0,"
+            + BeanPropEnum.TransdtlOnline.status + " varchar(8) default 0,"
+            + BeanPropEnum.TransdtlOnline.upflag + " integer default 0)")
+    private val CREATE_INDEX_NAME_DTLONL_TRANSDATE = ("create index idx_dtlonl_transdate on "
+            + TABLE_NAME_DTL_ONLINE + " (" + BeanPropEnum.TransdtlOnline.transdate + ")")
+    private val CRAETE_TABLE_NAME_DTL_OFFLINE = ("create table IF NOT EXISTS "
+            + TABLE_NAME_DTL_OFFLINE + " ( "
+            + BeanPropEnum.TransdtlOffline.devphyid + " varchar(8) default 0,"
+            + BeanPropEnum.TransdtlOffline.transdate + " varchar(8) default 0,"
+            + BeanPropEnum.TransdtlOffline.transtime + " varchar(6) default 0,"
+            + BeanPropEnum.TransdtlOffline.devseqno + " long primary key,"
+            + BeanPropEnum.TransdtlOffline.cardno + " varchar(32) default 0,"
+            + BeanPropEnum.TransdtlOffline.cardphyid + " varchar(32) default 0,"
+            + BeanPropEnum.TransdtlOffline.payamt + " integer default 0,"
+            + BeanPropEnum.TransdtlOffline.extraamt + " integer default 0,"
+            + BeanPropEnum.TransdtlOffline.reversalflag + " varchar(8) default 0,"
+            + BeanPropEnum.TransdtlOffline.reversalseqno + " integer default 0,"
+            + BeanPropEnum.TransdtlOffline.reversaltransdate + " varchar(8) default 0,"
+            + BeanPropEnum.TransdtlOffline.reversaltranstime + " varchar(6) default 0,"
+            + BeanPropEnum.TransdtlOffline.status + " varchar(8) default 0,"
+            + BeanPropEnum.TransdtlOffline.upflag + " integer default 0)")
+    private val CREATE_INDEX_NAME_DTLOFF_TRANSDATE = ("create index idx_dtloff_transdate on "
+            + TABLE_NAME_DTL_OFFLINE + " ( " + BeanPropEnum.TransdtlOffline.transdate + ")")
+
+    override fun onCreate(db: SQLiteDatabase) {
+        db.execSQL(CRAETE_TABLE_NAME_DTL_ONLINE)
+        db.execSQL(CRAETE_TABLE_NAME_DTL_OFFLINE)
+        db.execSQL(CREATE_INDEX_NAME_DTLONL_TRANSDATE)
+        db.execSQL(CREATE_INDEX_NAME_DTLOFF_TRANSDATE)
+    }
+
+    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
+        if (oldVersion < newVersion) {
+            if (oldVersion < 2 && newVersion >= 2) {
+                db.execSQL(CREATE_INDEX_NAME_DTLONL_TRANSDATE)
+                db.execSQL(CREATE_INDEX_NAME_DTLOFF_TRANSDATE)
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt b/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt
index a0fc815..077a290 100644
--- a/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt
+++ b/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt
@@ -1,121 +1,143 @@
-package com.supwisdom.db
-
-import android.content.ContentValues
-import android.content.Context
-import android.database.Cursor
-import com.supwisdom.entity.DynamicParaRecord
-import java.util.concurrent.locks.Lock
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-class DynamicParaDao constructor(context: Context) {
-    private val INDEX = "1" // 主键
-    private val dbHelper = DBParaHelper.getInstance(context)
-    private val TABLE = DBParaHelper.TABLE_NAME_DYNAMICPARA
-
-    fun getLock(): Lock {
-        return dbHelper.getLock()
-    }
-
-    fun replace(record: DynamicParaRecord): 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 update(record: DynamicParaRecord): Boolean {
-        val db = dbHelper.writableDatabase
-        val values = getContentValues(record)
-        try {
-            db.beginTransaction()
-            if (db.update(TABLE, values, BeanPropEnum.DynamicPara.id.toString() + "=?", arrayOf(INDEX)) > 0) {
-                db.setTransactionSuccessful()
-                return true
-            }
-        } finally {
-            db.endTransaction()
-        }
-        return false
-    }
-
-    fun get(): DynamicParaRecord? {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        try {
-            cursor = db.query(
-                TABLE, null, BeanPropEnum.DynamicPara.id.toString() + "=?",
-                arrayOf(INDEX), null, null, null
-            )
-            if (cursor != null && cursor.moveToNext()) {
-                return getRecord(cursor)
-            }
-        } finally {
-            cursor?.close()
-        }
-        return null
-    }
-
-    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): DynamicParaRecord {
-        val record = DynamicParaRecord()
-        record.appid = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.appid.toString()))
-        record.appsecret = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.appsecret.toString()))
-        record.deviceid = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.deviceid.toString()))
-        record.merchaccno = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.merchaccno.toString()))
-        record.shopname = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.shopname.toString()))
-        record.onlineseqno = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.onlineseqno.toString()))
-        record.offlineseqno = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.offlineseqno.toString()))
-        record.paraverno = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.paraverno.toString()))
-        record.paragroupid = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.paragroupid.toString()))
-        record.whitelistid = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.whitelistid.toString()))
-        record.cardverno = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.cardverno.toString()))
-        record.jwt = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.jwt.toString()))
-        record.jwtExpire = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.jwtexpire.toString()))
-        record.token = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.token.toString()))
-        return record
-    }
-
-    private fun getContentValues(record: DynamicParaRecord): ContentValues {
-        val values = ContentValues()
-        values.put(BeanPropEnum.DynamicPara.id.toString(), INDEX)
-        values.put(BeanPropEnum.DynamicPara.appid.toString(), record.appid)
-        values.put(BeanPropEnum.DynamicPara.appsecret.toString(), record.appsecret)
-        values.put(BeanPropEnum.DynamicPara.deviceid.toString(), record.deviceid)
-        values.put(BeanPropEnum.DynamicPara.merchaccno.toString(), record.merchaccno)
-        values.put(BeanPropEnum.DynamicPara.shopname.toString(), record.shopname)
-        values.put(BeanPropEnum.DynamicPara.onlineseqno.toString(), record.onlineseqno)
-        values.put(BeanPropEnum.DynamicPara.offlineseqno.toString(), record.offlineseqno)
-        values.put(BeanPropEnum.DynamicPara.paraverno.toString(), record.paraverno)
-        values.put(BeanPropEnum.DynamicPara.paragroupid.toString(), record.paragroupid)
-        values.put(BeanPropEnum.DynamicPara.whitelistid.toString(), record.whitelistid)
-        values.put(BeanPropEnum.DynamicPara.cardverno.toString(), record.cardverno)
-        values.put(BeanPropEnum.DynamicPara.jwt.toString(), record.jwt)
-        values.put(BeanPropEnum.DynamicPara.token.toString(), record.token)
-        values.put(BeanPropEnum.DynamicPara.jwtexpire.toString(), record.jwtExpire)
-        return values
-    }
+package com.supwisdom.db
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import com.supwisdom.entity.DynamicParaRecord
+import java.util.concurrent.locks.Lock
+import java.util.concurrent.locks.ReentrantLock
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class DynamicParaDao constructor(context: Context) {
+    private val INDEX = "1" // 主键
+    private val dbHelper = DBParaHelper.getInstance(context)
+    private val TABLE = DBParaHelper.TABLE_NAME_DYNAMICPARA
+
+    private val lock = ReentrantLock()
+    fun getLock(): Lock {
+        return lock
+    }
+
+    fun replace(record: DynamicParaRecord): 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 update(record: DynamicParaRecord): Boolean {
+        val db = dbHelper.writableDatabase
+        val values = getContentValues(record)
+        try {
+            db.beginTransaction()
+            if (db.update(
+                    TABLE,
+                    values,
+                    BeanPropEnum.DynamicPara.id.toString() + "=?",
+                    arrayOf(INDEX)
+                ) > 0
+            ) {
+                db.setTransactionSuccessful()
+                return true
+            }
+        } finally {
+            db.endTransaction()
+        }
+        return false
+    }
+
+    fun get(): DynamicParaRecord? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        try {
+            cursor = db.query(
+                TABLE, null, BeanPropEnum.DynamicPara.id.toString() + "=?",
+                arrayOf(INDEX), null, null, null
+            )
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor)
+            }
+        } finally {
+            cursor?.close()
+        }
+        return null
+    }
+
+    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): DynamicParaRecord {
+        val record = DynamicParaRecord()
+        record.appid =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.appid.toString()))
+        record.appsecret =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.appsecret.toString()))
+        record.deviceid =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.deviceid.toString()))
+        record.merchaccno =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.merchaccno.toString()))
+        record.shopname =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.shopname.toString()))
+        record.onlineseqno =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.onlineseqno.toString()))
+        record.offlineseqno =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.offlineseqno.toString()))
+        record.paraverno =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.paraverno.toString()))
+        record.paragroupid =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.paragroupid.toString()))
+        record.whitelistid =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.whitelistid.toString()))
+        record.cardverno =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.cardverno.toString()))
+        record.jwt =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.jwt.toString()))
+        record.jwtExpire =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.jwtexpire.toString()))
+        record.token =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.token.toString()))
+        return record
+    }
+
+    private fun getContentValues(record: DynamicParaRecord): ContentValues {
+        val values = ContentValues()
+        values.put(BeanPropEnum.DynamicPara.id.toString(), INDEX)
+        values.put(BeanPropEnum.DynamicPara.appid.toString(), record.appid)
+        values.put(BeanPropEnum.DynamicPara.appsecret.toString(), record.appsecret)
+        values.put(BeanPropEnum.DynamicPara.deviceid.toString(), record.deviceid)
+        values.put(BeanPropEnum.DynamicPara.merchaccno.toString(), record.merchaccno)
+        values.put(BeanPropEnum.DynamicPara.shopname.toString(), record.shopname)
+        values.put(BeanPropEnum.DynamicPara.onlineseqno.toString(), record.onlineseqno)
+        values.put(BeanPropEnum.DynamicPara.offlineseqno.toString(), record.offlineseqno)
+        values.put(BeanPropEnum.DynamicPara.paraverno.toString(), record.paraverno)
+        values.put(BeanPropEnum.DynamicPara.paragroupid.toString(), record.paragroupid)
+        values.put(BeanPropEnum.DynamicPara.whitelistid.toString(), record.whitelistid)
+        values.put(BeanPropEnum.DynamicPara.cardverno.toString(), record.cardverno)
+        values.put(BeanPropEnum.DynamicPara.jwt.toString(), record.jwt)
+        values.put(BeanPropEnum.DynamicPara.token.toString(), record.token)
+        values.put(BeanPropEnum.DynamicPara.jwtexpire.toString(), record.jwtExpire)
+        return values
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/HotkeyPayDao.kt b/app/src/main/java/com/supwisdom/db/HotkeyPayDao.kt
index 3826967..925992d 100644
--- a/app/src/main/java/com/supwisdom/db/HotkeyPayDao.kt
+++ b/app/src/main/java/com/supwisdom/db/HotkeyPayDao.kt
@@ -1,98 +1,101 @@
-package com.supwisdom.db
-
-import android.content.ContentValues
-import android.content.Context
-import android.database.Cursor
-import com.supwisdom.entity.HotKeyPayRecord
-import java.util.concurrent.locks.Lock
-
-/**
- ** create by zzq on 2019/9/4
- ** @desc
- **/
-class HotkeyPayDao constructor(context: Context) {
-    private val dbHelper = DBParaHelper.getInstance(context)
-    private val TABLE = DBParaHelper.TABLE_NAME_HOTKEY
-
-    fun getLock(): Lock {
-        return dbHelper.getLock()
-    }
-
-    fun replace(record: HotKeyPayRecord): Boolean {
-        val db = dbHelper.readableDatabase
-        val values = getContentValues(record)
-        try {
-            db.beginTransaction()
-            if (db.replace(TABLE, null, values) > 0) {
-                db.setTransactionSuccessful()
-                return true
-            }
-        } finally {
-            db.endTransaction()
-        }
-        return false
-    }
-
-    fun save(list: List<HotKeyPayRecord>): Boolean {
-        val db = dbHelper.writableDatabase
-        try {
-            db.beginTransaction()
-            if (db.delete(TABLE, null, null) < 0) {
-                return false
-            }
-            list.forEach {
-                val values = getContentValues(it)
-                if (db.insert(TABLE, null, values) <= 0) {
-                    return false
-                }
-            }
-            db.setTransactionSuccessful()
-            return true
-        } finally {
-            db.endTransaction()
-        }
-    }
-
-    fun get(): List<HotKeyPayRecord>? {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        try {
-            cursor = db.query(TABLE, null, null, null, null, null, null)
-            val list = ArrayList<HotKeyPayRecord>()
-            while (cursor != null && cursor.moveToNext()) {
-                list.add(getRecord(cursor))
-            }
-            return list
-        } finally {
-            cursor?.close()
-        }
-    }
-
-    fun clear(): Boolean {
-        val db = dbHelper.writableDatabase
-        try {
-            db.beginTransaction()
-            if (db.delete(TABLE, null, null) < 0) {
-                return false
-            }
-            db.setTransactionSuccessful()
-            return true
-        } finally {
-            db.endTransaction()
-        }
-    }
-
-    private fun getRecord(cursor: Cursor): HotKeyPayRecord {
-        val record = HotKeyPayRecord()
-        record.key = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.HotkeyPay.key.toString()))
-        record.amount = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.HotkeyPay.amount.toString()))
-        return record
-    }
-
-    private fun getContentValues(record: HotKeyPayRecord): ContentValues {
-        val values = ContentValues()
-        values.put(BeanPropEnum.HotkeyPay.key.toString(), record.key)
-        values.put(BeanPropEnum.HotkeyPay.amount.toString(), record.amount)
-        return values
-    }
+package com.supwisdom.db
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import com.supwisdom.entity.HotKeyPayRecord
+import java.util.concurrent.locks.Lock
+import java.util.concurrent.locks.ReentrantLock
+
+/**
+ ** create by zzq on 2019/9/4
+ ** @desc
+ **/
+class HotkeyPayDao constructor(context: Context) {
+    private val dbHelper = DBParaHelper.getInstance(context)
+    private val TABLE = DBParaHelper.TABLE_NAME_HOTKEY
+
+    private val lock = ReentrantLock()
+    fun getLock(): Lock {
+        return lock
+    }
+
+    fun replace(record: HotKeyPayRecord): Boolean {
+        val db = dbHelper.readableDatabase
+        val values = getContentValues(record)
+        try {
+            db.beginTransaction()
+            if (db.replace(TABLE, null, values) > 0) {
+                db.setTransactionSuccessful()
+                return true
+            }
+        } finally {
+            db.endTransaction()
+        }
+        return false
+    }
+
+    fun save(list: List<HotKeyPayRecord>): Boolean {
+        val db = dbHelper.writableDatabase
+        try {
+            db.beginTransaction()
+            if (db.delete(TABLE, null, null) < 0) {
+                return false
+            }
+            list.forEach {
+                val values = getContentValues(it)
+                if (db.insert(TABLE, null, values) <= 0) {
+                    return false
+                }
+            }
+            db.setTransactionSuccessful()
+            return true
+        } finally {
+            db.endTransaction()
+        }
+    }
+
+    fun get(): List<HotKeyPayRecord>? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, null)
+            val list = ArrayList<HotKeyPayRecord>()
+            while (cursor != null && cursor.moveToNext()) {
+                list.add(getRecord(cursor))
+            }
+            return list
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    fun clear(): Boolean {
+        val db = dbHelper.writableDatabase
+        try {
+            db.beginTransaction()
+            if (db.delete(TABLE, null, null) < 0) {
+                return false
+            }
+            db.setTransactionSuccessful()
+            return true
+        } finally {
+            db.endTransaction()
+        }
+    }
+
+    private fun getRecord(cursor: Cursor): HotKeyPayRecord {
+        val record = HotKeyPayRecord()
+        record.key = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.HotkeyPay.key.toString()))
+        record.amount =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.HotkeyPay.amount.toString()))
+        return record
+    }
+
+    private fun getContentValues(record: HotKeyPayRecord): ContentValues {
+        val values = ContentValues()
+        values.put(BeanPropEnum.HotkeyPay.key.toString(), record.key)
+        values.put(BeanPropEnum.HotkeyPay.amount.toString(), record.amount)
+        return values
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/PeriodFixPayDao.kt b/app/src/main/java/com/supwisdom/db/PeriodFixPayDao.kt
index dce63c0..ab34216 100644
--- a/app/src/main/java/com/supwisdom/db/PeriodFixPayDao.kt
+++ b/app/src/main/java/com/supwisdom/db/PeriodFixPayDao.kt
@@ -1,100 +1,104 @@
-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
-    }
+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
+import java.util.concurrent.locks.ReentrantLock
+
+/**
+ ** 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
+    private val lock = ReentrantLock()
+    fun getLock(): Lock {
+        return lock
+    }
+
+    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 9972af0..883f8dc 100644
--- a/app/src/main/java/com/supwisdom/db/Pos.kt
+++ b/app/src/main/java/com/supwisdom/db/Pos.kt
@@ -1,379 +1,379 @@
-package com.supwisdom.db
-
-import android.content.Context
-import com.supwisdom.entity.*
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-class Pos constructor(context: Context) {
-    private val sdContext = SDContext(context)
-    private val configParaDao = ConfigParaDao(sdContext)
-    private var cfgRecord: ConfigParaRecord? = null
-    private val dynamicParaDao = DynamicParaDao(context)
-    private var dyRecord: DynamicParaRecord? = null
-    private val sysParaDao = SysParaDao(context)
-    private var sysRecord: SysParaRecord? = null
-    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)
-    private var onlMaxSeqno = 0
-    private var offMaxSeqno = 0
-
-    init {
-    }
-
-    /**
-     * 设备参数
-     */
-    fun replaceConfigPara(record: ConfigParaRecord): Boolean {
-        try {
-            configParaDao.getLock().lock()
-            if (configParaDao.replace(record)) {
-                cfgRecord = record
-                return true
-            }
-        } finally {
-            configParaDao.getLock().unlock()
-        }
-        return false
-    }
-
-    fun getConfigPara(): ConfigParaRecord? {
-        if (cfgRecord == null) {
-            try {
-                configParaDao.getLock().lock()
-                cfgRecord = configParaDao.get()
-            } finally {
-                configParaDao.getLock().unlock()
-            }
-        }
-        return cfgRecord
-    }
-
-    fun saveHotkeyPay(list: List<HotKeyPayRecord>): Boolean {
-        try {
-            hotkeyPayDao.getLock().lock()
-            return hotkeyPayDao.save(list)
-        } finally {
-            hotkeyPayDao.getLock().unlock()
-        }
-    }
-
-    fun getHotkeyPay(): List<HotKeyPayRecord>? {
-        try {
-            hotkeyPayDao.getLock().lock()
-            return hotkeyPayDao.get()
-        } finally {
-            hotkeyPayDao.getLock().unlock()
-        }
-    }
-
-    fun 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()
-            return controlParaDao.replace(record)
-        } finally {
-            controlParaDao.getLock().unlock()
-        }
-    }
-
-    fun replaceControlPara(paraname: String, paraval: String): Boolean {
-        try {
-            controlParaDao.getLock().lock()
-            return controlParaDao.replace(paraname, paraval)
-        } finally {
-            controlParaDao.getLock().unlock()
-        }
-    }
-
-    fun getControlPara(paraname: String): ControlParaRecord? {
-        try {
-            controlParaDao.getLock().lock()
-            return controlParaDao.get(paraname)
-        } finally {
-            controlParaDao.getLock().unlock()
-        }
-    }
-
-    fun replaceDynamicPara(record: DynamicParaRecord): Boolean {
-        try {
-            dynamicParaDao.getLock().lock()
-            if (dynamicParaDao.replace(record)) {
-                dyRecord = record
-                return true
-            }
-        } finally {
-            dynamicParaDao.getLock().unlock()
-        }
-        return false
-    }
-
-    fun getDynamicPara(): DynamicParaRecord? {
-        if (dyRecord == null) {
-            try {
-                dynamicParaDao.getLock().lock()
-                dyRecord = dynamicParaDao.get()
-            } finally {
-                dynamicParaDao.getLock().unlock()
-            }
-        }
-        return dyRecord
-    }
-
-    fun replaceSysPara(record: SysParaRecord): Boolean {
-        try {
-            sysParaDao.getLock().lock()
-            if (sysParaDao.replace(record)) {
-                sysRecord = record
-                return true
-            }
-        } finally {
-            sysParaDao.getLock().unlock()
-        }
-        return false
-    }
-
-    fun getSysPara(): SysParaRecord? {
-        if (sysRecord == null) {
-            try {
-                sysParaDao.getLock().lock()
-                sysRecord = sysParaDao.get()
-            } finally {
-                sysParaDao.getLock().unlock()
-            }
-        }
-        return sysRecord
-    }
-
-    fun saveWhiteList(list: List<WhiteListRecord>): Boolean {
-        try {
-            whiteListDao.getLock().lock()
-            return whiteListDao.replace(list)
-        } finally {
-            whiteListDao.getLock().unlock()
-        }
-    }
-
-    fun getWhiteList(cardphyid: String, cardno: String): WhiteListRecord? {
-        try {
-            whiteListDao.getLock().lock()
-            return whiteListDao.get(cardphyid, cardno)
-        } finally {
-            whiteListDao.getLock().unlock()
-        }
-    }
-
-    fun clearWhiteList(): Boolean {
-        try {
-            whiteListDao.getLock().lock()
-            return whiteListDao.clear()
-        } finally {
-            whiteListDao.getLock().unlock()
-        }
-    }
-
-    fun getTransdtlOnlineMaxSeqno(): Int {
-        if (onlMaxSeqno == 0) {
-            try {
-                transdtlOnlineDao.getLock().lock()
-                onlMaxSeqno = transdtlOnlineDao.getMaxSeqno()
-            } finally {
-                transdtlOnlineDao.getLock().unlock()
-            }
-        }
-        return onlMaxSeqno
-    }
-
-    fun getTransdtlOnlineLast(): TransdtlOnlineRecord? {
-        try {
-            transdtlOnlineDao.getLock().lock()
-            return transdtlOnlineDao.getLast()
-        } finally {
-            transdtlOnlineDao.getLock().unlock()
-        }
-    }
-
-    fun getTransdtlOnline(): List<TransdtlOnlineRecord> {
-        try {
-            transdtlOnlineDao.getLock().lock()
-            return transdtlOnlineDao.getAll()
-        } finally {
-            transdtlOnlineDao.getLock().unlock()
-        }
-    }
-
-    fun getTransdtlOnlineUnconfirm(): List<TransdtlOnlineRecord> {
-        try {
-            transdtlOnlineDao.getLock().lock()
-            return transdtlOnlineDao.getUnconfirm()
-        } finally {
-            transdtlOnlineDao.getLock().unlock()
-        }
-    }
-
-    fun getTransdtlUnconfirmNum(): Int {
-        var num = 0
-        try {
-            transdtlOnlineDao.getLock().lock()
-            num += transdtlOnlineDao.getUnconfirmNum()
-        } finally {
-            transdtlOnlineDao.getLock().unlock()
-        }
-        try {
-            transdtlOfflineDao.getLock().lock()
-            num += transdtlOfflineDao.getUnconfirmNum()
-        } finally {
-            transdtlOfflineDao.getLock().unlock()
-        }
-        return num
-    }
-
-    fun saveTransdtlOnline(record: TransdtlOnlineRecord): Boolean {
-        try {
-            transdtlOnlineDao.getLock().lock()
-            if (transdtlOnlineDao.save(record)) {
-                onlMaxSeqno = record.devseqno
-                return true
-            }
-            return false
-        } finally {
-            transdtlOnlineDao.getLock().unlock()
-        }
-    }
-
-    fun updateTransdtlOnline(record: TransdtlOnlineRecord): Boolean {
-        try {
-            transdtlOnlineDao.getLock().lock()
-            return transdtlOnlineDao.update(record)
-        } finally {
-            transdtlOnlineDao.getLock().unlock()
-        }
-    }
-
-    fun clearTransdtlOnline(date: String): Boolean {
-        try {
-            transdtlOnlineDao.getLock().lock()
-            return transdtlOnlineDao.clear(date)
-        } finally {
-            transdtlOnlineDao.getLock().unlock()
-        }
-    }
-
-    fun getTransdtlOfflineMaxSeqno(): Int {
-        if (offMaxSeqno == 0) {
-            try {
-                transdtlOfflineDao.getLock().lock()
-                offMaxSeqno = transdtlOfflineDao.getMaxSeqno()
-            } finally {
-                transdtlOfflineDao.getLock().unlock()
-            }
-        }
-        return offMaxSeqno
-    }
-
-    fun getTransdtlOfflineUnconfirm(): List<TransdtlOfflineRecord> {
-        try {
-            transdtlOfflineDao.getLock().lock()
-            return transdtlOfflineDao.getUnconfirm()
-        } finally {
-            transdtlOfflineDao.getLock().unlock()
-        }
-    }
-
-    fun getTransdtlOffline(): List<TransdtlOfflineRecord> {
-        try {
-            transdtlOfflineDao.getLock().lock()
-            return transdtlOfflineDao.getAll()
-        } finally {
-            transdtlOfflineDao.getLock().unlock()
-        }
-    }
-
-    fun getTransdtlOfflineAmt(date: String, cardno: String, cardphyid: String): Int {
-        try {
-            transdtlOfflineDao.getLock().lock()
-            return transdtlOfflineDao.getOfflineAmt(date, cardno, cardphyid)
-        } finally {
-            transdtlOfflineDao.getLock().unlock()
-        }
-    }
-
-    fun getTransdtlOfflineLast(): TransdtlOfflineRecord? {
-        try {
-            transdtlOfflineDao.getLock().lock()
-            return transdtlOfflineDao.getLast()
-        } finally {
-            transdtlOfflineDao.getLock().unlock()
-        }
-    }
-
-    fun saveTransdtlOffline(record: TransdtlOfflineRecord): Boolean {
-        try {
-            transdtlOfflineDao.getLock().lock()
-            if (transdtlOfflineDao.save(record)) {
-                offMaxSeqno = record.devseqno
-                return true
-            }
-            return false
-        } finally {
-            transdtlOfflineDao.getLock().unlock()
-        }
-    }
-
-    fun updateTransdtlOffline(record: TransdtlOfflineRecord): Boolean {
-        try {
-            transdtlOfflineDao.getLock().lock()
-            return transdtlOfflineDao.update(record)
-        } finally {
-            transdtlOfflineDao.getLock().unlock()
-        }
-    }
-
-    fun clearTransdtlOffline(date: String): Boolean {
-        try {
-            transdtlOfflineDao.getLock().lock()
-            return transdtlOfflineDao.clear(date)
-        } finally {
-            transdtlOfflineDao.getLock().unlock()
-        }
-    }
-
-    /**
-     * @param date yyyyMMdd
-     * @param offset 流水偏移量
-     * @param flag 0--全部流水 1--成功流水 2--失败流水
-     * @param num 查询数量
-     */
-    fun getTransdtlUnion(date: String, offset: Int, flag: Int, num: Int): List<TransdtlUnionRecord> {
-        try {
-            transdtlUnionDao.getLock().lock()
-            return transdtlUnionDao.get(date, offset, flag, num)
-        } finally {
-            transdtlUnionDao.getLock().unlock()
-        }
-    }
+package com.supwisdom.db
+
+import android.content.Context
+import com.supwisdom.entity.*
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class Pos constructor(context: Context) {
+    private val sdContext = SDContext(context)
+    private val configParaDao = ConfigParaDao(sdContext)
+    private var cfgRecord: ConfigParaRecord? = null
+    private val dynamicParaDao = DynamicParaDao(context)
+    private var dyRecord: DynamicParaRecord? = null
+    private val sysParaDao = SysParaDao(context)
+    private var sysRecord: SysParaRecord? = null
+    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)
+    private var onlMaxSeqno = 0
+    private var offMaxSeqno = 0
+
+    init {
+    }
+
+    /**
+     * 设备参数
+     */
+    fun replaceConfigPara(record: ConfigParaRecord): Boolean {
+        try {
+            configParaDao.getLock().lock()
+            if (configParaDao.replace(record)) {
+                cfgRecord = record
+                return true
+            }
+        } finally {
+            configParaDao.getLock().unlock()
+        }
+        return false
+    }
+
+    fun getConfigPara(): ConfigParaRecord? {
+        if (cfgRecord == null) {
+            try {
+                configParaDao.getLock().lock()
+                cfgRecord = configParaDao.get()
+            } finally {
+                configParaDao.getLock().unlock()
+            }
+        }
+        return cfgRecord
+    }
+
+    fun saveHotkeyPay(list: List<HotKeyPayRecord>): Boolean {
+        try {
+            hotkeyPayDao.getLock().lock()
+            return hotkeyPayDao.save(list)
+        } finally {
+            hotkeyPayDao.getLock().unlock()
+        }
+    }
+
+    fun getHotkeyPay(): List<HotKeyPayRecord>? {
+        try {
+            hotkeyPayDao.getLock().lock()
+            return hotkeyPayDao.get()
+        } finally {
+            hotkeyPayDao.getLock().unlock()
+        }
+    }
+
+    fun 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()
+            return controlParaDao.replace(record)
+        } finally {
+            controlParaDao.getLock().unlock()
+        }
+    }
+
+    fun replaceControlPara(paraname: String, paraval: String): Boolean {
+        try {
+            controlParaDao.getLock().lock()
+            return controlParaDao.replace(paraname, paraval)
+        } finally {
+            controlParaDao.getLock().unlock()
+        }
+    }
+
+    fun getControlPara(paraname: String): ControlParaRecord? {
+        try {
+            controlParaDao.getLock().lock()
+            return controlParaDao.get(paraname)
+        } finally {
+            controlParaDao.getLock().unlock()
+        }
+    }
+
+    fun replaceDynamicPara(record: DynamicParaRecord): Boolean {
+        try {
+            dynamicParaDao.getLock().lock()
+            if (dynamicParaDao.replace(record)) {
+                dyRecord = record
+                return true
+            }
+        } finally {
+            dynamicParaDao.getLock().unlock()
+        }
+        return false
+    }
+
+    fun getDynamicPara(): DynamicParaRecord? {
+        if (dyRecord == null) {
+            try {
+                dynamicParaDao.getLock().lock()
+                dyRecord = dynamicParaDao.get()
+            } finally {
+                dynamicParaDao.getLock().unlock()
+            }
+        }
+        return dyRecord
+    }
+
+    fun replaceSysPara(record: SysParaRecord): Boolean {
+        try {
+            sysParaDao.getLock().lock()
+            if (sysParaDao.replace(record)) {
+                sysRecord = record
+                return true
+            }
+        } finally {
+            sysParaDao.getLock().unlock()
+        }
+        return false
+    }
+
+    fun getSysPara(): SysParaRecord? {
+        if (sysRecord == null) {
+            try {
+                sysParaDao.getLock().lock()
+                sysRecord = sysParaDao.get()
+            } finally {
+                sysParaDao.getLock().unlock()
+            }
+        }
+        return sysRecord
+    }
+
+    fun saveWhiteList(list: List<WhiteListRecord>): Boolean {
+        try {
+            whiteListDao.getLock().lock()
+            return whiteListDao.replace(list)
+        } finally {
+            whiteListDao.getLock().unlock()
+        }
+    }
+
+    fun getWhiteList(cardphyid: String, cardno: String): WhiteListRecord? {
+        try {
+            whiteListDao.getLock().lock()
+            return whiteListDao.get(cardphyid, cardno)
+        } finally {
+            whiteListDao.getLock().unlock()
+        }
+    }
+
+    fun clearWhiteList(): Boolean {
+        try {
+            whiteListDao.getLock().lock()
+            return whiteListDao.clear()
+        } finally {
+            whiteListDao.getLock().unlock()
+        }
+    }
+
+    fun getTransdtlOnlineMaxSeqno(): Int {
+        if (onlMaxSeqno == 0) {
+            try {
+                transdtlOnlineDao.getLock().lock()
+                onlMaxSeqno = transdtlOnlineDao.getMaxSeqno()
+            } finally {
+                transdtlOnlineDao.getLock().unlock()
+            }
+        }
+        return onlMaxSeqno
+    }
+
+    fun getTransdtlOnlineLast(): TransdtlOnlineRecord? {
+        try {
+            transdtlOnlineDao.getLock().lock()
+            return transdtlOnlineDao.getLast()
+        } finally {
+            transdtlOnlineDao.getLock().unlock()
+        }
+    }
+
+    fun getTransdtlOnline(): List<TransdtlOnlineRecord> {
+        try {
+            transdtlOnlineDao.getLock().lock()
+            return transdtlOnlineDao.getAll()
+        } finally {
+            transdtlOnlineDao.getLock().unlock()
+        }
+    }
+
+    fun getTransdtlOnlineUnconfirm(): List<TransdtlOnlineRecord> {
+        try {
+            transdtlOnlineDao.getLock().lock()
+            return transdtlOnlineDao.getUnconfirm()
+        } finally {
+            transdtlOnlineDao.getLock().unlock()
+        }
+    }
+
+    fun getTransdtlUnconfirmNum(): Int {
+        var num = 0
+        try {
+            transdtlOnlineDao.getLock().lock()
+            num += transdtlOnlineDao.getUnconfirmNum()
+        } finally {
+            transdtlOnlineDao.getLock().unlock()
+        }
+        try {
+            transdtlOfflineDao.getLock().lock()
+            num += transdtlOfflineDao.getUnconfirmNum()
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+        return num
+    }
+
+    fun saveTransdtlOnline(record: TransdtlOnlineRecord): Boolean {
+        try {
+            transdtlOnlineDao.getLock().lock()
+            if (transdtlOnlineDao.save(record)) {
+                onlMaxSeqno = record.devseqno
+                return true
+            }
+            return false
+        } finally {
+            transdtlOnlineDao.getLock().unlock()
+        }
+    }
+
+    fun updateTransdtlOnline(record: TransdtlOnlineRecord): Boolean {
+        try {
+            transdtlOnlineDao.getLock().lock()
+            return transdtlOnlineDao.update(record)
+        } finally {
+            transdtlOnlineDao.getLock().unlock()
+        }
+    }
+
+    fun clearTransdtlOnline(date: String): Boolean {
+        try {
+            transdtlOnlineDao.getLock().lock()
+            return transdtlOnlineDao.clear(date)
+        } finally {
+            transdtlOnlineDao.getLock().unlock()
+        }
+    }
+
+    fun getTransdtlOfflineMaxSeqno(): Int {
+        if (offMaxSeqno == 0) {
+            try {
+                transdtlOfflineDao.getLock().lock()
+                offMaxSeqno = transdtlOfflineDao.getMaxSeqno()
+            } finally {
+                transdtlOfflineDao.getLock().unlock()
+            }
+        }
+        return offMaxSeqno
+    }
+
+    fun getTransdtlOfflineUnconfirm(): List<TransdtlOfflineRecord> {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            return transdtlOfflineDao.getUnconfirm()
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+    }
+
+    fun getTransdtlOffline(): List<TransdtlOfflineRecord> {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            return transdtlOfflineDao.getAll()
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+    }
+
+    fun getTransdtlOfflineAmt(date: String, cardno: String, cardphyid: String): Int {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            return transdtlOfflineDao.getOfflineAmt(date, cardno, cardphyid)
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+    }
+
+    fun getTransdtlOfflineLast(): TransdtlOfflineRecord? {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            return transdtlOfflineDao.getLast()
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+    }
+
+    fun saveTransdtlOffline(record: TransdtlOfflineRecord): Boolean {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            if (transdtlOfflineDao.save(record)) {
+                offMaxSeqno = record.devseqno
+                return true
+            }
+            return false
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+    }
+
+    fun updateTransdtlOffline(record: TransdtlOfflineRecord): Boolean {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            return transdtlOfflineDao.update(record)
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+    }
+
+    fun clearTransdtlOffline(date: String): Boolean {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            return transdtlOfflineDao.clear(date)
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+    }
+
+    /**
+     * @param date yyyyMMdd
+     * @param offset 流水偏移量
+     * @param flag 0--全部流水 1--成功流水 2--失败流水
+     * @param num 查询数量
+     */
+    fun getTransdtlUnion(
+        date: String,
+        offset: Int,
+        flag: Int,
+        num: Int
+    ): List<TransdtlUnionRecord> {
+        return transdtlUnionDao.get(date, offset, flag, num)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/SysParaDao.kt b/app/src/main/java/com/supwisdom/db/SysParaDao.kt
index 50de288..6d34422 100644
--- a/app/src/main/java/com/supwisdom/db/SysParaDao.kt
+++ b/app/src/main/java/com/supwisdom/db/SysParaDao.kt
@@ -1,119 +1,143 @@
-package com.supwisdom.db
-
-import android.content.ContentValues
-import android.content.Context
-import android.database.Cursor
-import com.supwisdom.entity.SysParaRecord
-import java.util.concurrent.locks.Lock
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-class SysParaDao constructor(context: Context) {
-    private val INDEX = "1" // 主键
-    private val dbHelper = DBParaHelper.getInstance(context)
-    private val TABLE = DBParaHelper.TABLE_NAME_SYSPARA
-
-    fun getLock(): Lock {
-        return dbHelper.getLock()
-    }
-
-    fun replace(record: SysParaRecord): 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 update(record: SysParaRecord): Boolean {
-        val db = dbHelper.writableDatabase
-        val values = getContentValues(record)
-        try {
-            db.beginTransaction()
-            if (db.update(TABLE, values, BeanPropEnum.Syspara.id.toString() + "=?", arrayOf(INDEX)) < 0) {
-                return false
-            }
-            db.setTransactionSuccessful()
-            return true
-        } finally {
-            db.endTransaction()
-        }
-    }
-
-    fun get(): SysParaRecord? {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        try {
-            cursor = db.query(
-                TABLE, null, BeanPropEnum.Syspara.id.toString() + "=?",
-                arrayOf(INDEX), null, null, null
-            )
-            if (cursor != null && cursor.moveToNext()) {
-                return getRecord(cursor)
-            }
-        } finally {
-            cursor?.close()
-        }
-        return null
-    }
-
-    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): SysParaRecord {
-        val record = SysParaRecord()
-        record.returnFlag = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.returnFlag.toString()))
-        record.heatBeat = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.heatBeat.toString()))
-        val enable = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.offlineEnable.toString()))
-        record.offlineEnable = enable == 1
-        record.maxOfflineDays = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.maxOfflineDays.toString()))
-        record.maxDayOfflineAmt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.maxDayOfflineAmt.toString()))
-        record.mngPasswd = cursor.getString(cursor.getColumnIndex(BeanPropEnum.Syspara.mngpasswd.toString()))
-        record.fixpayGap = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.fixpayGap.toString()))
-        record.sucShowtime = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.consumeShowtime.toString()))
-        record.failShowtime =
-            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.consumeFailShowtime.toString()))
-        record.commTime = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.commTime.toString()))
-        return record
-    }
-
-    private fun getContentValues(record: SysParaRecord): ContentValues {
-        val values = ContentValues()
-        values.put(BeanPropEnum.Syspara.id.toString(), INDEX)
-        values.put(BeanPropEnum.Syspara.returnFlag.toString(), record.returnFlag)
-        values.put(BeanPropEnum.Syspara.heatBeat.toString(), record.heatBeat)
-        if (record.offlineEnable) {
-            values.put(BeanPropEnum.Syspara.offlineEnable.toString(), 1)
-        } else {
-            values.put(BeanPropEnum.Syspara.offlineEnable.toString(), 0)
-        }
-        values.put(BeanPropEnum.Syspara.maxOfflineDays.toString(), record.maxOfflineDays)
-        values.put(BeanPropEnum.Syspara.maxDayOfflineAmt.toString(), record.maxDayOfflineAmt)
-        values.put(BeanPropEnum.Syspara.mngpasswd.toString(), record.mngPasswd)
-        values.put(BeanPropEnum.Syspara.fixpayGap.toString(), record.fixpayGap)
-        values.put(BeanPropEnum.Syspara.consumeShowtime.toString(), record.sucShowtime)
-        values.put(BeanPropEnum.Syspara.consumeFailShowtime.toString(), record.failShowtime)
-        values.put(BeanPropEnum.Syspara.commTime.toString(), record.commTime)
-        return values
-    }
+package com.supwisdom.db
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import com.supwisdom.entity.SysParaRecord
+import java.util.concurrent.locks.Lock
+import java.util.concurrent.locks.ReentrantLock
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class SysParaDao constructor(context: Context) {
+    private val INDEX = "1" // 主键
+    private val dbHelper = DBParaHelper.getInstance(context)
+    private val TABLE = DBParaHelper.TABLE_NAME_SYSPARA
+
+    private val lock = ReentrantLock()
+    fun getLock(): Lock {
+        return lock
+    }
+
+    fun replace(record: SysParaRecord): 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 update(record: SysParaRecord): Boolean {
+        val db = dbHelper.writableDatabase
+        val values = getContentValues(record)
+        try {
+            db.beginTransaction()
+            if (db.update(
+                    TABLE,
+                    values,
+                    BeanPropEnum.Syspara.id.toString() + "=?",
+                    arrayOf(INDEX)
+                ) < 0
+            ) {
+                return false
+            }
+            db.setTransactionSuccessful()
+            return true
+        } finally {
+            db.endTransaction()
+        }
+    }
+
+    fun get(): SysParaRecord? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        try {
+            cursor = db.query(
+                TABLE, null, BeanPropEnum.Syspara.id.toString() + "=?",
+                arrayOf(INDEX), null, null, null
+            )
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor)
+            }
+        } finally {
+            cursor?.close()
+        }
+        return null
+    }
+
+    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): SysParaRecord {
+        val record = SysParaRecord()
+        record.returnFlag =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.returnFlag.toString()))
+        record.heatBeat =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.heatBeat.toString()))
+        var enable =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.offlineEnable.toString()))
+        record.offlineEnable = enable == 1
+        enable = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.synoCode.toString()))
+        record.synoCode = enable == 1
+        record.maxOfflineDays =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.maxOfflineDays.toString()))
+        record.maxDayOfflineAmt =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.maxDayOfflineAmt.toString()))
+        record.mngPasswd =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.Syspara.mngpasswd.toString()))
+        record.fixpayGap =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.fixpayGap.toString()))
+        record.sucShowtime =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.consumeShowtime.toString()))
+        record.failShowtime =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.consumeFailShowtime.toString()))
+        record.commTime =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.commTime.toString()))
+        return record
+    }
+
+    private fun getContentValues(record: SysParaRecord): ContentValues {
+        val values = ContentValues()
+        values.put(BeanPropEnum.Syspara.id.toString(), INDEX)
+        values.put(BeanPropEnum.Syspara.returnFlag.toString(), record.returnFlag)
+        values.put(BeanPropEnum.Syspara.heatBeat.toString(), record.heatBeat)
+        if (record.offlineEnable) {
+            values.put(BeanPropEnum.Syspara.offlineEnable.toString(), 1)
+        } else {
+            values.put(BeanPropEnum.Syspara.offlineEnable.toString(), 0)
+        }
+        if (record.synoCode) {
+            values.put(BeanPropEnum.Syspara.synoCode.toString(), 1)
+        } else {
+            values.put(BeanPropEnum.Syspara.synoCode.toString(), 0)
+        }
+        values.put(BeanPropEnum.Syspara.maxOfflineDays.toString(), record.maxOfflineDays)
+        values.put(BeanPropEnum.Syspara.maxDayOfflineAmt.toString(), record.maxDayOfflineAmt)
+        values.put(BeanPropEnum.Syspara.mngpasswd.toString(), record.mngPasswd)
+        values.put(BeanPropEnum.Syspara.fixpayGap.toString(), record.fixpayGap)
+        values.put(BeanPropEnum.Syspara.consumeShowtime.toString(), record.sucShowtime)
+        values.put(BeanPropEnum.Syspara.consumeFailShowtime.toString(), record.failShowtime)
+        values.put(BeanPropEnum.Syspara.commTime.toString(), record.commTime)
+        return values
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
index 8669aa8..bf3b729 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
@@ -1,260 +1,282 @@
-package com.supwisdom.db
-
-import android.content.ContentValues
-import android.content.Context
-import android.database.Cursor
-import com.supwisdom.entity.PayStatus
-import com.supwisdom.entity.ReversalFlag
-import com.supwisdom.entity.TransdtlOfflineRecord
-import java.util.concurrent.locks.Lock
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-class TransdtlOfflineDao constructor(context: Context) {
-    private val dbHelper = DBTransdtlHelper.getInstance(context)
-    private val TABLE = DBTransdtlHelper.TABLE_NAME_DTL_OFFLINE
-
-    fun getLock(): Lock {
-        return dbHelper.getLock()
-    }
-
-    fun save(record: TransdtlOfflineRecord): 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 update(record: TransdtlOfflineRecord): Boolean {
-        val db = dbHelper.writableDatabase
-        val values = getContentValues(record)
-        try {
-            db.beginTransaction()
-            if (db.update(
-                    TABLE,
-                    values,
-                    BeanPropEnum.TransdtlOffline.devseqno.toString() + "=?",
-                    arrayOf(record.devseqno.toString())
-                ) > 0
-            ) {
-                db.setTransactionSuccessful()
-                return true
-            }
-        } finally {
-            db.endTransaction()
-        }
-        return false
-    }
-
-    fun getAll(): List<TransdtlOfflineRecord> {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        val orderby = BeanPropEnum.TransdtlOffline.devseqno.toString() + " desc"
-        try {
-            cursor = db.query(TABLE, null, null, null, null, null, orderby)
-            val list = ArrayList<TransdtlOfflineRecord>()
-            while (cursor != null && cursor.moveToNext()) {
-                list.add(getRecord(cursor))
-            }
-            return list
-        } finally {
-            cursor?.close()
-        }
-    }
-
-    fun getOfflineAmt(date: String, cardno: String, cardphyid: String): Int {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        var sql = ("select sum(${BeanPropEnum.TransdtlOffline.payamt}) as sumamt from $TABLE where "
-                + BeanPropEnum.TransdtlOffline.transdate.toString() + "='" + date + "' and "
-                + BeanPropEnum.TransdtlOffline.cardno.toString() + "='" + cardno + "' and "
-                + BeanPropEnum.TransdtlOffline.cardphyid.toString() + "='" + cardphyid + "' and "
-                + BeanPropEnum.TransdtlOffline.reversalflag.toString() + "='" + ReversalFlag.NONE.toString() + "' and "
-                + BeanPropEnum.TransdtlOffline.status.toString() + "='" + PayStatus.SUC.toString() + "'")
-        var sumamt = 0
-        try {
-            cursor = db.rawQuery(sql, null, null)
-            if (cursor != null && cursor.moveToNext()) {
-                sumamt = cursor.getInt(cursor.getColumnIndex("sumamt"))
-            }
-        } finally {
-            cursor?.close()
-        }
-
-        sql = ("select sum(${BeanPropEnum.TransdtlOffline.payamt}) as sumamt from $TABLE where "
-                + BeanPropEnum.TransdtlOffline.transdate.toString() + "='" + date + "' and "
-                + BeanPropEnum.TransdtlOffline.cardno.toString() + "='" + cardno + "' and "
-                + BeanPropEnum.TransdtlOffline.cardphyid.toString() + "='" + cardphyid + "' and "
-                + BeanPropEnum.TransdtlOffline.reversalflag.toString() + "<>'" + ReversalFlag.NONE.toString() + "' and "
-                + BeanPropEnum.TransdtlOffline.status.toString() + "='" + PayStatus.SUC.toString() + "'")
-        try {
-            cursor = db.rawQuery(sql, null, null)
-            if (cursor != null && cursor.moveToNext()) {
-                val reverse = cursor.getInt(cursor.getColumnIndex("sumamt"))
-                if (sumamt > reverse) {
-                    return (sumamt - reverse)
-                }
-            }
-        } finally {
-            cursor?.close()
-        }
-        return 0
-    }
-
-    fun getUnconfirm(): List<TransdtlOfflineRecord> {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        val selection = BeanPropEnum.TransdtlOffline.upflag.toString() + "=?"
-        try {
-            cursor = db.query(TABLE, null, selection, arrayOf("0"), null, null, null)
-            val list = ArrayList<TransdtlOfflineRecord>()
-            while (cursor != null && cursor.moveToNext()) {
-                list.add(getRecord(cursor))
-            }
-            return list
-        } finally {
-            cursor?.close()
-        }
-    }
-
-    fun getMaxSeqno(): Int {
-        val db = dbHelper.readableDatabase
-        val sql = ("select max(${BeanPropEnum.TransdtlOffline.devseqno}) as seqno from $TABLE")
-        var cursor: Cursor? = null
-        try {
-            cursor = db.rawQuery(sql, null, null)
-            if (cursor != null && cursor.moveToNext()) {
-                return cursor.getInt(cursor.getColumnIndex("seqno"))
-            }
-        } finally {
-            cursor?.close()
-        }
-        return 0
-    }
-
-    fun getUnconfirmNum(): Int {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        val sql = ("select COUNT("
-                + BeanPropEnum.TransdtlOffline.devseqno
-                + ") as num from " + TABLE
-                + " where " + BeanPropEnum.TransdtlOffline.upflag + "=0")
-        try {
-            cursor = db.rawQuery(sql, null)
-            if (cursor != null && cursor.moveToNext()) {
-                return cursor.getInt(cursor.getColumnIndex("num"))
-            }
-        } finally {
-            cursor?.close()
-        }
-        return 0
-    }
-
-    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()
-        }
-    }
-
-    fun getLast(): TransdtlOfflineRecord? {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        val orderBy = BeanPropEnum.TransdtlOffline.devseqno.toString() + " desc"
-        try {
-            cursor = db.query(TABLE, null, null, null, null, null, orderBy, "1")
-            if (cursor != null && cursor.moveToNext()) {
-                return getRecord(cursor)
-            }
-            return null
-        } finally {
-            cursor?.close()
-        }
-    }
-
-    fun clear(date: String): Boolean {
-        val db = dbHelper.writableDatabase
-        val selection =
-            BeanPropEnum.TransdtlOffline.upflag.toString() + "=? and " + BeanPropEnum.TransdtlOffline.transdate + "<?"
-        try {
-            db.beginTransaction()
-            if (db.delete(TABLE, selection, arrayOf("1", date)) < 0) {
-                return false
-            }
-            db.setTransactionSuccessful()
-            return true
-        } finally {
-            db.endTransaction()
-        }
-    }
-
-    private fun getRecord(cursor: Cursor): TransdtlOfflineRecord {
-        val record = TransdtlOfflineRecord()
-        record.devphyid = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.devphyid.toString()))
-        record.transdate = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.transdate.toString()))
-        record.transtime = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.transtime.toString()))
-        record.devseqno = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.devseqno.toString()))
-        record.cardno = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.cardno.toString()))
-        record.cardphyid = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.cardphyid.toString()))
-        record.payamt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.payamt.toString()))
-        record.extraamt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.extraamt.toString()))
-        var flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.reversalflag.toString()))
-        when (flag) {
-            ReversalFlag.NONE.toString() -> record.reversalflag = ReversalFlag.NONE
-            ReversalFlag.AUTO.toString() -> record.reversalflag = ReversalFlag.AUTO
-            ReversalFlag.MANUAL.toString() -> record.reversalflag = ReversalFlag.MANUAL
-            else -> record.reversalflag = ReversalFlag.NONE
-        }
-        record.reversalseqno =
-            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.reversalseqno.toString()))
-        record.reversaltransdate =
-            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.reversaltransdate.toString()))
-        record.reversaltranstime =
-            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.reversaltranstime.toString()))
-        flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.status.toString()))
-        when (flag) {
-            PayStatus.INIT.toString() -> record.status = PayStatus.INIT
-            PayStatus.FAIL.toString() -> record.status = PayStatus.FAIL
-            PayStatus.SUC.toString() -> record.status = PayStatus.SUC
-            else -> record.status = PayStatus.INIT
-        }
-        record.upflag = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.upflag.toString()))
-        return record
-    }
-
-    private fun getContentValues(record: TransdtlOfflineRecord): ContentValues {
-        val values = ContentValues()
-        values.put(BeanPropEnum.TransdtlOffline.devphyid.toString(), record.devphyid)
-        values.put(BeanPropEnum.TransdtlOffline.transdate.toString(), record.transdate)
-        values.put(BeanPropEnum.TransdtlOffline.transtime.toString(), record.transtime)
-        values.put(BeanPropEnum.TransdtlOffline.devseqno.toString(), record.devseqno)
-        values.put(BeanPropEnum.TransdtlOffline.cardno.toString(), record.cardno)
-        values.put(BeanPropEnum.TransdtlOffline.cardphyid.toString(), record.cardphyid)
-        values.put(BeanPropEnum.TransdtlOffline.payamt.toString(), record.payamt)
-        values.put(BeanPropEnum.TransdtlOffline.extraamt.toString(), record.extraamt)
-        values.put(BeanPropEnum.TransdtlOffline.reversalflag.toString(), record.reversalflag.toString())
-        values.put(BeanPropEnum.TransdtlOffline.reversalseqno.toString(), record.reversalseqno)
-        values.put(BeanPropEnum.TransdtlOffline.reversaltransdate.toString(), record.reversaltransdate)
-        values.put(BeanPropEnum.TransdtlOffline.reversaltranstime.toString(), record.reversaltranstime)
-        values.put(BeanPropEnum.TransdtlOffline.status.toString(), record.status.toString())
-        values.put(BeanPropEnum.TransdtlOffline.upflag.toString(), record.upflag)
-        return values
-    }
+package com.supwisdom.db
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
+import com.supwisdom.entity.TransdtlOfflineRecord
+import java.util.concurrent.locks.Lock
+import java.util.concurrent.locks.ReentrantLock
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class TransdtlOfflineDao constructor(context: Context) {
+    private val dbHelper = DBTransdtlHelper.getInstance(context)
+    private val TABLE = DBTransdtlHelper.TABLE_NAME_DTL_OFFLINE
+
+    private val lock = ReentrantLock()
+    fun getLock(): Lock {
+        return lock
+    }
+
+    fun save(record: TransdtlOfflineRecord): 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 update(record: TransdtlOfflineRecord): Boolean {
+        val db = dbHelper.writableDatabase
+        val values = getContentValues(record)
+        try {
+            db.beginTransaction()
+            if (db.update(
+                    TABLE,
+                    values,
+                    BeanPropEnum.TransdtlOffline.devseqno.toString() + "=?",
+                    arrayOf(record.devseqno.toString())
+                ) > 0
+            ) {
+                db.setTransactionSuccessful()
+                return true
+            }
+        } finally {
+            db.endTransaction()
+        }
+        return false
+    }
+
+    fun getAll(): List<TransdtlOfflineRecord> {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val orderby = BeanPropEnum.TransdtlOffline.devseqno.toString() + " desc"
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, orderby)
+            val list = ArrayList<TransdtlOfflineRecord>()
+            while (cursor != null && cursor.moveToNext()) {
+                list.add(getRecord(cursor))
+            }
+            return list
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    fun getOfflineAmt(date: String, cardno: String, cardphyid: String): Int {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        var sql = ("select sum(${BeanPropEnum.TransdtlOffline.payamt}) as sumamt from $TABLE where "
+                + BeanPropEnum.TransdtlOffline.transdate.toString() + "='" + date + "' and "
+                + BeanPropEnum.TransdtlOffline.cardno.toString() + "='" + cardno + "' and "
+                + BeanPropEnum.TransdtlOffline.cardphyid.toString() + "='" + cardphyid + "' and "
+                + BeanPropEnum.TransdtlOffline.reversalflag.toString() + "='" + ReversalFlag.NONE.toString() + "' and "
+                + BeanPropEnum.TransdtlOffline.status.toString() + "='" + PayStatus.SUC.toString() + "'")
+        var sumamt = 0
+        try {
+            cursor = db.rawQuery(sql, null, null)
+            if (cursor != null && cursor.moveToNext()) {
+                sumamt = cursor.getInt(cursor.getColumnIndex("sumamt"))
+            }
+        } finally {
+            cursor?.close()
+        }
+
+        sql = ("select sum(${BeanPropEnum.TransdtlOffline.payamt}) as sumamt from $TABLE where "
+                + BeanPropEnum.TransdtlOffline.transdate.toString() + "='" + date + "' and "
+                + BeanPropEnum.TransdtlOffline.cardno.toString() + "='" + cardno + "' and "
+                + BeanPropEnum.TransdtlOffline.cardphyid.toString() + "='" + cardphyid + "' and "
+                + BeanPropEnum.TransdtlOffline.reversalflag.toString() + "<>'" + ReversalFlag.NONE.toString() + "' and "
+                + BeanPropEnum.TransdtlOffline.status.toString() + "='" + PayStatus.SUC.toString() + "'")
+        try {
+            cursor = db.rawQuery(sql, null, null)
+            if (cursor != null && cursor.moveToNext()) {
+                val reverse = cursor.getInt(cursor.getColumnIndex("sumamt"))
+                if (sumamt > reverse) {
+                    return (sumamt - reverse)
+                }
+            }
+        } finally {
+            cursor?.close()
+        }
+        return 0
+    }
+
+    fun getUnconfirm(): List<TransdtlOfflineRecord> {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val selection = BeanPropEnum.TransdtlOffline.upflag.toString() + "=?"
+        try {
+            cursor = db.query(TABLE, null, selection, arrayOf("0"), null, null, null)
+            val list = ArrayList<TransdtlOfflineRecord>()
+            while (cursor != null && cursor.moveToNext()) {
+                list.add(getRecord(cursor))
+            }
+            return list
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    fun getMaxSeqno(): Int {
+        val db = dbHelper.readableDatabase
+        val sql = ("select max(${BeanPropEnum.TransdtlOffline.devseqno}) as seqno from $TABLE")
+        var cursor: Cursor? = null
+        try {
+            cursor = db.rawQuery(sql, null, null)
+            if (cursor != null && cursor.moveToNext()) {
+                return cursor.getInt(cursor.getColumnIndex("seqno"))
+            }
+        } finally {
+            cursor?.close()
+        }
+        return 0
+    }
+
+    fun getUnconfirmNum(): Int {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val sql = ("select COUNT("
+                + BeanPropEnum.TransdtlOffline.devseqno
+                + ") as num from " + TABLE
+                + " where " + BeanPropEnum.TransdtlOffline.upflag + "=0")
+        try {
+            cursor = db.rawQuery(sql, null)
+            if (cursor != null && cursor.moveToNext()) {
+                return cursor.getInt(cursor.getColumnIndex("num"))
+            }
+        } finally {
+            cursor?.close()
+        }
+        return 0
+    }
+
+    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()
+        }
+    }
+
+    fun getLast(): TransdtlOfflineRecord? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val orderBy = BeanPropEnum.TransdtlOffline.devseqno.toString() + " desc"
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, orderBy, "1")
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor)
+            }
+            return null
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    fun clear(date: String): Boolean {
+        val db = dbHelper.writableDatabase
+        val selection =
+            BeanPropEnum.TransdtlOffline.upflag.toString() + "=? and " + BeanPropEnum.TransdtlOffline.transdate + "<?"
+        try {
+            db.beginTransaction()
+            if (db.delete(TABLE, selection, arrayOf("1", date)) < 0) {
+                return false
+            }
+            db.setTransactionSuccessful()
+            return true
+        } finally {
+            db.endTransaction()
+        }
+    }
+
+    private fun getRecord(cursor: Cursor): TransdtlOfflineRecord {
+        val record = TransdtlOfflineRecord()
+        record.devphyid =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.devphyid.toString()))
+        record.transdate =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.transdate.toString()))
+        record.transtime =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.transtime.toString()))
+        record.devseqno =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.devseqno.toString()))
+        record.cardno =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.cardno.toString()))
+        record.cardphyid =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.cardphyid.toString()))
+        record.payamt =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.payamt.toString()))
+        record.extraamt =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.extraamt.toString()))
+        var flag =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.reversalflag.toString()))
+        when (flag) {
+            ReversalFlag.NONE.toString() -> record.reversalflag = ReversalFlag.NONE
+            ReversalFlag.AUTO.toString() -> record.reversalflag = ReversalFlag.AUTO
+            ReversalFlag.MANUAL.toString() -> record.reversalflag = ReversalFlag.MANUAL
+            else -> record.reversalflag = ReversalFlag.NONE
+        }
+        record.reversalseqno =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.reversalseqno.toString()))
+        record.reversaltransdate =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.reversaltransdate.toString()))
+        record.reversaltranstime =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.reversaltranstime.toString()))
+        flag =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.status.toString()))
+        when (flag) {
+            PayStatus.INIT.toString() -> record.status = PayStatus.INIT
+            PayStatus.FAIL.toString() -> record.status = PayStatus.FAIL
+            PayStatus.SUC.toString() -> record.status = PayStatus.SUC
+            else -> record.status = PayStatus.INIT
+        }
+        record.upflag =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.upflag.toString()))
+        return record
+    }
+
+    private fun getContentValues(record: TransdtlOfflineRecord): ContentValues {
+        val values = ContentValues()
+        values.put(BeanPropEnum.TransdtlOffline.devphyid.toString(), record.devphyid)
+        values.put(BeanPropEnum.TransdtlOffline.transdate.toString(), record.transdate)
+        values.put(BeanPropEnum.TransdtlOffline.transtime.toString(), record.transtime)
+        values.put(BeanPropEnum.TransdtlOffline.devseqno.toString(), record.devseqno)
+        values.put(BeanPropEnum.TransdtlOffline.cardno.toString(), record.cardno)
+        values.put(BeanPropEnum.TransdtlOffline.cardphyid.toString(), record.cardphyid)
+        values.put(BeanPropEnum.TransdtlOffline.payamt.toString(), record.payamt)
+        values.put(BeanPropEnum.TransdtlOffline.extraamt.toString(), record.extraamt)
+        values.put(
+            BeanPropEnum.TransdtlOffline.reversalflag.toString(),
+            record.reversalflag.toString()
+        )
+        values.put(BeanPropEnum.TransdtlOffline.reversalseqno.toString(), record.reversalseqno)
+        values.put(
+            BeanPropEnum.TransdtlOffline.reversaltransdate.toString(),
+            record.reversaltransdate
+        )
+        values.put(
+            BeanPropEnum.TransdtlOffline.reversaltranstime.toString(),
+            record.reversaltranstime
+        )
+        values.put(BeanPropEnum.TransdtlOffline.status.toString(), record.status.toString())
+        values.put(BeanPropEnum.TransdtlOffline.upflag.toString(), record.upflag)
+        return values
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
index 0a76b2b..37a97be 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
@@ -1,226 +1,247 @@
-package com.supwisdom.db
-
-import android.content.ContentValues
-import android.content.Context
-import android.database.Cursor
-import com.supwisdom.entity.PayStatus
-import com.supwisdom.entity.ReversalFlag
-import com.supwisdom.entity.TransdtlOnlineRecord
-import java.util.concurrent.locks.Lock
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-class TransdtlOnlineDao constructor(context: Context) {
-    private val dbHelper = DBTransdtlHelper.getInstance(context)
-    private val TABLE = DBTransdtlHelper.TABLE_NAME_DTL_ONLINE
-
-    fun getLock(): Lock {
-        return dbHelper.getLock()
-    }
-
-    fun save(record: TransdtlOnlineRecord): 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 update(record: TransdtlOnlineRecord): Boolean {
-        val db = dbHelper.writableDatabase
-        val values = getContentValues(record)
-        try {
-            db.beginTransaction()
-            if (db.update(
-                    TABLE,
-                    values,
-                    BeanPropEnum.TransdtlOnline.devseqno.toString() + "=?",
-                    arrayOf(record.devseqno.toString())
-                ) > 0
-            ) {
-                db.setTransactionSuccessful()
-                return true
-            }
-        } finally {
-            db.endTransaction()
-        }
-        return false
-    }
-
-    fun getAll(): List<TransdtlOnlineRecord> {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        val orderby = BeanPropEnum.TransdtlOnline.devseqno.toString() + " desc"
-        try {
-            cursor = db.query(TABLE, null, null, null, null, null, orderby)
-            val list = ArrayList<TransdtlOnlineRecord>()
-            while (cursor != null && cursor.moveToNext()) {
-                list.add(getRecord(cursor))
-            }
-            return list
-        } finally {
-            cursor?.close()
-        }
-    }
-
-    fun getUnconfirm(): List<TransdtlOnlineRecord> {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        val selection = BeanPropEnum.TransdtlOnline.upflag.toString() + "=?"
-        try {
-            cursor = db.query(TABLE, null, selection, arrayOf("0"), null, null, null)
-            val list = ArrayList<TransdtlOnlineRecord>()
-            while (cursor != null && cursor.moveToNext()) {
-                list.add(getRecord(cursor))
-            }
-            return list
-        } finally {
-            cursor?.close()
-        }
-    }
-
-    fun getLast(): TransdtlOnlineRecord? {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        val orderBy = BeanPropEnum.TransdtlOnline.devseqno.toString() + " desc"
-        try {
-            cursor = db.query(TABLE, null, null, null, null, null, orderBy, "1")
-            if (cursor != null && cursor.moveToNext()) {
-                return getRecord(cursor)
-            }
-            return null
-        } finally {
-            cursor?.close()
-        }
-    }
-
-    fun getUnconfirmNum(): Int {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        val sql = ("select COUNT("
-                + BeanPropEnum.TransdtlOnline.devseqno
-                + ") as num from " + TABLE
-                + " where " + BeanPropEnum.TransdtlOnline.upflag + "=0")
-        try {
-            cursor = db.rawQuery(sql, null)
-            if (cursor != null && cursor.moveToNext()) {
-                return cursor.getInt(cursor.getColumnIndex("num"))
-            }
-        } finally {
-            cursor?.close()
-        }
-        return 0
-    }
-
-    fun getMaxSeqno(): Int {
-        val db = dbHelper.readableDatabase
-        val sql = ("select max(${BeanPropEnum.TransdtlOnline.devseqno}) as seqno from $TABLE")
-        var cursor: Cursor? = null
-        try {
-            cursor = db.rawQuery(sql, null, null)
-            if (cursor != null && cursor.moveToNext()) {
-                return cursor.getInt(cursor.getColumnIndex("seqno"))
-            }
-        } finally {
-            cursor?.close()
-        }
-        return 0
-    }
-
-    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()
-        }
-    }
-
-    fun clear(date: String): Boolean {
-        val db = dbHelper.writableDatabase
-        val selection =
-            BeanPropEnum.TransdtlOnline.upflag.toString() + "=? and " + BeanPropEnum.TransdtlOnline.transdate + "<?"
-        try {
-            db.beginTransaction()
-            if (db.delete(TABLE, selection, arrayOf("1", date)) < 0) {
-                return false
-            }
-            db.setTransactionSuccessful()
-            return true
-        } finally {
-            db.endTransaction()
-        }
-    }
-
-    private fun getRecord(cursor: Cursor): TransdtlOnlineRecord {
-        val record = TransdtlOnlineRecord()
-        record.devphyid = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.devphyid.toString()))
-        record.transdate = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.transdate.toString()))
-        record.transtime = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.transtime.toString()))
-        record.devseqno = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.devseqno.toString()))
-        record.cardno = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.cardno.toString()))
-        record.cardphyid = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.cardphyid.toString()))
-        record.qrcode = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.qrcode.toString()))
-        record.transtype = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.transtype.toString()))
-        record.billno = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.billno.toString()))
-        record.managefeetype =
-            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.managefeetype.toString()))
-        record.username = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.username.toString()))
-        record.payamt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.payamt.toString()))
-        record.extraamt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.extraamt.toString()))
-        var flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.reversalflag.toString()))
-        when (flag) {
-            ReversalFlag.NONE.toString() -> record.reversalflag = ReversalFlag.NONE
-            ReversalFlag.AUTO.toString() -> record.reversalflag = ReversalFlag.AUTO
-            ReversalFlag.MANUAL.toString() -> record.reversalflag = ReversalFlag.MANUAL
-            else -> record.reversalflag = ReversalFlag.NONE
-        }
-        record.reversalbillno =
-            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.reversalbillno.toString()))
-        flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.status.toString()))
-        when (flag) {
-            PayStatus.INIT.toString() -> record.status = PayStatus.INIT
-            PayStatus.FAIL.toString() -> record.status = PayStatus.FAIL
-            PayStatus.SUC.toString() -> record.status = PayStatus.SUC
-            else -> record.status = PayStatus.INIT
-        }
-        record.upflag = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.upflag.toString()))
-        return record
-    }
-
-    private fun getContentValues(record: TransdtlOnlineRecord): ContentValues {
-        val values = ContentValues()
-        values.put(BeanPropEnum.TransdtlOnline.devphyid.toString(), record.devphyid)
-        values.put(BeanPropEnum.TransdtlOnline.transdate.toString(), record.transdate)
-        values.put(BeanPropEnum.TransdtlOnline.transtime.toString(), record.transtime)
-        values.put(BeanPropEnum.TransdtlOnline.devseqno.toString(), record.devseqno)
-        values.put(BeanPropEnum.TransdtlOnline.cardno.toString(), record.cardno)
-        values.put(BeanPropEnum.TransdtlOnline.cardphyid.toString(), record.cardphyid)
-        values.put(BeanPropEnum.TransdtlOnline.qrcode.toString(), record.qrcode)
-        values.put(BeanPropEnum.TransdtlOnline.transtype.toString(), record.transtype)
-        values.put(BeanPropEnum.TransdtlOnline.payamt.toString(), record.payamt)
-        values.put(BeanPropEnum.TransdtlOnline.extraamt.toString(), record.extraamt)
-        values.put(BeanPropEnum.TransdtlOnline.billno.toString(), record.billno)
-        values.put(BeanPropEnum.TransdtlOnline.managefeetype.toString(), record.managefeetype)
-        values.put(BeanPropEnum.TransdtlOnline.username.toString(), record.username)
-        values.put(BeanPropEnum.TransdtlOnline.reversalflag.toString(), record.reversalflag.toString())
-        values.put(BeanPropEnum.TransdtlOnline.reversalbillno.toString(), record.reversalbillno)
-        values.put(BeanPropEnum.TransdtlOnline.status.toString(), record.status.toString())
-        values.put(BeanPropEnum.TransdtlOnline.upflag.toString(), record.upflag)
-        return values
-    }
+package com.supwisdom.db
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
+import com.supwisdom.entity.TransdtlOnlineRecord
+import java.util.concurrent.locks.Lock
+import java.util.concurrent.locks.ReentrantLock
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class TransdtlOnlineDao constructor(context: Context) {
+    private val dbHelper = DBTransdtlHelper.getInstance(context)
+    private val TABLE = DBTransdtlHelper.TABLE_NAME_DTL_ONLINE
+
+    private val lock = ReentrantLock()
+    fun getLock(): Lock {
+        return lock
+    }
+
+    fun save(record: TransdtlOnlineRecord): 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 update(record: TransdtlOnlineRecord): Boolean {
+        val db = dbHelper.writableDatabase
+        val values = getContentValues(record)
+        try {
+            db.beginTransaction()
+            if (db.update(
+                    TABLE,
+                    values,
+                    BeanPropEnum.TransdtlOnline.devseqno.toString() + "=?",
+                    arrayOf(record.devseqno.toString())
+                ) > 0
+            ) {
+                db.setTransactionSuccessful()
+                return true
+            }
+        } finally {
+            db.endTransaction()
+        }
+        return false
+    }
+
+    fun getAll(): List<TransdtlOnlineRecord> {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val orderby = BeanPropEnum.TransdtlOnline.devseqno.toString() + " desc"
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, orderby)
+            val list = ArrayList<TransdtlOnlineRecord>()
+            while (cursor != null && cursor.moveToNext()) {
+                list.add(getRecord(cursor))
+            }
+            return list
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    fun getUnconfirm(): List<TransdtlOnlineRecord> {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val selection = BeanPropEnum.TransdtlOnline.upflag.toString() + "=?"
+        try {
+            cursor = db.query(TABLE, null, selection, arrayOf("0"), null, null, null)
+            val list = ArrayList<TransdtlOnlineRecord>()
+            while (cursor != null && cursor.moveToNext()) {
+                list.add(getRecord(cursor))
+            }
+            return list
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    fun getLast(): TransdtlOnlineRecord? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val orderBy = BeanPropEnum.TransdtlOnline.devseqno.toString() + " desc"
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, orderBy, "1")
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor)
+            }
+            return null
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    fun getUnconfirmNum(): Int {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val sql = ("select COUNT("
+                + BeanPropEnum.TransdtlOnline.devseqno
+                + ") as num from " + TABLE
+                + " where " + BeanPropEnum.TransdtlOnline.upflag + "=0")
+        try {
+            cursor = db.rawQuery(sql, null)
+            if (cursor != null && cursor.moveToNext()) {
+                return cursor.getInt(cursor.getColumnIndex("num"))
+            }
+        } finally {
+            cursor?.close()
+        }
+        return 0
+    }
+
+    fun getMaxSeqno(): Int {
+        val db = dbHelper.readableDatabase
+        val sql = ("select max(${BeanPropEnum.TransdtlOnline.devseqno}) as seqno from $TABLE")
+        var cursor: Cursor? = null
+        try {
+            cursor = db.rawQuery(sql, null, null)
+            if (cursor != null && cursor.moveToNext()) {
+                return cursor.getInt(cursor.getColumnIndex("seqno"))
+            }
+        } finally {
+            cursor?.close()
+        }
+        return 0
+    }
+
+    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()
+        }
+    }
+
+    fun clear(date: String): Boolean {
+        val db = dbHelper.writableDatabase
+        val selection =
+            BeanPropEnum.TransdtlOnline.upflag.toString() + "=? and " + BeanPropEnum.TransdtlOnline.transdate + "<?"
+        try {
+            db.beginTransaction()
+            if (db.delete(TABLE, selection, arrayOf("1", date)) < 0) {
+                return false
+            }
+            db.setTransactionSuccessful()
+            return true
+        } finally {
+            db.endTransaction()
+        }
+    }
+
+    private fun getRecord(cursor: Cursor): TransdtlOnlineRecord {
+        val record = TransdtlOnlineRecord()
+        record.devphyid =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.devphyid.toString()))
+        record.transdate =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.transdate.toString()))
+        record.transtime =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.transtime.toString()))
+        record.devseqno =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.devseqno.toString()))
+        record.cardno =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.cardno.toString()))
+        record.cardphyid =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.cardphyid.toString()))
+        record.qrcode =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.qrcode.toString()))
+        record.transtype =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.transtype.toString()))
+        record.billno =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.billno.toString()))
+        record.managefeetype =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.managefeetype.toString()))
+        record.username =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.username.toString()))
+        record.payamt =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.payamt.toString()))
+        record.extraamt =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.extraamt.toString()))
+        var flag =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.reversalflag.toString()))
+        when (flag) {
+            ReversalFlag.NONE.toString() -> record.reversalflag = ReversalFlag.NONE
+            ReversalFlag.AUTO.toString() -> record.reversalflag = ReversalFlag.AUTO
+            ReversalFlag.MANUAL.toString() -> record.reversalflag = ReversalFlag.MANUAL
+            else -> record.reversalflag = ReversalFlag.NONE
+        }
+        record.reversalbillno =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.reversalbillno.toString()))
+        flag =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.status.toString()))
+        when (flag) {
+            PayStatus.INIT.toString() -> record.status = PayStatus.INIT
+            PayStatus.FAIL.toString() -> record.status = PayStatus.FAIL
+            PayStatus.SUC.toString() -> record.status = PayStatus.SUC
+            PayStatus.UNCONFIRM.toString() -> record.status = PayStatus.UNCONFIRM
+            else -> record.status = PayStatus.INIT
+        }
+        record.upflag =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.upflag.toString()))
+        return record
+    }
+
+    private fun getContentValues(record: TransdtlOnlineRecord): ContentValues {
+        val values = ContentValues()
+        values.put(BeanPropEnum.TransdtlOnline.devphyid.toString(), record.devphyid)
+        values.put(BeanPropEnum.TransdtlOnline.transdate.toString(), record.transdate)
+        values.put(BeanPropEnum.TransdtlOnline.transtime.toString(), record.transtime)
+        values.put(BeanPropEnum.TransdtlOnline.devseqno.toString(), record.devseqno)
+        values.put(BeanPropEnum.TransdtlOnline.cardno.toString(), record.cardno)
+        values.put(BeanPropEnum.TransdtlOnline.cardphyid.toString(), record.cardphyid)
+        values.put(BeanPropEnum.TransdtlOnline.qrcode.toString(), record.qrcode)
+        values.put(BeanPropEnum.TransdtlOnline.transtype.toString(), record.transtype)
+        values.put(BeanPropEnum.TransdtlOnline.payamt.toString(), record.payamt)
+        values.put(BeanPropEnum.TransdtlOnline.extraamt.toString(), record.extraamt)
+        values.put(BeanPropEnum.TransdtlOnline.billno.toString(), record.billno)
+        values.put(BeanPropEnum.TransdtlOnline.managefeetype.toString(), record.managefeetype)
+        values.put(BeanPropEnum.TransdtlOnline.username.toString(), record.username)
+        values.put(
+            BeanPropEnum.TransdtlOnline.reversalflag.toString(),
+            record.reversalflag.toString()
+        )
+        values.put(BeanPropEnum.TransdtlOnline.reversalbillno.toString(), record.reversalbillno)
+        values.put(BeanPropEnum.TransdtlOnline.status.toString(), record.status.toString())
+        values.put(BeanPropEnum.TransdtlOnline.upflag.toString(), record.upflag)
+        return values
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
index b304c45..3d9c305 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
@@ -1,126 +1,133 @@
-package com.supwisdom.db
-
-import android.content.Context
-import android.database.Cursor
-import com.supwisdom.entity.PayStatus
-import com.supwisdom.entity.ReversalFlag
-import com.supwisdom.entity.TransdtlUnionRecord
-import java.util.concurrent.locks.Lock
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc
- **/
-class TransdtlUnionDao constructor(context: Context) {
-    private val tablesql = StringBuilder()
-    private val dbHelper = DBTransdtlHelper.getInstance(context)
-
-    init {
-        tablesql.append("select ")
-            .append(BeanPropEnum.TransdtlOffline.transdate).append(",")
-            .append(BeanPropEnum.TransdtlOffline.transtime).append(",")
-            .append(BeanPropEnum.TransdtlOffline.devseqno).append(",")
-            .append(" 'offcard' as ").append(BeanPropEnum.TransdtlUnion.payway).append(",")
-            .append(BeanPropEnum.TransdtlOffline.reversalflag).append(",")
-            .append(BeanPropEnum.TransdtlOffline.payamt).append(",")
-            .append(BeanPropEnum.TransdtlOffline.status).append(",")
-            .append(" 'null' as ").append(BeanPropEnum.TransdtlUnion.username).append(",")
-            .append(BeanPropEnum.TransdtlOffline.cardno).append(",")
-            .append(BeanPropEnum.TransdtlOffline.upflag)
-            .append(" from ").append(DBTransdtlHelper.TABLE_NAME_DTL_OFFLINE)
-            .append(" UNION ALL select ")
-            .append(BeanPropEnum.TransdtlOnline.transdate).append(",")
-            .append(BeanPropEnum.TransdtlOnline.transtime).append(",")
-            .append(BeanPropEnum.TransdtlOnline.devseqno).append(",")
-            .append(BeanPropEnum.TransdtlOnline.transtype).append(" as ").append(BeanPropEnum.TransdtlUnion.payway)
-            .append(",")
-            .append(BeanPropEnum.TransdtlOnline.reversalflag).append(",")
-            .append(BeanPropEnum.TransdtlOnline.payamt).append(",")
-            .append(BeanPropEnum.TransdtlOnline.status).append(",")
-            .append(BeanPropEnum.TransdtlOnline.username).append(",")
-            .append(BeanPropEnum.TransdtlOnline.cardno).append(",")
-            .append(BeanPropEnum.TransdtlOnline.upflag)
-            .append(" from ").append(DBTransdtlHelper.TABLE_NAME_DTL_ONLINE)
-    }
-
-    fun getLock(): Lock {
-        return dbHelper.getLock()
-    }
-
-    fun get(date: String, offset: Int, flag: Int, num: Int): List<TransdtlUnionRecord> {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        var sql = when (flag) {
-            0 -> {
-                ("select * from ("
-                        + tablesql.toString()
-                        + ") where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
-                        + "' order by " + BeanPropEnum.TransdtlUnion.transtime
-                        + " desc ")
-            }
-            1 -> {
-                ("select * from ("
-                        + tablesql.toString()
-                        + ") where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
-                        + "' and " + BeanPropEnum.TransdtlUnion.status + "='"
-                        + PayStatus.SUC.toString()
-                        + "' order by " + BeanPropEnum.TransdtlUnion.transtime
-                        + " desc ")
-            }
-            else -> {
-                ("select * from ("
-                        + tablesql.toString()
-                        + ") where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
-                        + "' and " + BeanPropEnum.TransdtlUnion.status + "='"
-                        + PayStatus.FAIL.toString()
-                        + "' order by " + BeanPropEnum.TransdtlUnion.transtime
-                        + " desc ")
-            }
-        }
-        sql += if (offset > 0) {
-            " limit $num offset $offset"
-        } else {
-            " limit $num"
-        }
-        try {
-            cursor = db.rawQuery(sql, null)
-            val list = ArrayList<TransdtlUnionRecord>()
-            while (cursor != null && cursor.moveToNext()) {
-                list.add(getRecord(cursor))
-            }
-            return list
-        } finally {
-            cursor?.close()
-        }
-    }
-
-    private fun getRecord(cursor: Cursor): TransdtlUnionRecord {
-        val record = TransdtlUnionRecord()
-        record.transdate = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.transdate.toString()))
-        record.transtime = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.transtime.toString()))
-        record.devseqno = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.devseqno.toString()))
-        record.payway = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.payway.toString()))
-        record.username = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.username.toString()))
-        if (record.username == "null") {
-            record.username = null
-        }
-        record.cardno = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.cardno.toString()))
-        var flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.reversalflag.toString()))
-        when (flag) {
-            ReversalFlag.NONE.toString() -> record.reversalflag = ReversalFlag.NONE
-            ReversalFlag.AUTO.toString() -> record.reversalflag = ReversalFlag.AUTO
-            ReversalFlag.MANUAL.toString() -> record.reversalflag = ReversalFlag.MANUAL
-            else -> record.reversalflag = ReversalFlag.NONE
-        }
-        record.payamt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.payamt.toString()))
-        flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.status.toString()))
-        when (flag) {
-            PayStatus.INIT.toString() -> record.status = PayStatus.INIT
-            PayStatus.FAIL.toString() -> record.status = PayStatus.FAIL
-            PayStatus.SUC.toString() -> record.status = PayStatus.SUC
-            else -> record.status = PayStatus.INIT
-        }
-        record.upflag = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.upflag.toString()))
-        return record
-    }
+package com.supwisdom.db
+
+import android.content.Context
+import android.database.Cursor
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
+import com.supwisdom.entity.TransdtlUnionRecord
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class TransdtlUnionDao constructor(context: Context) {
+    private val tablesql = StringBuilder()
+    private val dbHelper = DBTransdtlHelper.getInstance(context)
+
+    init {
+        tablesql.append("select ")
+            .append(BeanPropEnum.TransdtlOffline.transdate).append(",")
+            .append(BeanPropEnum.TransdtlOffline.transtime).append(",")
+            .append(BeanPropEnum.TransdtlOffline.devseqno).append(",")
+            .append(" 'offcard' as ").append(BeanPropEnum.TransdtlUnion.payway).append(",")
+            .append(BeanPropEnum.TransdtlOffline.reversalflag).append(",")
+            .append(BeanPropEnum.TransdtlOffline.payamt).append(",")
+            .append(BeanPropEnum.TransdtlOffline.status).append(",")
+            .append(" 'null' as ").append(BeanPropEnum.TransdtlUnion.username).append(",")
+            .append(BeanPropEnum.TransdtlOffline.cardno).append(",")
+            .append(BeanPropEnum.TransdtlOffline.upflag)
+            .append(" from ").append(DBTransdtlHelper.TABLE_NAME_DTL_OFFLINE)
+            .append(" UNION ALL select ")
+            .append(BeanPropEnum.TransdtlOnline.transdate).append(",")
+            .append(BeanPropEnum.TransdtlOnline.transtime).append(",")
+            .append(BeanPropEnum.TransdtlOnline.devseqno).append(",")
+            .append(BeanPropEnum.TransdtlOnline.transtype).append(" as ")
+            .append(BeanPropEnum.TransdtlUnion.payway)
+            .append(",")
+            .append(BeanPropEnum.TransdtlOnline.reversalflag).append(",")
+            .append(BeanPropEnum.TransdtlOnline.payamt).append(",")
+            .append(BeanPropEnum.TransdtlOnline.status).append(",")
+            .append(BeanPropEnum.TransdtlOnline.username).append(",")
+            .append(BeanPropEnum.TransdtlOnline.cardno).append(",")
+            .append(BeanPropEnum.TransdtlOnline.upflag)
+            .append(" from ").append(DBTransdtlHelper.TABLE_NAME_DTL_ONLINE)
+    }
+
+    fun get(date: String, offset: Int, flag: Int, num: Int): List<TransdtlUnionRecord> {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        var sql = when (flag) {
+            0 -> {
+                ("select * from ("
+                        + tablesql.toString()
+                        + ") where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
+                        + "' order by " + BeanPropEnum.TransdtlUnion.transtime
+                        + " desc ")
+            }
+            1 -> {
+                ("select * from ("
+                        + tablesql.toString()
+                        + ") where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
+                        + "' and (" + BeanPropEnum.TransdtlUnion.status + "='"
+                        + PayStatus.SUC.toString() + "' or " + BeanPropEnum.TransdtlUnion.status + "='"
+                        + PayStatus.UNCONFIRM.toString()
+                        + "') order by " + BeanPropEnum.TransdtlUnion.transtime
+                        + " desc ")
+            }
+            else -> {
+                ("select * from ("
+                        + tablesql.toString()
+                        + ") where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
+                        + "' and " + BeanPropEnum.TransdtlUnion.status + "='"
+                        + PayStatus.FAIL.toString()
+                        + "' order by " + BeanPropEnum.TransdtlUnion.transtime
+                        + " desc ")
+            }
+        }
+        sql += if (offset > 0) {
+            " limit $num offset $offset"
+        } else {
+            " limit $num"
+        }
+        try {
+            cursor = db.rawQuery(sql, null)
+            val list = ArrayList<TransdtlUnionRecord>()
+            while (cursor != null && cursor.moveToNext()) {
+                list.add(getRecord(cursor))
+            }
+            return list
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    private fun getRecord(cursor: Cursor): TransdtlUnionRecord {
+        val record = TransdtlUnionRecord()
+        record.transdate =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.transdate.toString()))
+        record.transtime =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.transtime.toString()))
+        record.devseqno =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.devseqno.toString()))
+        record.payway =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.payway.toString()))
+        record.username =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.username.toString()))
+        if (record.username == "null") {
+            record.username = null
+        }
+        record.cardno =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.cardno.toString()))
+        var flag =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.reversalflag.toString()))
+        when (flag) {
+            ReversalFlag.NONE.toString() -> record.reversalflag = ReversalFlag.NONE
+            ReversalFlag.AUTO.toString() -> record.reversalflag = ReversalFlag.AUTO
+            ReversalFlag.MANUAL.toString() -> record.reversalflag = ReversalFlag.MANUAL
+            else -> record.reversalflag = ReversalFlag.NONE
+        }
+        record.payamt =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.payamt.toString()))
+        flag = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.status.toString()))
+        when (flag) {
+            PayStatus.INIT.toString() -> record.status = PayStatus.INIT
+            PayStatus.FAIL.toString() -> record.status = PayStatus.FAIL
+            PayStatus.SUC.toString() -> record.status = PayStatus.SUC
+            PayStatus.UNCONFIRM.toString() -> record.status = PayStatus.UNCONFIRM
+            else -> record.status = PayStatus.INIT
+        }
+        record.upflag =
+            cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlUnion.upflag.toString()))
+        return record
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/WhiteListDao.kt b/app/src/main/java/com/supwisdom/db/WhiteListDao.kt
index 2630c43..0c734fc 100644
--- a/app/src/main/java/com/supwisdom/db/WhiteListDao.kt
+++ b/app/src/main/java/com/supwisdom/db/WhiteListDao.kt
@@ -1,82 +1,88 @@
-package com.supwisdom.db
-
-import android.content.ContentValues
-import android.content.Context
-import android.database.Cursor
-import com.supwisdom.entity.WhiteListRecord
-import java.util.concurrent.locks.Lock
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc
- **/
-class WhiteListDao constructor(context: Context) {
-    private val dbHelper = DBParaHelper.getInstance(context)
-    private val TABLE = DBParaHelper.TABLE_NAME_WHITELIST
-
-    fun getLock(): Lock {
-        return dbHelper.getLock()
-    }
-
-    fun replace(list: List<WhiteListRecord>): Boolean {
-        val db = dbHelper.readableDatabase
-        try {
-            db.beginTransaction()
-            list.forEach {
-                val values = getContentValues(it)
-                if (db.replace(TABLE, null, values) < 0) {
-                    return false
-                }
-            }
-            db.setTransactionSuccessful()
-            return true
-        } finally {
-            db.endTransaction()
-        }
-    }
-
-    fun get(cardphyid: String, cardno: String): WhiteListRecord? {
-        val db = dbHelper.readableDatabase
-        var cursor: Cursor? = null
-        val selection = BeanPropEnum.WhiteList.cardphyid.toString() + "=? and " + BeanPropEnum.WhiteList.cardno + "=?"
-        try {
-            cursor = db.query(TABLE, null, selection, arrayOf(cardphyid, cardno), null, null, null)
-            if (cursor != null && cursor.moveToNext()) {
-                return getRecord(cursor)
-            }
-        } finally {
-            cursor?.close()
-        }
-        return null
-    }
-
-    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): WhiteListRecord {
-        val record = WhiteListRecord()
-        record.cardphyid = cursor.getString(cursor.getColumnIndex(BeanPropEnum.WhiteList.cardphyid.toString()))
-        record.cardno = cursor.getString(cursor.getColumnIndex(BeanPropEnum.WhiteList.cardno.toString()))
-        record.status = cursor.getString(cursor.getColumnIndex(BeanPropEnum.WhiteList.status.toString()))
-        return record
-    }
-
-    private fun getContentValues(record: WhiteListRecord): ContentValues {
-        val values = ContentValues()
-        values.put(BeanPropEnum.WhiteList.cardphyid.toString(), record.cardphyid)
-        values.put(BeanPropEnum.WhiteList.cardno.toString(), record.cardno)
-        values.put(BeanPropEnum.WhiteList.status.toString(), record.status)
-        return values
-    }
+package com.supwisdom.db
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import com.supwisdom.entity.WhiteListRecord
+import java.util.concurrent.locks.Lock
+import java.util.concurrent.locks.ReentrantLock
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class WhiteListDao constructor(context: Context) {
+    private val dbHelper = DBParaHelper.getInstance(context)
+    private val TABLE = DBParaHelper.TABLE_NAME_WHITELIST
+
+    private val lock = ReentrantLock()
+    fun getLock(): Lock {
+        return lock
+    }
+
+    fun replace(list: List<WhiteListRecord>): Boolean {
+        val db = dbHelper.readableDatabase
+        try {
+            db.beginTransaction()
+            list.forEach {
+                val values = getContentValues(it)
+                if (db.replace(TABLE, null, values) < 0) {
+                    return false
+                }
+            }
+            db.setTransactionSuccessful()
+            return true
+        } finally {
+            db.endTransaction()
+        }
+    }
+
+    fun get(cardphyid: String, cardno: String): WhiteListRecord? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val selection =
+            BeanPropEnum.WhiteList.cardphyid.toString() + "=? and " + BeanPropEnum.WhiteList.cardno + "=?"
+        try {
+            cursor = db.query(TABLE, null, selection, arrayOf(cardphyid, cardno), null, null, null)
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor)
+            }
+        } finally {
+            cursor?.close()
+        }
+        return null
+    }
+
+    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): WhiteListRecord {
+        val record = WhiteListRecord()
+        record.cardphyid =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.WhiteList.cardphyid.toString()))
+        record.cardno =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.WhiteList.cardno.toString()))
+        record.status =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.WhiteList.status.toString()))
+        return record
+    }
+
+    private fun getContentValues(record: WhiteListRecord): ContentValues {
+        val values = ContentValues()
+        values.put(BeanPropEnum.WhiteList.cardphyid.toString(), record.cardphyid)
+        values.put(BeanPropEnum.WhiteList.cardno.toString(), record.cardno)
+        values.put(BeanPropEnum.WhiteList.status.toString(), record.status)
+        return values
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/SysParaRecord.kt b/app/src/main/java/com/supwisdom/entity/SysParaRecord.kt
index 8829b75..8df002b 100644
--- a/app/src/main/java/com/supwisdom/entity/SysParaRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/SysParaRecord.kt
@@ -1,21 +1,23 @@
-package com.supwisdom.entity
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc 后台系统参数
- **/
-class SysParaRecord {
-    var returnFlag: Int = 0// 消费撤销开关  0bit -0x1表示冲正使能
-    var heatBeat: Int = 0// 心跳间隔
-    var offlineEnable: Boolean = false // 脱机消费时限开关  false-关闭， true-开启
-    var maxOfflineDays: Int = 0// 最大脱机天数
-    var maxDayOfflineAmt: Int = 0//同卡当天离线交易最大金额
-    var mngPasswd: String? = null// 维护密码
-    var sucShowtime: Int = 0// 消费成功显示时间
-    var failShowtime: Int = 0 //消费失败显示时间
-    var commTime: Int = 0   //通讯超时时间 默认2s
-    /**
-     * 定额消费同卡消费间隔(s)
-     */
-    var fixpayGap: Int = 0
+package com.supwisdom.entity
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc 后台系统参数
+ **/
+class SysParaRecord {
+    var returnFlag: Int = 0// 消费撤销开关  0bit -0x1表示冲正使能
+    var heatBeat: Int = 0// 心跳间隔
+    var offlineEnable: Boolean = false // 脱机消费时限开关  false-关闭， true-开启
+    var maxOfflineDays: Int = 0// 最大脱机天数
+    var maxDayOfflineAmt: Int = 0//同卡当天离线交易最大金额
+    var mngPasswd: String? = null// 维护密码
+    var sucShowtime: Int = 0// 消费成功显示时间
+    var failShowtime: Int = 0 //消费失败显示时间
+    var commTime: Int = 0   //通讯超时时间 默认2s
+    var synoCode: Boolean = false //晟元扫码 false--关闭 true--开启
+
+    /**
+     * 定额消费同卡消费间隔(s)
+     */
+    var fixpayGap: Int = 0
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt
index 967fbd8..5030919 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt
@@ -1,40 +1,42 @@
-package com.supwisdom.entity
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc
- **/
-class TransdtlUnionRecord {
-    var username: String? = null
-    var cardno: String? = null
-    var transdate: String? = null
-    var transtime: String? = null
-    var devseqno: Int = 0
-    var payway: String? = null //card,code,offcard
-    var reversalflag: ReversalFlag? = null //消费none 自动冲正auto 手动撤销 manual
-    var payamt: Int = 0
-    var status: PayStatus? = null // init,fail,suc
-    var upflag: Int = 0
-}
-
-/**
- * NONE -- 正常消费
- * AUTO -- 自动冲正
- * MANUAL -- 手动撤销
- */
-enum class ReversalFlag {
-    NONE,
-    AUTO,
-    MANUAL
-}
-
-/**
- * INIT -- 初始化
- * FAIL -- 支付失败
- * SUC --支付成功
- */
-enum class PayStatus {
-    INIT,
-    FAIL,
-    SUC
+package com.supwisdom.entity
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class TransdtlUnionRecord {
+    var username: String? = null
+    var cardno: String? = null
+    var transdate: String? = null
+    var transtime: String? = null
+    var devseqno: Int = 0
+    var payway: String? = null //card,code,offcard
+    var reversalflag: ReversalFlag? = null //消费none 自动冲正auto 手动撤销 manual
+    var payamt: Int = 0
+    var status: PayStatus? = null // init,fail,suc
+    var upflag: Int = 0
+}
+
+/**
+ * NONE -- 正常消费
+ * AUTO -- 自动冲正
+ * MANUAL -- 手动撤销
+ */
+enum class ReversalFlag {
+    NONE,
+    AUTO,
+    MANUAL
+}
+
+/**
+ * INIT -- 初始化
+ * FAIL -- 支付失败
+ * SUC --支付成功
+ * UNCONFIRM --未确认
+ */
+enum class PayStatus {
+    INIT,
+    FAIL,
+    SUC,
+    UNCONFIRM
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt b/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
index 74594cc..d3cc649 100644
--- a/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
+++ b/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
@@ -1,276 +1,298 @@
-package com.supwisdom.okhttp
-
-import android.text.TextUtils
-import okhttp3.*
-import okhttp3.MediaType.Companion.toMediaTypeOrNull
-import java.io.IOException
-import java.io.UnsupportedEncodingException
-import java.security.KeyManagementException
-import java.security.KeyStore
-import java.security.KeyStoreException
-import java.security.NoSuchAlgorithmException
-import java.util.*
-import java.util.concurrent.TimeUnit
-import javax.net.ssl.*
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-@Suppress("DEPRECATION")
-class NetworkHandler private constructor() {
-    companion object {
-        private var instance: NetworkHandler? = null
-        fun getInstance(): NetworkHandler {
-            if (instance == null) {
-                synchronized(NetworkHandler::class.java) {
-                    if (instance == null) {
-                        instance = NetworkHandler()
-                    }
-                }
-            }
-            return instance!!
-        }
-    }
-
-    private var client: OkHttpClient? = null
-    private var clientLong: OkHttpClient
-    private val JSON = "application/json; charset=utf-8".toMediaTypeOrNull()
-    private val FORM_ENCODE = "application/x-www-form-urlencoded;charset=utf-8".toMediaTypeOrNull()
-    private var commTime = 5
-    private var tenantId: String? = null
-    private var jwt: String? = null
-    private var sslSocketFactory: SSLSocketFactory? = null
-    private var trustManager: X509TrustManager? = null
-
-    init {
-        try {
-            val trustManagerFactory =
-                TrustManagerFactory.getInstance(
-                    TrustManagerFactory.getDefaultAlgorithm()
-                )
-            trustManagerFactory.init(null as KeyStore?)
-            val trustManagers =
-                trustManagerFactory.trustManagers
-            check(!(trustManagers.size != 1 || trustManagers[0] !is X509TrustManager)) {
-                ("Unexpected default trust managers:"
-                        + Arrays.toString(trustManagers))
-            }
-            trustManager = trustManagers[0] as X509TrustManager
-            val sslContext = SSLContext.getInstance("TLS")
-            sslContext.init(null, arrayOf<TrustManager?>(trustManager), null)
-            sslSocketFactory = sslContext.socketFactory
-        } catch (e: NoSuchAlgorithmException) {
-            e.printStackTrace()
-        } catch (e: KeyManagementException) {
-            e.printStackTrace()
-        } catch (e: KeyStoreException) {
-            e.printStackTrace()
-        }
-
-        client = OkHttpClient()
-            .newBuilder()
-            .followRedirects(true)
-            .followSslRedirects(true)
-            .retryOnConnectionFailure(false)
-            .readTimeout(commTime.toLong(), TimeUnit.SECONDS)
-            .writeTimeout(1, TimeUnit.SECONDS)
-            .connectTimeout(1, TimeUnit.SECONDS)
-            .hostnameVerifier(TrustAllHostnameVerifier())
-            .sslSocketFactory(sslSocketFactory!!, trustManager!!)
-            .build()
-        clientLong = OkHttpClient()
-            .newBuilder()
-            .followRedirects(true)
-            .followSslRedirects(true)
-            .retryOnConnectionFailure(false)
-            .readTimeout(60, TimeUnit.SECONDS)
-            .writeTimeout(1, TimeUnit.SECONDS)
-            .connectTimeout(1, TimeUnit.SECONDS)
-            .hostnameVerifier(TrustAllHostnameVerifier())
-            .sslSocketFactory(sslSocketFactory!!, trustManager!!)
-            .build()
-
-    }
-
-    fun setCommTime(communicateTime: Int) {
-        if (communicateTime != 0 && commTime != communicateTime) {
-            this.commTime = communicateTime
-            client = OkHttpClient()
-                .newBuilder()
-                .followRedirects(true)
-                .followSslRedirects(true)
-                .retryOnConnectionFailure(false)
-                .readTimeout(commTime.toLong(), TimeUnit.SECONDS)
-                .writeTimeout(1, TimeUnit.SECONDS)
-                .connectTimeout(1, TimeUnit.SECONDS)
-                .hostnameVerifier(TrustAllHostnameVerifier())
-                .sslSocketFactory(sslSocketFactory!!, trustManager!!)
-                .build()
-        }
-    }
-
-    fun setTenantId(tenantId: String) {
-        this.tenantId = tenantId
-    }
-
-    fun setJwt(jwt: String?) {
-        if (TextUtils.isEmpty(jwt)) {
-            this.jwt = jwt
-        } else {
-            this.jwt = "Bearer $jwt"
-        }
-    }
-
-    private class TrustAllHostnameVerifier : HostnameVerifier {
-        override fun verify(hostname: String, session: SSLSession): Boolean {
-            return true
-        }
-    }
-
-    private fun addExtentHeader(request: Request.Builder): Request.Builder {
-        request.addHeader("Accept", "application/json; q=0.5")
-            .addHeader("Connection", "close")
-        if (!TextUtils.isEmpty(tenantId)) {
-            request.addHeader("X-TENANT-ID", tenantId!!)
-        }
-        if (!TextUtils.isEmpty(jwt)) {
-            request.addHeader("Authorization", jwt!!)
-        }
-        return request
-    }
-
-    fun get(url: String, params: WebParams?): TransResp? {
-        val request = Request.Builder()
-            .url(geturl(url, params))
-        return getTransResp(addExtentHeader(request).build())
-    }
-
-    fun get(url: String, params: WebParams, callback: com.supwisdom.okhttp.ICallBackok<Any?>) {
-        val request = Request.Builder()
-            .url(geturl(url, params))
-        client!!.newCall(addExtentHeader(request).build()).enqueue(object : Callback {
-            override fun onFailure(call: Call, e: IOException) {
-                callback.callback(null)
-            }
-
-            override fun onResponse(call: Call, response: Response) {
-                try {
-                    val content = response.body!!.string()
-                    val resp = TransResp(response.code, response.message)
-                    if (response.isSuccessful) {
-                        resp.retjson = content
-                    }
-                    callback.callback(resp)
-                } catch (e: Exception) {
-                    e.printStackTrace()
-                    callback.callback(null)
-                }
-
-            }
-        })
-    }
-
-    fun post(url: String, params: WebParams): TransResp? {
-        val builder = FormBody.Builder()
-        for (name in params.allParameterNames()) {
-            builder.add(name, params.getParameterString(name))
-        }
-        val request = Request.Builder()
-            .url(url)
-            .post(builder.build())
-        return getTransResp(addExtentHeader(request).build())
-    }
-
-    fun longPost(url: String, params: WebParams): TransResp? {
-        val builder = FormBody.Builder()
-        for (name in params.allParameterNames()) {
-            builder.add(name, params.getParameterString(name))
-        }
-        val request = Request.Builder()
-            .url(url)
-            .post(builder.build())
-        return getLongTransResp(addExtentHeader(request).build())
-    }
-
-    fun post(url: String, json: String): TransResp? {
-        val body = RequestBody.create(JSON, json)
-        val request = Request.Builder()
-            .url(url)
-            .post(body)
-        return getTransResp(addExtentHeader(request).build())
-    }
-
-    fun post(url: String, json: String, callback: com.supwisdom.okhttp.ICallBackok<Any?>) {
-        val body = RequestBody.create(JSON, json)
-        val request = Request.Builder()
-            .url(url)
-            .post(body)
-        client!!.newCall(addExtentHeader(request).build()).enqueue(object : Callback {
-            override fun onFailure(call: Call, e: IOException) {
-                callback.callback(null)
-            }
-
-            override fun onResponse(call: Call, response: Response) {
-                try {
-                    val content = response.body!!.string()
-                    val resp = TransResp(response.code, response.message)
-                    if (response.isSuccessful) {
-                        resp.retjson = content
-                    }
-                    callback.callback(resp)
-                } catch (e: Exception) {
-                    callback.callback(null)
-                }
-
-            }
-        })
-    }
-
-    private fun getLongTransResp(request: Request): TransResp? {
-        return try {
-            val response = clientLong.newCall(request).execute()
-            /*响应主体只能被消耗一次*/
-            val content = response.body!!.string()
-            val resp = TransResp(response.code, response.message)
-            if (response.isSuccessful) {
-                resp.retjson = content
-            }
-            resp
-        } catch (e: Exception) {
-            e.printStackTrace()
-            null
-        }
-
-    }
-
-    private fun getTransResp(request: Request): TransResp? {
-        return try {
-            val response = client!!.newCall(request).execute()
-            /*响应主体只能被消耗一次*/
-            val content = response.body!!.string()
-            val resp = TransResp(response.code, response.message)
-            if (response.isSuccessful) {
-                resp.retjson = content
-            }
-            resp
-        } catch (e: Exception) {
-            e.printStackTrace()
-            //通讯超时
-            null
-        }
-    }
-
-    private fun geturl(url: String, params: WebParams?): String {
-        val sb = StringBuilder()
-        sb.append(url)
-        if (params != null) {
-            try {
-                sb.append(params.encodeURL())
-            } catch (e: UnsupportedEncodingException) {
-                e.printStackTrace()
-            }
-        }
-        return sb.toString()
-    }
+package com.supwisdom.okhttp
+
+import android.text.TextUtils
+import okhttp3.*
+import okhttp3.MediaType.Companion.toMediaTypeOrNull
+import java.io.IOException
+import java.io.UnsupportedEncodingException
+import java.security.KeyManagementException
+import java.security.KeyStore
+import java.security.KeyStoreException
+import java.security.NoSuchAlgorithmException
+import java.util.*
+import java.util.concurrent.TimeUnit
+import javax.net.ssl.*
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+@Suppress("DEPRECATION")
+class NetworkHandler private constructor() {
+    companion object {
+        private var instance: NetworkHandler? = null
+        fun getInstance(): NetworkHandler {
+            if (instance == null) {
+                synchronized(NetworkHandler::class.java) {
+                    if (instance == null) {
+                        instance = NetworkHandler()
+                    }
+                }
+            }
+            return instance!!
+        }
+    }
+
+    private var client: OkHttpClient? = null
+    private var clientLong: OkHttpClient
+    private val JSON = "application/json; charset=utf-8".toMediaTypeOrNull()
+    private val FORM_ENCODE = "application/x-www-form-urlencoded;charset=utf-8".toMediaTypeOrNull()
+    private var commTime = 5
+    private var tenantId: String? = null
+    private var jwt: String? = null
+    private var sslSocketFactory: SSLSocketFactory? = null
+    private var trustManager: X509TrustManager? = null
+
+    init {
+        try {
+            val trustManagerFactory =
+                TrustManagerFactory.getInstance(
+                    TrustManagerFactory.getDefaultAlgorithm()
+                )
+            trustManagerFactory.init(null as KeyStore?)
+            val trustManagers =
+                trustManagerFactory.trustManagers
+            check(!(trustManagers.size != 1 || trustManagers[0] !is X509TrustManager)) {
+                ("Unexpected default trust managers:"
+                        + Arrays.toString(trustManagers))
+            }
+            trustManager = trustManagers[0] as X509TrustManager
+            val sslContext = SSLContext.getInstance("TLS")
+            sslContext.init(null, arrayOf<TrustManager?>(trustManager), null)
+            sslSocketFactory = sslContext.socketFactory
+        } catch (e: NoSuchAlgorithmException) {
+            e.printStackTrace()
+        } catch (e: KeyManagementException) {
+            e.printStackTrace()
+        } catch (e: KeyStoreException) {
+            e.printStackTrace()
+        }
+
+        client = OkHttpClient()
+            .newBuilder()
+            .followRedirects(true)
+            .followSslRedirects(true)
+            .retryOnConnectionFailure(false)
+            .readTimeout(commTime.toLong(), TimeUnit.SECONDS)
+            .writeTimeout(1, TimeUnit.SECONDS)
+            .connectTimeout(1, TimeUnit.SECONDS)
+            .hostnameVerifier(TrustAllHostnameVerifier())
+            .sslSocketFactory(sslSocketFactory!!, trustManager!!)
+            .build()
+        clientLong = OkHttpClient()
+            .newBuilder()
+            .followRedirects(true)
+            .followSslRedirects(true)
+            .retryOnConnectionFailure(false)
+            .readTimeout(60, TimeUnit.SECONDS)
+            .writeTimeout(1, TimeUnit.SECONDS)
+            .connectTimeout(1, TimeUnit.SECONDS)
+            .hostnameVerifier(TrustAllHostnameVerifier())
+            .sslSocketFactory(sslSocketFactory!!, trustManager!!)
+            .build()
+
+    }
+
+    fun setCommTime(communicateTime: Int) {
+        if (communicateTime != 0 && commTime != communicateTime) {
+            this.commTime = communicateTime
+            client = OkHttpClient()
+                .newBuilder()
+                .followRedirects(true)
+                .followSslRedirects(true)
+                .retryOnConnectionFailure(false)
+                .readTimeout(commTime.toLong(), TimeUnit.SECONDS)
+                .writeTimeout(1, TimeUnit.SECONDS)
+                .connectTimeout(1, TimeUnit.SECONDS)
+                .hostnameVerifier(TrustAllHostnameVerifier())
+                .sslSocketFactory(sslSocketFactory!!, trustManager!!)
+                .build()
+        }
+    }
+
+    fun setTenantId(tenantId: String) {
+        this.tenantId = tenantId
+    }
+
+    fun setJwt(jwt: String?) {
+        if (TextUtils.isEmpty(jwt)) {
+            this.jwt = jwt
+        } else {
+            this.jwt = "Bearer $jwt"
+        }
+    }
+
+    private class TrustAllHostnameVerifier : HostnameVerifier {
+        override fun verify(hostname: String, session: SSLSession): Boolean {
+            return true
+        }
+    }
+
+    private fun addExtentHeader(request: Request.Builder): Request.Builder {
+        request.addHeader("Accept", "application/json; q=0.5")
+            .addHeader("Connection", "close")
+        if (!TextUtils.isEmpty(tenantId)) {
+            request.addHeader("X-TENANT-ID", tenantId!!)
+        }
+        if (!TextUtils.isEmpty(jwt)) {
+            request.addHeader("Authorization", jwt!!)
+        }
+        return request
+    }
+
+    fun get(url: String, params: WebParams?): TransResp? {
+        val request = Request.Builder()
+            .url(geturl(url, params))
+        return getTransResp(addExtentHeader(request).build())
+    }
+
+    fun get(url: String, params: WebParams?, headerkey: String): TransResp? {
+        val request = Request.Builder()
+            .url(geturl(url, params))
+            .addHeader("Accept", "application/json; q=0.5")
+            .addHeader("Connection", "close")
+            .addHeader("ApiKey", headerkey.toLowerCase())
+            .build()
+        return getTransResp(request)
+    }
+
+    fun get(url: String, params: WebParams, callback: com.supwisdom.okhttp.ICallBackok<Any?>) {
+        val request = Request.Builder()
+            .url(geturl(url, params))
+        client!!.newCall(addExtentHeader(request).build()).enqueue(object : Callback {
+            override fun onFailure(call: Call, e: IOException) {
+                callback.callback(null)
+            }
+
+            override fun onResponse(call: Call, response: Response) {
+                try {
+                    val content = response.body!!.string()
+                    val resp = TransResp(response.code, response.message)
+                    if (response.isSuccessful) {
+                        resp.retjson = content
+                    }
+                    callback.callback(resp)
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                    callback.callback(null)
+                }
+
+            }
+        })
+    }
+
+    fun post(url: String, params: WebParams): TransResp? {
+        val builder = FormBody.Builder()
+        for (name in params.allParameterNames()) {
+            builder.add(name, params.getParameterString(name))
+        }
+        val request = Request.Builder()
+            .url(url)
+            .post(builder.build())
+        return getTransResp(addExtentHeader(request).build())
+    }
+
+    fun longPost(url: String, params: WebParams): TransResp? {
+        val builder = FormBody.Builder()
+        for (name in params.allParameterNames()) {
+            builder.add(name, params.getParameterString(name))
+        }
+        val request = Request.Builder()
+            .url(url)
+            .post(builder.build())
+        return getLongTransResp(addExtentHeader(request).build())
+    }
+
+    fun post(url: String, json: String): TransResp? {
+        val body = RequestBody.create(JSON, json)
+        val request = Request.Builder()
+            .url(url)
+            .post(body)
+        return getTransResp(addExtentHeader(request).build())
+    }
+
+    fun post(url: String, json: String, headerkey: String): TransResp? {
+        val request = Request.Builder()
+            .url(url)
+            .addHeader("Accept", "application/json; q=0.5")
+            .addHeader("Content-type", "application/json")
+            .addHeader("Connection", "close")
+            .addHeader("ApiKey", headerkey.toLowerCase())
+            .post(RequestBody.create(JSON, json))
+            .build()
+        return getTransResp(request)
+    }
+
+    fun post(url: String, json: String, callback: ICallBackok<Any?>) {
+        val body = RequestBody.create(JSON, json)
+        val request = Request.Builder()
+            .url(url)
+            .post(body)
+        client!!.newCall(addExtentHeader(request).build()).enqueue(object : Callback {
+            override fun onFailure(call: Call, e: IOException) {
+                callback.callback(null)
+            }
+
+            override fun onResponse(call: Call, response: Response) {
+                try {
+                    val content = response.body!!.string()
+                    val resp = TransResp(response.code, response.message)
+                    if (response.isSuccessful) {
+                        resp.retjson = content
+                    }
+                    callback.callback(resp)
+                } catch (e: Exception) {
+                    callback.callback(null)
+                }
+
+            }
+        })
+    }
+
+    private fun getLongTransResp(request: Request): TransResp? {
+        return try {
+            val response = clientLong.newCall(request).execute()
+            /*响应主体只能被消耗一次*/
+            val content = response.body!!.string()
+            val resp = TransResp(response.code, response.message)
+            if (response.isSuccessful) {
+                resp.retjson = content
+            }
+            resp
+        } catch (e: Exception) {
+            e.printStackTrace()
+            null
+        }
+
+    }
+
+    private fun getTransResp(request: Request): TransResp? {
+        return try {
+            val response = client!!.newCall(request).execute()
+            /*响应主体只能被消耗一次*/
+            val content = response.body!!.string()
+            val resp = TransResp(response.code, response.message)
+            if (response.isSuccessful) {
+                resp.retjson = content
+            }
+            resp
+        } catch (e: Exception) {
+            e.printStackTrace()
+            //通讯超时
+            null
+        }
+    }
+
+    private fun geturl(url: String, params: WebParams?): String {
+        val sb = StringBuilder()
+        sb.append(url)
+        if (params != null) {
+            try {
+                sb.append(params.encodeURL())
+            } catch (e: UnsupportedEncodingException) {
+                e.printStackTrace()
+            }
+        }
+        return sb.toString()
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
index 190773a..dec3a26 100644
--- a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
+++ b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
@@ -114,6 +114,7 @@
                 "max_offline_days" -> record.maxOfflineDays = it.paraval!!.toInt()
                 "max_day_offline_amt" -> record.maxDayOfflineAmt = it.paraval!!.toInt()
                 "communicate_time" -> record.commTime = it.paraval!!.toInt()
+                "syno_code" -> record.synoCode = it.paraval == "1"
             }
         }
         if (record.heatBeat == 0) {
@@ -134,6 +135,9 @@
         if (record.maxDayOfflineAmt == 0) {
             record.maxDayOfflineAmt = 10000
         }
+        if (record.mngPasswd.isNullOrEmpty()) {
+            record.mngPasswd = PublicDef.PASSWD_ADMIN_DEFAULT
+        }
         if (!pos.replaceSysPara(record)) {
             throw SysParaError("保存参数失败")
         }
diff --git a/app/src/main/java/com/supwisdom/service/SynoCodeService.kt b/app/src/main/java/com/supwisdom/service/SynoCodeService.kt
new file mode 100644
index 0000000..c39bb27
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/service/SynoCodeService.kt
@@ -0,0 +1,294 @@
+package com.supwisdom.service
+
+import android.content.Context
+import android.util.Log
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.bean.*
+import com.supwisdom.entity.ControlParaRecord
+import com.supwisdom.okhttp.NetworkHandler
+import com.supwisdom.okhttp.TransResp
+import com.supwisdom.utils.*
+import com.synodata.codelib.decoder.CodeID
+import com.synodata.codelib.decoder.CodeUtils
+import com.synodata.codelib.decoder.IActivateListener
+import java.net.HttpURLConnection
+
+/**
+ ** create by zzq on 2020/8/20
+ ** @desc 晟元二维码激活管理接口
+ **/
+class SynoCodeService {
+    private val TAG = "SynoCodeService"
+    private val baseUrl = "https://yuexiao-yun.supwisdom.com/posregistry"
+    private val pos = SPApplication.getInstance().getPos()
+    private val syncLock = Object()
+    private var active = false
+    private var activeMsg: String? = null
+    private var licenseName = "syno_${CommonUtil.getHardwareAddress().replace(":", "")}.lic"
+
+    fun synoCodeActive(context: Context): BaseResp {
+        if (activeByLocalLicense(context)) {
+            return BaseResp(PublicDef.SUCCESS, "本地激活成功")
+        }
+        val posid = CommonUtil.getSerialNumber()
+        var resp = getRegisterStatus(posid) ?: return BaseResp(PublicDef.ERROR, "获取设备注册状态超时")
+        if (resp.retcode != HttpURLConnection.HTTP_OK) {
+            return BaseResp(resp.retcode, resp.retmsg)
+        }
+        val registerStatusRetBean =
+            GsonUtil.GsonToBean(resp.retjson!!, EpaySynoRegisterStatusRetBean::class.java)
+        when (registerStatusRetBean.status) {
+            "unregister" -> {
+                resp = registerDevice(posid, PublicDef.SCHOOL_NO)
+                    ?: return BaseResp(PublicDef.ERROR, "注册设备超时")
+                if (resp.retcode != HttpURLConnection.HTTP_OK) {
+                    return BaseResp(resp.retcode, resp.retmsg)
+                }
+                return BaseResp(PublicDef.ERROR, "等待后台授权")
+            }
+            "unauthorized" -> return BaseResp(PublicDef.ERROR, "设备未授权")
+            "authorized" -> {
+                return activeOnline(context)
+            }
+            "activated" -> {
+                resp = getActiveStatus(posid) ?: return BaseResp(PublicDef.ERROR, "下载激活文件超时")
+                if (resp.retcode != HttpURLConnection.HTTP_OK) {
+                    return BaseResp(resp.retcode, resp.retmsg)
+                }
+                val activeRetBean =
+                    GsonUtil.GsonToBean(resp.retjson!!, EpaySynoActiveRetBean::class.java)
+                if (activeRetBean.license.isNullOrEmpty()) {
+                    return BaseResp(PublicDef.ERROR, "激活文件为空")
+                }
+                if (!saveLicenseToLocal(activeRetBean.license)) {
+                    return BaseResp(PublicDef.ERROR, "保存激活文件失败")
+                }
+                if (!activeByLocalLicense(context)) {
+                    return BaseResp(PublicDef.ERROR, "本地激活失败")
+                }
+                return BaseResp(PublicDef.SUCCESS, "激活成功")
+            }
+            else -> {
+                return BaseResp(PublicDef.ERROR, "状态错误:${registerStatusRetBean.status}")
+            }
+        }
+    }
+
+    fun uploadActiveLicense(): BaseResp {
+        val sdpath = FileUtil.getSynoLicensePath()
+        if (sdpath.isNullOrEmpty()) {
+            return BaseResp(PublicDef.ERROR, "获取本地路径失败")
+        }
+
+        val licenseByte = FileUtil.readSynoLicenseFile("${sdpath}${licenseName}")
+            ?: return BaseResp(PublicDef.ERROR, "读取激活文件超时")
+        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.SUCCESS, "上传激活文件成功")
+    }
+
+    private fun saveLicenseToLocal(license: String): Boolean {
+        val sdpath = FileUtil.getSynoLicensePath()
+        if (sdpath.isNullOrEmpty()) {
+            return false
+        }
+        if (FileUtil.writeSynoLicenseFile("${sdpath}${licenseName}", UrlBase64.decode(license))) {
+            return true
+        }
+        return false
+    }
+
+    fun activeByLocalLicense(context: Context): Boolean {
+        saveActiveStatus(false)
+        val sdpath = FileUtil.getSynoLicensePath()
+        if (sdpath.isNullOrEmpty()) {
+            return false
+        }
+        /**
+         *** 设置一个可读和可写的路径来保存下载许可证文件。
+         ** path需要以“/”结尾
+         **/
+        CodeUtils.setLicPathName(sdpath, licenseName)
+        CodeUtils.enableDebug(false)
+        CodeUtils.enableSaveFailImage(false)
+        val mUtils = CodeUtils(context)
+        if (!mUtils.isBarcodeActivated) {
+            return false
+        }
+        configBarcode(context)
+        return true
+    }
+
+    private fun activeOnline(context: Context): BaseResp {
+        saveActiveStatus(false)
+        val sdpath = FileUtil.getSynoLicensePath()
+        if (sdpath.isNullOrEmpty()) {
+            return BaseResp(PublicDef.ERROR, "获取本地路径失败")
+        }
+        /**
+         *** 设置一个可读和可写的路径来保存下载许可证文件。
+         ** path需要以“/”结尾
+         **/
+        CodeUtils.setLicPathName(sdpath, licenseName)
+        CodeUtils.enableDebug(false)
+        CodeUtils.enableSaveFailImage(false)
+        val mUtils = CodeUtils(context)
+        if (!mUtils.isBarcodeActivated) {
+            active = false
+            activeMsg = "等待激活结果"
+            mUtils.tryActivateBarcode(object : IActivateListener {
+                /**
+                 * 此函数将在活动进程期间调用，并返回进程消息
+                 */
+                override fun onActivateProcess(msg: String) {
+                    //sendMessage(LoadPresenter.LOAD_CODE_ACTIVE_PRO, "正在激活扫码算法...")
+                    Log.d(TAG, "正在激活扫码算法:$msg")
+                }
+
+                /**
+                 * 此函数将在活动进程之后调用。
+                 * result_code: CodeUtils.RESULT_MSG_SUCCESS 意味着成功，其他意味着失败
+                 * error: 返回失败原因消息.
+                 **/
+                override fun onActivateResult(
+                    result_code: Int,
+                    error: String
+                ) { // post the result message
+                    if (CodeUtils.RESULT_MSG_SUCCESS == result_code) {
+//                        sendMessage(LoadPresenter.LOAD_CODE_ACTIVE_SUC, "激活扫码算法成功")
+                        configBarcode(context)
+                        active = true
+//                        sendMessage(LoadPresenter.LOAD_SUCCESS, "加载成功")
+                    } else {
+//                        sendMessage(LoadPresenter.LOAD_CODE_ACTIVE_FAIL, "激活扫码算法失败:$result_code,$error")
+                        LogUtil.e(TAG, "激活晟元扫码算法失败:$result_code,$error")
+//                        sendMessage(LoadPresenter.JUMP_TO_UNREGISTER, "请确认设备能连外网,激活扫码算法失败:$result_code,$error")
+                        activeMsg = "请确认设备能连外网,激活扫码算法失败:$result_code,$error"
+                    }
+                    synchronized(syncLock) {
+                        syncLock.notify()
+                    }
+                }
+
+                /**
+                 * 调用活动函数时的当前活动状态。
+                 * 如果该函数处于非活动状态，则在活动进程完成时将返回该函数。
+                 */
+                override fun onActivateState(bActivated: Boolean) {
+                    if (bActivated) {
+                        /**
+                         * 条形码处于激活状态
+                         * 配置条形码
+                         */
+                        active = true
+                    } else {
+                        /**
+                         * 激活失败，界面提示
+                         */
+                    }
+                }
+            })
+            synchronized(syncLock) {
+                syncLock.wait(10 * 1000)
+            }
+            return if (active) {
+                BaseResp(PublicDef.SUCCESS, "激活成功")
+            } else {
+                BaseResp(PublicDef.ERROR, activeMsg)
+            }
+        } else {
+            configBarcode(context)
+            return BaseResp(PublicDef.SUCCESS, "激活成功")
+        }
+    }
+
+    /**
+     * 配置条码功能集成
+     */
+    private fun configBarcode(context: Context) {
+        val mUtils = CodeUtils(context)
+        //清除之前的设置
+        mUtils.enableAllFormats(false)
+        //        mUtils.enableAllFormats(true);
+//设置新的配置
+//        for (int i = 0; i < mBarcodeList.length; i++) {
+//            mUtils.enableCodeFormat(mBarcodeList[i]);
+//        }
+        mUtils.enableCodeFormat(CodeID.QR)
+        saveActiveStatus(true)
+    }
+
+    private fun registerDevice(posid: String?, schoolno: String?): TransResp? {
+        if (posid.isNullOrEmpty()) {
+            return TransResp(PublicDef.ERROR, "posid为空")
+        }
+        if (schoolno.isNullOrEmpty()) {
+            return TransResp(PublicDef.ERROR, "schoolno为空")
+        }
+        val reqBean = EpaySynoRegisterReqBean()
+        reqBean.schoolCode = schoolno
+        reqBean.termDateTime = DateUtil.getNowDateTimeNoFormat()
+        return NetworkHandler.getInstance().post(
+            "${baseUrl}/pos/registry/${posid}",
+            GsonUtil.GsonString(reqBean),
+            getSignKey(posid)
+        )
+    }
+
+    private fun getRegisterStatus(posid: String?): TransResp? {
+        if (posid.isNullOrEmpty()) {
+            return TransResp(PublicDef.ERROR, "posid为空")
+        }
+        return NetworkHandler.getInstance()
+            .get("${baseUrl}/pos/registry/${posid}", null, getSignKey(posid))
+    }
+
+    private fun activeDevice(posid: String?, license: String?): TransResp? {
+        if (posid.isNullOrEmpty()) {
+            return TransResp(PublicDef.ERROR, "posid为空")
+        }
+        if (license.isNullOrEmpty()) {
+            return TransResp(PublicDef.ERROR, "license为空")
+        }
+        val reqBean = EpaySynoActiveReqBean()
+        reqBean.license = license
+        return NetworkHandler.getInstance().post(
+            "${baseUrl}/pos/activate/${posid}",
+            GsonUtil.GsonString(reqBean),
+            getSignKey(posid)
+        )
+    }
+
+    private fun getActiveStatus(posid: String?): TransResp? {
+        if (posid.isNullOrEmpty()) {
+            return TransResp(PublicDef.ERROR, "posid为空")
+        }
+        return NetworkHandler.getInstance()
+            .get("${baseUrl}/pos/activate/${posid}", null, getSignKey(posid))
+    }
+
+    private fun getSignKey(posid: String): String {
+        return CryptUtil.HASH256("${posid}:9Srqd86Ekgb7W7UGKl7dOHKBPLSJhQEG")
+    }
+
+    private fun saveActiveStatus(active: Boolean) {
+        if (active) {
+            pos.replaceControlPara(
+                ControlParaRecord(
+                    PublicDef.CONTROL_SYNOCODE_ACTIVE,
+                    "激活成功时间:" + DateUtil.getNowDateTimeNoFormat()
+                )
+            )
+        } else {
+            pos.replaceControlPara(
+                ControlParaRecord(
+                    PublicDef.CONTROL_SYNOCODE_ACTIVE,
+                    "激活失败时间:" + DateUtil.getNowDateTimeNoFormat()
+                )
+            )
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/CommonUtil.kt b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
index 253a752..119217b 100644
--- a/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
@@ -1,287 +1,314 @@
-@file:Suppress("DEPRECATION")
-
-package com.supwisdom.utils
-
-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
-import android.net.Uri
-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
-import java.io.FileOutputStream
-import java.io.PrintWriter
-import java.io.StringWriter
-import java.util.regex.Pattern
-
-/**
- * @author zzq
- * @date 2018/5/9.
- * @version 1.0.1
- * @desc  公共类
- */
-object CommonUtil {
-    fun doSleep(ms: Int) {
-        try {
-            Thread.sleep(ms.toLong())
-        } catch (e: InterruptedException) {
-            e.printStackTrace()
-        }
-    }
-
-    fun getEditView(et: EditText): String {
-        return et.text.toString().trim { it <= ' ' }.replace(" ", "")
-    }
-
-    fun getCommunicateTime(): Int {
-        var commTime = 2
-        val sysRecord = SPApplication.getInstance().getPos().getSysPara()
-        if (sysRecord != null) {
-            commTime = sysRecord.commTime
-            if (commTime == 0) {
-                commTime = 2
-            }
-        }
-        return commTime
-    }
-
-    fun getSerialNumber(): String? {
-        try {
-            val c = Class.forName("android.os.SystemProperties")
-            val get = c.getMethod("get", String::class.java)
-            return get.invoke(c, "ro.product.firmware") as String
-        } catch (ex: Exception) {
-            ex.printStackTrace()
-        }
-
-        return null
-    }
-
-    fun YuanToFen(yuan: Double): Int {
-        return Math.round(yuan * 100).toInt()
-    }
-
-    fun upgrade(context: Context, filename: String) {
-        val intent = Intent(Intent.ACTION_VIEW)
-        val uri = Uri.fromFile(File(filename))
-        intent.setDataAndType(uri, "application/vnd.android.package-archive")
-        (context as Activity).startActivityForResult(intent, 0)
-    }
-
-    fun isNumeric(str: String): Boolean {
-        val pattern = Pattern.compile("[0-9]*")
-        val isNum = pattern.matcher(str)
-        return isNum.matches()
-    }
-
-    fun showFormatAmount(preHint: String, amount: Int): String {
-        return String.format("%s: %.02f元", preHint, amount / 100.0f)
-    }
-
-    /*优化a811扫码*/
-    fun writeLinnuuxParams() {
-        try {
-            val fos = FileOutputStream("/sys/module/gc0308/parameters/exposure")
-            fos.write("20".toByteArray())
-            fos.close()
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
-    }
-
-    /**
-     * 判断服务是否开启
-     *
-     * @param mContext
-     * @param serviceName
-     * @return
-     */
-    fun isServiceWork(mContext: Context, serviceName: String): Boolean {
-        val myAM = mContext
-            .getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
-        val myList = myAM.getRunningServices(40)
-        if (myList.size <= 0) {
-            return false
-        }
-        for (i in myList.indices) {
-            val mName = myList[i].service.className.toString()
-            if (mName == serviceName) {
-                return true
-            }
-        }
-        return false
-    }
-
-    fun getExceptionStack(e: Exception?): String {
-        if (e == null) {
-            return "null"
-        }
-        val sw = StringWriter()
-        val pw = PrintWriter(sw)
-        e.printStackTrace(pw)
-        return sw.toString()
-    }
-
-    /**
-     * get App versionName
-     *
-     * @param context
-     * @return
-     */
-    fun getVersionName(context: Context): String {
-        return try {
-            val packageManager = context.packageManager
-            val packageInfo = packageManager.getPackageInfo(context.packageName, 0)
-            packageInfo.versionName
-        } catch (e: PackageManager.NameNotFoundException) {
-            e.printStackTrace()
-            "error:" + e.message
-        }
-
-    }
-
-    /**
-     * 跳转网络设置页；
-     */
-    fun startNetSetting(context: Context) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-            context.startActivity(Intent(Settings.ACTION_SETTINGS))
-        } else {
-            context.startActivity(Intent(Settings.ACTION_WIRELESS_SETTINGS))
-        }
-    }
-
-    /**
-     * 唤醒屏幕
-     */
-    fun acquireWakeLock(context: Context) {
-        /*FULL_WAKE_LOCK：保持CPU 运转，保持屏幕高亮显示，键盘灯也保持亮度
-          ACQUIRE_CAUSES_WAKEUP：强制使屏幕亮起，这种锁主要针对一些必须通知用户的操作.
-          ON_AFTER_RELEASE：当锁被释放时，保持屏幕亮起一段时间*/
-        try {
-            val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager
-            @SuppressLint("InvalidWakeLockTag") val wakeLock = pm.newWakeLock(
-                PowerManager.ON_AFTER_RELEASE
-                        or PowerManager.ACQUIRE_CAUSES_WAKEUP
-                        or PowerManager.FULL_WAKE_LOCK, "Tag"
-            )
-            wakeLock.acquire()
-            wakeLock.release()
-        } catch (ex: Exception) {
-            ex.printStackTrace()
-        }
-
-    }
-
-    fun getPasswordStar(len: Int): String {
-        return when (len) {
-            0 -> " "
-            1 -> "*"
-            2 -> "**"
-            3 -> "***"
-            4 -> "****"
-            5 -> "*****"
-            6 -> "******"
-            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
-        )
-    }
+@file:Suppress("DEPRECATION")
+
+package com.supwisdom.utils
+
+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
+import android.net.Uri
+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 okhttp3.internal.and
+import java.io.File
+import java.io.FileOutputStream
+import java.io.PrintWriter
+import java.io.StringWriter
+import java.net.NetworkInterface
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ * @author zzq
+ * @date 2018/5/9.
+ * @version 1.0.1
+ * @desc  公共类
+ */
+object CommonUtil {
+    fun doSleep(ms: Int) {
+        try {
+            Thread.sleep(ms.toLong())
+        } catch (e: InterruptedException) {
+            e.printStackTrace()
+        }
+    }
+
+    fun getEditView(et: EditText): String {
+        return et.text.toString().trim { it <= ' ' }.replace(" ", "")
+    }
+
+    fun getCommunicateTime(): Int {
+        var commTime = 2
+        val sysRecord = SPApplication.getInstance().getPos().getSysPara()
+        if (sysRecord != null) {
+            commTime = sysRecord.commTime
+            if (commTime == 0) {
+                commTime = 2
+            }
+        }
+        return commTime
+    }
+
+    fun getSerialNumber(): String {
+        try {
+            val c = Class.forName("android.os.SystemProperties")
+            val get = c.getMethod("get", String::class.java)
+            return (get.invoke(c, "ro.serialno") as String)
+        } catch (ex: java.lang.Exception) {
+            ex.printStackTrace()
+        }
+        return ""
+    }
+
+    fun YuanToFen(yuan: Double): Int {
+        return Math.round(yuan * 100).toInt()
+    }
+
+    fun upgrade(context: Context, filename: String) {
+        val intent = Intent(Intent.ACTION_VIEW)
+        val uri = Uri.fromFile(File(filename))
+        intent.setDataAndType(uri, "application/vnd.android.package-archive")
+        (context as Activity).startActivityForResult(intent, 0)
+    }
+
+    fun isNumeric(str: String): Boolean {
+        val pattern = Pattern.compile("[0-9]*")
+        val isNum = pattern.matcher(str)
+        return isNum.matches()
+    }
+
+    fun showFormatAmount(preHint: String, amount: Int): String {
+        return String.format("%s: %.02f元", preHint, amount / 100.0f)
+    }
+
+    /*优化a811扫码*/
+    fun writeLinnuuxParams() {
+        try {
+            val fos = FileOutputStream("/sys/module/gc0308/parameters/exposure")
+            fos.write("20".toByteArray())
+            fos.close()
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+
+    /**
+     * 判断服务是否开启
+     *
+     * @param mContext
+     * @param serviceName
+     * @return
+     */
+    fun isServiceWork(mContext: Context, serviceName: String): Boolean {
+        val myAM = mContext
+            .getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
+        val myList = myAM.getRunningServices(40)
+        if (myList.size <= 0) {
+            return false
+        }
+        for (i in myList.indices) {
+            val mName = myList[i].service.className.toString()
+            if (mName == serviceName) {
+                return true
+            }
+        }
+        return false
+    }
+
+    fun getExceptionStack(e: Exception?): String {
+        if (e == null) {
+            return "null"
+        }
+        val sw = StringWriter()
+        val pw = PrintWriter(sw)
+        e.printStackTrace(pw)
+        return sw.toString()
+    }
+
+    /**
+     * get App versionName
+     *
+     * @param context
+     * @return
+     */
+    fun getVersionName(context: Context): String {
+        return try {
+            val packageManager = context.packageManager
+            val packageInfo = packageManager.getPackageInfo(context.packageName, 0)
+            packageInfo.versionName
+        } catch (e: PackageManager.NameNotFoundException) {
+            e.printStackTrace()
+            "error:" + e.message
+        }
+
+    }
+
+    /**
+     * 跳转网络设置页；
+     */
+    fun startNetSetting(context: Context) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            context.startActivity(Intent(Settings.ACTION_SETTINGS))
+        } else {
+            context.startActivity(Intent(Settings.ACTION_WIRELESS_SETTINGS))
+        }
+    }
+
+    /**
+     * 唤醒屏幕
+     */
+    fun acquireWakeLock(context: Context) {
+        /*FULL_WAKE_LOCK：保持CPU 运转，保持屏幕高亮显示，键盘灯也保持亮度
+          ACQUIRE_CAUSES_WAKEUP：强制使屏幕亮起，这种锁主要针对一些必须通知用户的操作.
+          ON_AFTER_RELEASE：当锁被释放时，保持屏幕亮起一段时间*/
+        try {
+            val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager
+            @SuppressLint("InvalidWakeLockTag") val wakeLock = pm.newWakeLock(
+                PowerManager.ON_AFTER_RELEASE
+                        or PowerManager.ACQUIRE_CAUSES_WAKEUP
+                        or PowerManager.FULL_WAKE_LOCK, "Tag"
+            )
+            wakeLock.acquire()
+            wakeLock.release()
+        } catch (ex: Exception) {
+            ex.printStackTrace()
+        }
+
+    }
+
+    fun getPasswordStar(len: Int): String {
+        return when (len) {
+            0 -> " "
+            1 -> "*"
+            2 -> "**"
+            3 -> "***"
+            4 -> "****"
+            5 -> "*****"
+            6 -> "******"
+            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
+        )
+    }
+
+    fun getHardwareAddress(): String {
+        try {
+            val all: List<NetworkInterface> =
+                Collections.list(NetworkInterface.getNetworkInterfaces())
+            for (nif in all) {
+                if (!nif.name.equals("eth0", ignoreCase = true)) {
+                    continue
+                }
+                val macBytes = nif.hardwareAddress ?: return ""
+                val sb = StringBuilder()
+                for (b in macBytes) {
+                    var hex = Integer.toHexString(b and 0xFF)
+                    if (hex.length == 1) hex = "0$hex"
+                    sb.append("$hex:")
+                }
+                if (sb.isNotEmpty()) {
+                    sb.deleteCharAt(sb.length - 1)
+                }
+                return sb.toString()
+            }
+        } catch (ex: java.lang.Exception) {
+        }
+        return ""
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/CryptUtil.kt b/app/src/main/java/com/supwisdom/utils/CryptUtil.kt
index b3d7f97..f1022e7 100644
--- a/app/src/main/java/com/supwisdom/utils/CryptUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/CryptUtil.kt
@@ -1,142 +1,142 @@
-package com.supwisdom.utils
-
-import java.io.InputStream
-import java.io.UnsupportedEncodingException
-import java.security.InvalidKeyException
-import java.security.MessageDigest
-import java.security.NoSuchAlgorithmException
-import javax.crypto.Mac
-import javax.crypto.spec.SecretKeySpec
-
-/**
- ** create by zzq on 2019/7/24
- ** @desc
- **/
-object CryptUtil {
-    fun HASH256(text: String): String? {
-        return algorithm2(text, "SHA-256", true)
-    }
-
-    fun HASH256(fis: InputStream): String? {
-        return algorithm(fis, "SHA-256")
-    }
-
-    fun HASH256(fis: InputStream, extData: String): String? {
-        return algorithm(fis, "SHA-256", extData)
-    }
-
-    fun HASH512(text: String): String? {
-        return algorithm2(text, "SHA-512", true)
-    }
-
-    fun MD5(text: String): String? {
-        return algorithm2(text, "MD5", false)
-    }
-
-    fun HMACSHA1(data: String, key: String): String? {
-        try {
-            val algorithm = "HmacSHA1"
-            val mac = Mac.getInstance(algorithm)
-            val spec = SecretKeySpec(key.toByteArray(), algorithm)
-            mac.init(spec)
-            val byteHMAC = mac.doFinal(data.toByteArray())
-            return byteHMAC.encodeHex()
-        } catch (e: InvalidKeyException) {
-            e.printStackTrace()
-        } catch (ignore: NoSuchAlgorithmException) {
-            ignore.printStackTrace()
-        }
-        return null
-    }
-
-    fun HMACSHA256(data: String, key: String): String? {
-        try {
-            val algorithm = "HmacSHA256"
-            val mac = Mac.getInstance(algorithm)
-            val spec = SecretKeySpec(key.toByteArray(), algorithm)
-            mac.init(spec)
-            val byteHMAC = mac.doFinal(data.toByteArray())
-            return byteHMAC.encodeHex()
-        } catch (e: InvalidKeyException) {
-            e.printStackTrace()
-        } catch (ignore: NoSuchAlgorithmException) {
-            ignore.printStackTrace()
-        }
-        return null
-    }
-
-    private fun algorithm2(text: String?, algorithm: String, isUpperCase: Boolean): String? {
-        if (text != null && text.isNotEmpty()) {
-            try {
-                //创建具有指定算法名称的信息摘要
-                val md = MessageDigest.getInstance(algorithm)
-                //使用指定的字节数组对摘要进行最后更新，然后完成摘要计算
-                val results = md.digest(text.toByteArray(charset("UTF-8")))
-                //将得到的字节数组变成字符串返回
-                val resultString = results.encodeHex()
-                return if (isUpperCase) {
-                    resultString.toUpperCase()
-                } else {
-                    resultString.toLowerCase()
-                }
-            } catch (ex: NoSuchAlgorithmException) {
-                ex.printStackTrace()
-            } catch (ex: UnsupportedEncodingException) {
-                ex.printStackTrace()
-            }
-        }
-        return null
-    }
-
-    private fun algorithm(fis: InputStream, algorithm: String): String? {
-        try {
-            //拿到一个MD5转换器,如果想使用SHA-1或SHA-256，则传入SHA-1,SHA-256
-            val md = MessageDigest.getInstance(algorithm)
-
-            //分多次将一个文件读入，对于大型文件而言，比较推荐这种方式，占用内存比较少。
-            val buffer = ByteArray(1024)
-            var length: Int
-            while (true) {
-                length = fis.read(buffer, 0, 1024)
-                if (length < 0) {
-                    break
-                }
-                md.update(buffer, 0, length)
-            }
-            fis.close()
-            //转换并返回包含16个元素字节数组,返回数值范围为-128到127
-            return md.digest().encodeHex()
-        } catch (e: Exception) {
-            e.printStackTrace()
-            return null
-        }
-
-    }
-
-    private fun algorithm(fis: InputStream, algorithm: String, extData: String): String? {
-        try {
-            //拿到一个MD5转换器,如果想使用SHA-1或SHA-256，则传入SHA-1,SHA-256
-            val md = MessageDigest.getInstance(algorithm)
-
-            //分多次将一个文件读入，对于大型文件而言，比较推荐这种方式，占用内存比较少。
-            val buffer = ByteArray(1024)
-            var length: Int
-            while (true) {
-                length = fis.read(buffer, 0, 1024)
-                if (length < 0) {
-                    break
-                }
-                md.update(buffer, 0, length)
-            }
-            fis.close()
-            md.update(extData.toByteArray(charset("UTF-8")))
-
-            //转换并返回包含16个元素字节数组,返回数值范围为-128到127
-            return md.digest().encodeHex()
-        } catch (e: Exception) {
-            e.printStackTrace()
-            return null
-        }
-
-    }
+package com.supwisdom.utils
+
+import java.io.InputStream
+import java.io.UnsupportedEncodingException
+import java.security.InvalidKeyException
+import java.security.MessageDigest
+import java.security.NoSuchAlgorithmException
+import javax.crypto.Mac
+import javax.crypto.spec.SecretKeySpec
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+object CryptUtil {
+    fun HASH256(text: String): String {
+        return algorithm2(text, "SHA-256", true)
+    }
+
+    fun HASH256(fis: InputStream): String {
+        return algorithm(fis, "SHA-256")
+    }
+
+    fun HASH256(fis: InputStream, extData: String): String {
+        return algorithm(fis, "SHA-256", extData)
+    }
+
+    fun HASH512(text: String): String {
+        return algorithm2(text, "SHA-512", true)
+    }
+
+    fun MD5(text: String): String {
+        return algorithm2(text, "MD5", false)
+    }
+
+    fun HMACSHA1(data: String, key: String): String {
+        try {
+            val algorithm = "HmacSHA1"
+            val mac = Mac.getInstance(algorithm)
+            val spec = SecretKeySpec(key.toByteArray(), algorithm)
+            mac.init(spec)
+            val byteHMAC = mac.doFinal(data.toByteArray())
+            return byteHMAC.encodeHex()
+        } catch (e: InvalidKeyException) {
+            e.printStackTrace()
+        } catch (ignore: NoSuchAlgorithmException) {
+            ignore.printStackTrace()
+        }
+        return ""
+    }
+
+    fun HMACSHA256(data: String, key: String): String {
+        try {
+            val algorithm = "HmacSHA256"
+            val mac = Mac.getInstance(algorithm)
+            val spec = SecretKeySpec(key.toByteArray(), algorithm)
+            mac.init(spec)
+            val byteHMAC = mac.doFinal(data.toByteArray())
+            return byteHMAC.encodeHex()
+        } catch (e: InvalidKeyException) {
+            e.printStackTrace()
+        } catch (ignore: NoSuchAlgorithmException) {
+            ignore.printStackTrace()
+        }
+        return ""
+    }
+
+    private fun algorithm2(text: String?, algorithm: String, isUpperCase: Boolean): String {
+        if (text != null && text.isNotEmpty()) {
+            try {
+                //创建具有指定算法名称的信息摘要
+                val md = MessageDigest.getInstance(algorithm)
+                //使用指定的字节数组对摘要进行最后更新，然后完成摘要计算
+                val results = md.digest(text.toByteArray(charset("UTF-8")))
+                //将得到的字节数组变成字符串返回
+                val resultString = results.encodeHex()
+                return if (isUpperCase) {
+                    resultString.toUpperCase()
+                } else {
+                    resultString.toLowerCase()
+                }
+            } catch (ex: NoSuchAlgorithmException) {
+                ex.printStackTrace()
+            } catch (ex: UnsupportedEncodingException) {
+                ex.printStackTrace()
+            }
+        }
+        return ""
+    }
+
+    private fun algorithm(fis: InputStream, algorithm: String): String {
+        try {
+            //拿到一个MD5转换器,如果想使用SHA-1或SHA-256，则传入SHA-1,SHA-256
+            val md = MessageDigest.getInstance(algorithm)
+
+            //分多次将一个文件读入，对于大型文件而言，比较推荐这种方式，占用内存比较少。
+            val buffer = ByteArray(1024)
+            var length: Int
+            while (true) {
+                length = fis.read(buffer, 0, 1024)
+                if (length < 0) {
+                    break
+                }
+                md.update(buffer, 0, length)
+            }
+            fis.close()
+            //转换并返回包含16个元素字节数组,返回数值范围为-128到127
+            return md.digest().encodeHex()
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return ""
+        }
+
+    }
+
+    private fun algorithm(fis: InputStream, algorithm: String, extData: String): String {
+        try {
+            //拿到一个MD5转换器,如果想使用SHA-1或SHA-256，则传入SHA-1,SHA-256
+            val md = MessageDigest.getInstance(algorithm)
+
+            //分多次将一个文件读入，对于大型文件而言，比较推荐这种方式，占用内存比较少。
+            val buffer = ByteArray(1024)
+            var length: Int
+            while (true) {
+                length = fis.read(buffer, 0, 1024)
+                if (length < 0) {
+                    break
+                }
+                md.update(buffer, 0, length)
+            }
+            fis.close()
+            md.update(extData.toByteArray(charset("UTF-8")))
+
+            //转换并返回包含16个元素字节数组,返回数值范围为-128到127
+            return md.digest().encodeHex()
+        } catch (e: Exception) {
+            e.printStackTrace()
+            return ""
+        }
+
+    }
 }
\ 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 a65a9ce..0430400 100644
--- a/app/src/main/java/com/supwisdom/utils/DateUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
@@ -1,335 +1,352 @@
-package com.supwisdom.utils
-
-import java.text.ParseException
-import java.text.SimpleDateFormat
-import java.util.*
-
-/**
- ** create by zzq on 2019/7/23
- ** @desc
- **/
-object DateUtil {
-    private val FORMAT_yyyyMMdd = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMdd")
-    private val FORMAT_yyMMddHHmmss = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyMMddHHmmss")
-    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_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 = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMddHHmmss")
-    private val FORMAT_yyyyMMddHHmm = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMddHHmm")
-    private val FORMAT_MMddHHmmyy = org.apache.commons.lang3.time.FastDateFormat.getInstance("MMddHHmmyy")
-    private val FORMAT_yyyy_MM_dd_HH_mm_ss =
-        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
-    private val FORMAT_yyyy_MM_dd = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd")
-    private val FORMAT_HH_mm_ss = org.apache.commons.lang3.time.FastDateFormat.getInstance("HH:mm:ss")
-
-    /**
-     * @return yyyy-MM-dd HH:mm:ss
-     */
-    fun getNow(): String {
-        return FORMAT_yyyy_MM_dd_HH_mm_ss.format(Date())
-    }
-
-    fun getNowDateSpecFormat(): String {
-        return FORMAT_yyyy_MM_dd.format(Date())
-    }
-
-    fun utcToLocal(utctime: String): String {
-        val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
-        sdf.timeZone = TimeZone.getTimeZone("UTC")
-        return try {
-            val utcDate = sdf.parse(utctime)
-            sdf.timeZone = TimeZone.getDefault()
-            val localTime = sdf.format(utcDate.time)
-            val localDate = sdf.parse(localTime)
-            FORMAT_yyyyMMddHHmmss.format(localDate.time)
-        } catch (ex: ParseException) {
-            ex.printStackTrace()
-            ""
-        }
-    }
-
-    /**
-     * @param date yyyyMMdd
-     * @return yyyy-MM-dd
-     */
-    fun getNowDateFromNoFormat(date: String): String {
-        try {
-            return date.substring(0, 4) + "-" +
-                    date.substring(4, 6) + "-" +
-                    date.substring(6, 8)
-        } catch (ex: Exception) {
-        }
-        return ""
-    }
-
-    /**
-     * @return HH:mm:ss
-     */
-    fun getNowTimeWithArg(date: Date): String? {
-        return try {
-            FORMAT_HH_mm_ss.format(date)
-        } catch (e: Exception) {
-            null
-        }
-    }
-
-    /**
-     * @param time HHmm
-     * @return HH:mm
-     */
-    fun formatTime(time: String): String? {
-        return try {
-            val sb = StringBuilder()
-            sb.append(time.substring(0, 2)).append(":")
-                .append(time.substring(2, 4))
-            sb.toString()
-        } catch (e: Exception) {
-            null
-        }
-    }
-
-    /**
-     * @return MMdd
-     */
-    fun getDateMMdd(): String? {
-        return try {
-            FORMAT_MMdd.format(Date())
-        } catch (e: Exception) {
-            e.printStackTrace()
-            null
-        }
-    }
-
-    /**
-     * @return MM-dd
-     */
-    fun getDate_MMdd(): String? {
-        try {
-            return FORMAT_MM_dd.format(Date())
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
-        return null
-    }
-
-    /**
-     * @return yyyy-MM-dd HH:mm:ss
-     */
-    fun getNowDateTime(): String {
-        return FORMAT_yyyy_MM_dd_HH_mm_ss.format(Date())
-    }
-
-    /**
-     * @return yyyy-MM-dd
-     */
-    fun getNowDate(): String {
-        return FORMAT_yyyy_MM_dd.format(Date())
-    }
-
-    /**
-     * @param dateStr yyyy-MM-dd
-     * @return
-     */
-    fun getNowDateTime(dateStr: String): Date? {
-        try {
-            return FORMAT_yyyy_MM_dd.parse(dateStr)
-        } catch (e: ParseException) {
-            e.printStackTrace()
-        }
-        return null
-    }
-
-    /**
-     * @return HH:mm:ss
-     */
-    fun getNowTime(): String {
-        return FORMAT_HH_mm_ss.format(Date())
-    }
-
-    /**
-     * @return format
-     */
-    fun getDayofWeek(offsetWeek: Int, dayOfWeek: Int, format: String): String {
-        val cal = Calendar.getInstance()
-        // n为推迟的周数，1本周，-1向前推迟一周，2下周，依次类推
-        val retday: String
-        cal.add(Calendar.DATE, offsetWeek * 7)
-        cal.set(Calendar.DAY_OF_WEEK, dayOfWeek)
-        retday = org.apache.commons.lang3.time.FastDateFormat.getInstance(format).format(cal.time)
-        return retday
-    }
-
-    /**
-     * 计算超时时间，精确到毫秒
-     *
-     * @param milliSeconds
-     * @return L
-     */
-    fun getExpireTime(milliSeconds: Long): Long {
-        return Date().time + milliSeconds
-    }
-
-    /**
-     * @return yyyyMMddHHmmss
-     */
-    fun getNowDateTimeNoFormat(): String {
-        return FORMAT_yyyyMMddHHmmss.format(Date())
-    }
-
-    /**
-     * @return yyyyMMdd
-     */
-    fun getNowDateNoFormat(): String {
-        return FORMAT_yyyyMMdd.format(Date())
-    }
-
-    /**
-     * @param date
-     * @return yyyyMMdd
-     */
-    fun getNowDateNoFormat(date: Date): String? {
-        try {
-            return FORMAT_yyyyMMdd.format(date)
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
-        return null
-    }
-
-    /**
-     * @return HHmmss
-     */
-    fun getNowTimeNoFormat(): String {
-        return FORMAT_HHmmss.format(Date())
-    }
-
-    /**
-     * @param datetime yyyyMMddHHmmss
-     * @return ms
-     * @desc 将日期格式的字符串转换为长整型
-     */
-    fun dateFormatConvertToLong(datetime: String): Long {
-        return try {
-            FORMAT_yyyyMMddHHmmss.parse(datetime).time
-        } catch (ex: ParseException) {
-            0L
-        }
-    }
-
-    /**
-     * @param time HHmmss
-     * @return ms
-     * @desc 将时间格式的字符串转换为长整型
-     */
-    fun timeFormatConvertToLong(time: String): Long {
-        return try {
-            FORMAT_HHmmss.parse(time).time
-        } catch (ex: ParseException) {
-            0L
-        }
-    }
-
-    /**
-     * @param time ms
-     * @return yyyyMMddHHmmss
-     * @desc 将长整型数字转换为日期格式的字符串
-     */
-    fun dateLongConvertToFormat(time: Long): String {
-        return if (time > 0L) {
-            FORMAT_yyyyMMddHHmmss.format(Date(time))
-        } else ""
-    }
-
-    /**
-     * @param time ms
-     * @return MMddHHmmyy
-     * @desc 将长整型数字转换为日期格式的字符串
-     */
-    fun dateLongConvertToFormat2(time: Long): String {
-        return if (time > 0L) {
-            FORMAT_MMddHHmmyy.format(Date(time))
-        } else ""
-    }
-
-    /**
-     * @param datetime yyyy-MM-dd HH:mm:ss
-     * @return
-     * @desc 将日期格式的字符串转换为长整型
-     */
-    fun dateFormatConvertToDate(datetime: String): Date? {
-        return try {
-            FORMAT_yyyy_MM_dd_HH_mm_ss.parse(datetime)
-        } catch (ex: ParseException) {
-            null
-        }
-    }
-
-    /**
-     * @param daynum 天数
-     * @return 返回当前日期的第 daynum 天前的日期  yyyyMMdd
-     */
-    fun getDayDateNoFormatBefore(daynum: Int): String {
-        val calendar = Calendar.getInstance()
-        calendar.add(Calendar.DATE, -daynum)
-        return FORMAT_yyyyMMdd.format(calendar.time)
-    }
-
-    /**
-     * 获得指定日期的前一天
-     *
-     * @param specifiedDay yyyyMMdd
-     * @return yyyyMMdd
-     */
-    fun getSpecifiedDayBefore(specifiedDay: String): String {
-        return try {
-            val c = Calendar.getInstance()
-            val date = FORMAT_yyyyMMdd.parse(specifiedDay)
-            c.time = date
-            val day = c.get(Calendar.DATE)
-            c.set(Calendar.DATE, day - 1)
-            FORMAT_yyyyMMdd.format(c.time)
-        } catch (e: ParseException) {
-            ""
-        }
-    }
-
-    /**
-     * 获得指定日期的前一天
-     *
-     * @param dayBefore 往前推迟的天数
-     * @return Date
-     */
-    fun getSomeDayBefore(dayBefore: Int): Date {
-        val c = Calendar.getInstance()
-        c.add(Calendar.DAY_OF_MONTH, -dayBefore)
-        return c.time
-    }
-
-    /**
-     * 获得指定日期的后一天
-     *
-     * @param specifiedDay yyyyMMdd
-     * @return yyyyMMdd
-     */
-    fun getSpecifiedDayAfter(specifiedDay: String): String {
-        return try {
-            val c = Calendar.getInstance()
-            val date = FORMAT_yyyyMMdd.parse(specifiedDay)
-            c.time = date
-            val day = c.get(Calendar.DATE)
-            c.set(Calendar.DATE, day + 1)
-            FORMAT_yyyyMMdd.format(c.time)
-        } catch (e: ParseException) {
-            ""
-        }
-    }
-
-    /**
-     * @return yyyyMMddHHmmss
-     */
-    fun getNowDateTimeFormat(): String {
-        return FORMAT_yyyyMMddHHmmss.format(Date())
-    }
-
+package com.supwisdom.utils
+
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+object DateUtil {
+    private val FORMAT_yyyyMMdd =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMdd")
+    private val FORMAT_yyMMddHHmmss =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyMMddHHmmss")
+    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_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 =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMddHHmmss")
+    private val FORMAT_yyyyMMddHHmm =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyyMMddHHmm")
+    private val FORMAT_MMddHHmmyy =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("MMddHHmmyy")
+    private val FORMAT_yyyy_MM_dd_HH_mm_ss =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
+    private val FORMAT_yyyy_MM_dd_HH_mm =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm")
+    private val FORMAT_yyyy_MM_dd =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd")
+    private val FORMAT_HH_mm_ss =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("HH:mm:ss")
+
+    /**
+     * @return yyyy-MM-dd HH:mm:ss
+     */
+    fun getNow(): String {
+        return FORMAT_yyyy_MM_dd_HH_mm_ss.format(Date())
+    }
+
+    fun getNowDateSpecFormat(): String {
+        return FORMAT_yyyy_MM_dd.format(Date())
+    }
+
+    fun utcToLocal(utctime: String): String {
+        val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
+        sdf.timeZone = TimeZone.getTimeZone("UTC")
+        return try {
+            val utcDate = sdf.parse(utctime)
+            sdf.timeZone = TimeZone.getDefault()
+            val localTime = sdf.format(utcDate.time)
+            val localDate = sdf.parse(localTime)
+            FORMAT_yyyyMMddHHmmss.format(localDate.time)
+        } catch (ex: ParseException) {
+            ex.printStackTrace()
+            ""
+        }
+    }
+
+    /**
+     * @param date yyyyMMdd
+     * @return yyyy-MM-dd
+     */
+    fun getNowDateFromNoFormat(date: String): String {
+        try {
+            return date.substring(0, 4) + "-" +
+                    date.substring(4, 6) + "-" +
+                    date.substring(6, 8)
+        } catch (ex: Exception) {
+        }
+        return ""
+    }
+
+    /**
+     * @return HH:mm:ss
+     */
+    fun getNowTimeWithArg(date: Date): String? {
+        return try {
+            FORMAT_HH_mm_ss.format(date)
+        } catch (e: Exception) {
+            null
+        }
+    }
+
+    /**
+     * @param time HHmm
+     * @return HH:mm
+     */
+    fun formatTime(time: String): String? {
+        return try {
+            val sb = StringBuilder()
+            sb.append(time.substring(0, 2)).append(":")
+                .append(time.substring(2, 4))
+            sb.toString()
+        } catch (e: Exception) {
+            null
+        }
+    }
+
+    /**
+     * @return MMdd
+     */
+    fun getDateMMdd(): String? {
+        return try {
+            FORMAT_MMdd.format(Date())
+        } catch (e: Exception) {
+            e.printStackTrace()
+            null
+        }
+    }
+
+    /**
+     * @return MM-dd
+     */
+    fun getDate_MMdd(): String? {
+        try {
+            return FORMAT_MM_dd.format(Date())
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return null
+    }
+
+    /**
+     * @return yyyy-MM-dd HH:mm:ss
+     */
+    fun getNowDateTime(): String {
+        return FORMAT_yyyy_MM_dd_HH_mm_ss.format(Date())
+    }
+
+    /**
+     * @return yyyy-MM-dd HH:mm:ss
+     */
+    fun getNowDateTime1(): String {
+        return FORMAT_yyyy_MM_dd_HH_mm.format(Date())
+    }
+
+    /**
+     * @return yyyy-MM-dd
+     */
+    fun getNowDate(): String {
+        return FORMAT_yyyy_MM_dd.format(Date())
+    }
+
+    /**
+     * @param dateStr yyyy-MM-dd
+     * @return
+     */
+    fun getNowDateTime(dateStr: String): Date? {
+        try {
+            return FORMAT_yyyy_MM_dd.parse(dateStr)
+        } catch (e: ParseException) {
+            e.printStackTrace()
+        }
+        return null
+    }
+
+    /**
+     * @return HH:mm:ss
+     */
+    fun getNowTime(): String {
+        return FORMAT_HH_mm_ss.format(Date())
+    }
+
+    /**
+     * @return format
+     */
+    fun getDayofWeek(offsetWeek: Int, dayOfWeek: Int, format: String): String {
+        val cal = Calendar.getInstance()
+        // n为推迟的周数，1本周，-1向前推迟一周，2下周，依次类推
+        val retday: String
+        cal.add(Calendar.DATE, offsetWeek * 7)
+        cal.set(Calendar.DAY_OF_WEEK, dayOfWeek)
+        retday = org.apache.commons.lang3.time.FastDateFormat.getInstance(format).format(cal.time)
+        return retday
+    }
+
+    /**
+     * 计算超时时间，精确到毫秒
+     *
+     * @param milliSeconds
+     * @return L
+     */
+    fun getExpireTime(milliSeconds: Long): Long {
+        return Date().time + milliSeconds
+    }
+
+    /**
+     * @return yyyyMMddHHmmss
+     */
+    fun getNowDateTimeNoFormat(): String {
+        return FORMAT_yyyyMMddHHmmss.format(Date())
+    }
+
+    /**
+     * @return yyyyMMdd
+     */
+    fun getNowDateNoFormat(): String {
+        return FORMAT_yyyyMMdd.format(Date())
+    }
+
+    /**
+     * @param date
+     * @return yyyyMMdd
+     */
+    fun getNowDateNoFormat(date: Date): String? {
+        try {
+            return FORMAT_yyyyMMdd.format(date)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+        return null
+    }
+
+    /**
+     * @return HHmmss
+     */
+    fun getNowTimeNoFormat(): String {
+        return FORMAT_HHmmss.format(Date())
+    }
+
+    /**
+     * @param datetime yyyyMMddHHmmss
+     * @return ms
+     * @desc 将日期格式的字符串转换为长整型
+     */
+    fun dateFormatConvertToLong(datetime: String): Long {
+        return try {
+            FORMAT_yyyyMMddHHmmss.parse(datetime).time
+        } catch (ex: ParseException) {
+            0L
+        }
+    }
+
+    /**
+     * @param time HHmmss
+     * @return ms
+     * @desc 将时间格式的字符串转换为长整型
+     */
+    fun timeFormatConvertToLong(time: String): Long {
+        return try {
+            FORMAT_HHmmss.parse(time).time
+        } catch (ex: ParseException) {
+            0L
+        }
+    }
+
+    /**
+     * @param time ms
+     * @return yyyyMMddHHmmss
+     * @desc 将长整型数字转换为日期格式的字符串
+     */
+    fun dateLongConvertToFormat(time: Long): String {
+        return if (time > 0L) {
+            FORMAT_yyyyMMddHHmmss.format(Date(time))
+        } else ""
+    }
+
+    /**
+     * @param time ms
+     * @return MMddHHmmyy
+     * @desc 将长整型数字转换为日期格式的字符串
+     */
+    fun dateLongConvertToFormat2(time: Long): String {
+        return if (time > 0L) {
+            FORMAT_MMddHHmmyy.format(Date(time))
+        } else ""
+    }
+
+    /**
+     * @param datetime yyyy-MM-dd HH:mm:ss
+     * @return
+     * @desc 将日期格式的字符串转换为长整型
+     */
+    fun dateFormatConvertToDate(datetime: String): Date? {
+        return try {
+            FORMAT_yyyy_MM_dd_HH_mm_ss.parse(datetime)
+        } catch (ex: ParseException) {
+            null
+        }
+    }
+
+    /**
+     * @param daynum 天数
+     * @return 返回当前日期的第 daynum 天前的日期  yyyyMMdd
+     */
+    fun getDayDateNoFormatBefore(daynum: Int): String {
+        val calendar = Calendar.getInstance()
+        calendar.add(Calendar.DATE, -daynum)
+        return FORMAT_yyyyMMdd.format(calendar.time)
+    }
+
+    /**
+     * 获得指定日期的前一天
+     *
+     * @param specifiedDay yyyyMMdd
+     * @return yyyyMMdd
+     */
+    fun getSpecifiedDayBefore(specifiedDay: String): String {
+        return try {
+            val c = Calendar.getInstance()
+            val date = FORMAT_yyyyMMdd.parse(specifiedDay)
+            c.time = date
+            val day = c.get(Calendar.DATE)
+            c.set(Calendar.DATE, day - 1)
+            FORMAT_yyyyMMdd.format(c.time)
+        } catch (e: ParseException) {
+            ""
+        }
+    }
+
+    /**
+     * 获得指定日期的前一天
+     *
+     * @param dayBefore 往前推迟的天数
+     * @return Date
+     */
+    fun getSomeDayBefore(dayBefore: Int): Date {
+        val c = Calendar.getInstance()
+        c.add(Calendar.DAY_OF_MONTH, -dayBefore)
+        return c.time
+    }
+
+    /**
+     * 获得指定日期的后一天
+     *
+     * @param specifiedDay yyyyMMdd
+     * @return yyyyMMdd
+     */
+    fun getSpecifiedDayAfter(specifiedDay: String): String {
+        return try {
+            val c = Calendar.getInstance()
+            val date = FORMAT_yyyyMMdd.parse(specifiedDay)
+            c.time = date
+            val day = c.get(Calendar.DATE)
+            c.set(Calendar.DATE, day + 1)
+            FORMAT_yyyyMMdd.format(c.time)
+        } catch (e: ParseException) {
+            ""
+        }
+    }
+
+    /**
+     * @return yyyyMMddHHmmss
+     */
+    fun getNowDateTimeFormat(): String {
+        return FORMAT_yyyyMMddHHmmss.format(Date())
+    }
+
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/FileUtil.kt b/app/src/main/java/com/supwisdom/utils/FileUtil.kt
index 103d889..aa31722 100644
--- a/app/src/main/java/com/supwisdom/utils/FileUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/FileUtil.kt
@@ -1,142 +1,212 @@
-package com.supwisdom.utils
-
-import android.os.Environment
-import java.io.*
-
-/**
- ** create by zzq on 2019/7/23
- ** @desc
- **/
-object FileUtil {
-    private val ROOT_DIR = "/a711/pos/"
-    private val ROOT_PRIVATE_DIR = "/supwisdom/"
-    private val CACHE_FILE_DIR = ROOT_DIR + "cache/"
-    private val CRASH_FILE_DIR = ROOT_DIR + "crash/"
-    private val CRASH_FILE_PRE = "crash-"
-    private val LOG_FILE_DIR = ROOT_DIR + "log/"
-    private val LOG_FILE_PRE = "log-"
-    private val DTL_FILE_DIR = ROOT_DIR + "dtl/"
-    private val DTL_FILE_PRE = "dtl-"
-
-    fun getUpdateFile(fileName: String): File? {
-        return createFile(CACHE_FILE_DIR, fileName)
-    }
-
-    fun getCfgFile(fileName: String): File? {
-        return createFile(ROOT_PRIVATE_DIR, fileName)
-    }
-
-    fun getCfgFileStream(fileName: String): InputStream? {
-        if (android.os.Environment.MEDIA_MOUNTED == android.os.Environment.getExternalStorageState()) {
-            val rootFile = File(Environment.getExternalStorageDirectory().toString() + ROOT_PRIVATE_DIR)
-            if (!rootFile.exists()) {
-                return null
-            }
-            val retFile = File(rootFile, fileName)
-            if (retFile.exists()) {
-                try {
-                    return FileInputStream(retFile)
-                } catch (e: FileNotFoundException) {
-                    e.printStackTrace()
-                }
-
-            }
-        }
-        return null
-    }
-
-    fun removeDtlFile(beforeday: Int) {
-        removeFile(DTL_FILE_DIR, DTL_FILE_PRE, beforeday)
-    }
-
-    fun removeLogFile(beforeday: Int) {
-        removeFile(LOG_FILE_DIR, LOG_FILE_PRE, beforeday)
-    }
-
-    fun removeCrashFile(beforeday: Int) {
-        removeFile(CRASH_FILE_DIR, CRASH_FILE_PRE, beforeday)
-    }
-
-
-    fun writeDtlFile(msg: String) {
-        val pathfile = DTL_FILE_DIR + DTL_FILE_PRE + DateUtil.getNowDateNoFormat() + ".txt"
-        writeFile(pathfile, msg, true)
-    }
-
-    fun writeCrashFile(msg: String) {
-        val pathfile = CRASH_FILE_DIR + CRASH_FILE_PRE + DateUtil.getNowDateNoFormat() + ".txt"
-        writeFile(pathfile, msg, true)
-    }
-
-    fun writeLogFile(msg: String) {
-        val pathfile = LOG_FILE_DIR + LOG_FILE_PRE + DateUtil.getNowDateNoFormat() + ".txt"
-        writeFile(pathfile, msg, true)
-    }
-
-    private fun writeFile(targetPath: String, msg: String, append: Boolean) {
-        if (android.os.Environment.MEDIA_MOUNTED == android.os.Environment.getExternalStorageState()) {
-            val targetFile = File(Environment.getExternalStorageDirectory().toString() + targetPath)
-            if (!targetFile.parentFile.exists()) {
-                targetFile.parentFile.mkdirs()
-            }
-            try {
-                val osw = OutputStreamWriter(
-                    FileOutputStream(targetFile, append), "utf-8"
-                )
-                try {
-                    osw.write(msg)
-                    osw.write("</br>\n")
-                    osw.flush()
-                    osw.close()
-                } catch (e: IOException) {
-                    e.printStackTrace()
-                }
-
-            } catch (e1: UnsupportedEncodingException) {
-                e1.printStackTrace()
-            } catch (e1: FileNotFoundException) {
-                e1.printStackTrace()
-            }
-
-        }
-    }
-
-    private fun removeFile(targetPath: String, prefile: String, beforeday: Int) {
-        if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) {
-            val rootFile = File(Environment.getExternalStorageDirectory().toString() + targetPath)
-            if (!rootFile.exists()) {
-                return
-            }
-            val logname = prefile + DateUtil.getDayDateNoFormatBefore(beforeday) + ".txt"
-            val files = rootFile.listFiles()
-            for (file in files!!) {
-                val fullfilename = file.absolutePath
-                val filename = fullfilename.substring(fullfilename.lastIndexOf('/') + 1)
-                if (filename.startsWith(prefile) && filename.endsWith(".txt")) {
-                    if (filename.compareTo(logname) < 0) {
-                        file.delete()
-                    }
-                }
-            }
-        }
-    }
-
-    private fun createFile(path: String, fileName: String): File? {
-        if (android.os.Environment.MEDIA_MOUNTED == android.os.Environment.getExternalStorageState()) {
-            val rootFile = File(Environment.getExternalStorageDirectory().toString() + path)
-            if (!rootFile.exists()) {
-                rootFile.mkdirs()
-            }
-            val retFile = File(rootFile, fileName)
-            if (!retFile.exists()) {
-                try {
-                    retFile.createNewFile()
-                } catch (e: IOException) {
-                    return null
-                }
-            }
-            return retFile
-        }
-        return null
-    }
+package com.supwisdom.utils
+
+import android.os.Environment
+import java.io.*
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+object FileUtil {
+    private val ROOT_DIR = "/a711/pos/"
+    private val ROOT_PRIVATE_DIR = "/supwisdom/"
+    private val CACHE_FILE_DIR = ROOT_DIR + "cache/"
+    private val CRASH_FILE_DIR = ROOT_DIR + "crash/"
+    private val CRASH_FILE_PRE = "crash-"
+    private val LOG_FILE_DIR = ROOT_DIR + "log/"
+    private val LOG_FILE_PRE = "log-"
+    private val DTL_FILE_DIR = ROOT_DIR + "dtl/"
+    private val DTL_FILE_PRE = "dtl-"
+
+    fun getUpdateFile(fileName: String): File? {
+        return createFile(CACHE_FILE_DIR, fileName)
+    }
+
+    fun getCfgFile(fileName: String): File? {
+        return createFile(ROOT_PRIVATE_DIR, fileName)
+    }
+
+    fun getCfgFileStream(fileName: String): InputStream? {
+        if (android.os.Environment.MEDIA_MOUNTED == android.os.Environment.getExternalStorageState()) {
+            val rootFile = File(
+                Environment.getExternalStorageDirectory().toString() + ROOT_PRIVATE_DIR
+            )
+            if (!rootFile.exists()) {
+                return null
+            }
+            val retFile = File(rootFile, fileName)
+            if (retFile.exists()) {
+                try {
+                    return FileInputStream(retFile)
+                } catch (e: FileNotFoundException) {
+                    e.printStackTrace()
+                }
+
+            }
+        }
+        return null
+    }
+
+    fun removeDtlFile(beforeday: Int) {
+        removeFile(DTL_FILE_DIR, DTL_FILE_PRE, beforeday)
+    }
+
+    fun removeLogFile(beforeday: Int) {
+        removeFile(LOG_FILE_DIR, LOG_FILE_PRE, beforeday)
+    }
+
+    fun removeCrashFile(beforeday: Int) {
+        removeFile(CRASH_FILE_DIR, CRASH_FILE_PRE, beforeday)
+    }
+
+
+    fun writeDtlFile(msg: String) {
+        val pathfile = DTL_FILE_DIR + DTL_FILE_PRE + DateUtil.getNowDateNoFormat() + ".txt"
+        writeFile(pathfile, msg, true)
+    }
+
+    fun writeCrashFile(msg: String) {
+        val pathfile = CRASH_FILE_DIR + CRASH_FILE_PRE + DateUtil.getNowDateNoFormat() + ".txt"
+        writeFile(pathfile, msg, true)
+    }
+
+    fun writeLogFile(msg: String) {
+        val pathfile = LOG_FILE_DIR + LOG_FILE_PRE + DateUtil.getNowDateNoFormat() + ".txt"
+        writeFile(pathfile, msg, true)
+    }
+
+    private fun writeFile(targetPath: String, msg: String, append: Boolean) {
+        if (android.os.Environment.MEDIA_MOUNTED == android.os.Environment.getExternalStorageState()) {
+            val targetFile = File(Environment.getExternalStorageDirectory().toString() + targetPath)
+            if (!targetFile.parentFile.exists()) {
+                targetFile.parentFile.mkdirs()
+            }
+            try {
+                val osw = OutputStreamWriter(
+                    FileOutputStream(targetFile, append), "utf-8"
+                )
+                try {
+                    osw.write(msg)
+                    osw.write("</br>\n")
+                    osw.flush()
+                    osw.close()
+                } catch (e: IOException) {
+                    e.printStackTrace()
+                }
+
+            } catch (e1: UnsupportedEncodingException) {
+                e1.printStackTrace()
+            } catch (e1: FileNotFoundException) {
+                e1.printStackTrace()
+            }
+
+        }
+    }
+
+    private fun removeFile(targetPath: String, prefile: String, beforeday: Int) {
+        if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) {
+            val rootFile = File(Environment.getExternalStorageDirectory().toString() + targetPath)
+            if (!rootFile.exists()) {
+                return
+            }
+            val logname = prefile + DateUtil.getDayDateNoFormatBefore(beforeday) + ".txt"
+            val files = rootFile.listFiles()
+            for (file in files!!) {
+                val fullfilename = file.absolutePath
+                val filename = fullfilename.substring(fullfilename.lastIndexOf('/') + 1)
+                if (filename.startsWith(prefile) && filename.endsWith(".txt")) {
+                    if (filename.compareTo(logname) < 0) {
+                        file.delete()
+                    }
+                }
+            }
+        }
+    }
+
+    private fun createFile(path: String, fileName: String): File? {
+        if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) {
+            val rootFile = File(Environment.getExternalStorageDirectory().toString() + path)
+            if (!rootFile.exists()) {
+                rootFile.mkdirs()
+            }
+            val retFile = File(rootFile, fileName)
+            if (!retFile.exists()) {
+                try {
+                    retFile.createNewFile()
+                } catch (e: IOException) {
+                    return null
+                }
+            }
+            return retFile
+        }
+        return null
+    }
+
+    fun getSynoLicensePath(): String? {
+        if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) {
+            val path =
+                Environment.getExternalStorageDirectory().toString() + PublicDef.PATH_SHENG_YUAN
+            val sdfile = File(path)
+            if (!sdfile.exists()) {
+                sdfile.mkdirs()
+            }
+            return path
+        }
+        return null
+    }
+
+    fun readSynoLicenseFile(fullpath: String?): ByteArray? {
+        if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) {
+            val file = File(fullpath)
+            if (!file.parentFile.exists()) {
+                return null
+            }
+            try {
+                val isr = FileInputStream(file)
+                try {
+                    val os = ByteArrayOutputStream()
+                    val buf = ByteArray(1024)
+                    var size = 0
+                    while (isr.read(buf).also { size = it } != -1) {
+                        os.write(buf, 0, size)
+                    }
+                    return os.toByteArray()
+                } catch (e: IOException) {
+                    e.printStackTrace()
+                } finally {
+                    try {
+                        isr.close()
+                    } catch (e: IOException) {
+                        e.printStackTrace()
+                    }
+                }
+            } catch (e1: FileNotFoundException) {
+                e1.printStackTrace()
+            }
+        }
+        return null
+    }
+
+    fun writeSynoLicenseFile(fullpath: String, license: ByteArray): Boolean {
+        if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) {
+            val file = File(fullpath)
+            if (!file.parentFile.exists()) {
+                file.parentFile.mkdirs()
+            }
+            try {
+                val fos = FileOutputStream(file, false)
+                try {
+                    fos.write(license)
+                    fos.flush()
+                    fos.close()
+                    return true
+                } catch (e: IOException) {
+                    e.printStackTrace()
+                }
+            } catch (e1: FileNotFoundException) {
+                e1.printStackTrace()
+            }
+        }
+        return false
+    }
 }
\ 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 18c7074..2ddbf96 100644
--- a/app/src/main/java/com/supwisdom/utils/PublicDef.kt
+++ b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
@@ -1,96 +1,106 @@
-package com.supwisdom.utils
-
-/**
- * @author zzq
- * @date 2018/4/26.
- * @version 1.0.1
- * @desc  APP module常量定义
- */
-object PublicDef {
-    /**
-     * 错误码
-     */
-    const val SUCCESS = 0
-    const val ERROR = 1
-    /**
-     * 商户默认密码 111111
-     * 维护默认密码 914387
-     */
-    const val PASSWD_SHOP_DEFAULT = "111111"
-    const val PASSWD_ADMIN_DEFAULT = "914387"
-
-    /**************************************************************/
-    /*************************handler 状态码***********************/
-    const val MSG_CARD_PAYING = 10
-    const val MSG_CARD_READ_AGAIN = 11
-    const val MSG_CARD_PAY_FAIL = 12
-    const val MSG_CARD_PAY_SUC = 13
-    const val MSG_CARD_PAY_QUERY = 14
-    const val MSG_CARD_REVERSE_FAIL = 15
-    const val MSG_CARD_REVERSE_SUC = 16
-    const val MSG_USER_INFO_SHOW = 17
-    const val MSG_USER_INFO_CLEAR = 18
-    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*/
-    const val TRANSFLAG_NORMAL_CONSUME = 0x80 // 正常消费
-    const val TRANSFLAG_MEALER_CONSUME = 0xC0 // 搭伙
-    const val TRANSFLAG_DISCNT_CONSUME = 0xA0 // 折扣
-    const val TRANSFLAG_REVS_ML_CONSUME = 0x40 //冲正带搭伙
-    const val TRANSFLAG_REVS_DST_CONSUME = 0x20 // 冲正带折扣
-    const val TRANSFLAG_REVERSE_AUTO_CONSUME = 0x10 // 自动撤销 (0x00 手动冲正)
-    const val TRANSFLAG_REVERSE_CONSUME = 0x00 //&0x80 最高位0标识冲正(统一标识)
-    /*low 4 bit*/
-    const val TRANSFLAG_WRITE_CARD_SUCCESS = 0x01 // 写卡成功
-    const val TRANSFLAG_WRITE_CARD_HALFAWAY = 0x02 // 中途拔卡
-    const val TRANSFLAG_UNWRITE_CARD = 0x03 // 未写卡
-    const val TRANSFLAG_PWD_CONSUME = 0x04 // 密码消费
-
-    const val BG_SERVICE_NAME = "com.supwisdom.service.BackgroundTaskService"
-
-    /**
-     * Toast show
-     */
-    const val TOAST_SHOW_CRY = 1
-    const val TOAST_SHOW_SMILE = 2
-    const val TOAST_SHOW_DOUBT = 3
-
-    const val DIALOG_TYPE_BIG_PICTURE = 1
-    const val DIALOG_TYPE_PURCHASE = 2
-    const val DIALOG_TYPE_PASSWORD = 3
-    const val DIALOG_TYPE_SELECT_ORDER = 4
-    const val DIALOG_TYPE_DPS_CONFIRM = 5
-    const val DIALOG_TYPE_SCAN_RVS_CONFIRM = 6
-    const val DIALOG_TYPE_ORDINARY_CONSUME = 7
-    const val DIALOG_TYPE_DEPOSIT = 8
-    const val DIALOG_TYPE_NSD_CONFIG = 9
-
-    /**
-     * 本地全局控制参数
-     */
-    const val CONTROL_FIXAMT = "fixamt"
-    const val CONTROL_OFFLINE_DAY_DISABLE = "offdaydisable"
-    const val CONTROL_DEBUG_ENABLE = "debugenable"
-
-    /**
-     * 消费冲正时限
-     */
-    const val REVERSE_MS_GAP = 600000
-    /**
-     *
-     */
-    const val APP_ID = "200001"
-    const val APP_SECRET = "dc1d26c0d43e442588092c8d45c21bce"
+package com.supwisdom.utils
+
+/**
+ * @author zzq
+ * @date 2018/4/26.
+ * @version 1.0.1
+ * @desc  APP module常量定义
+ */
+object PublicDef {
+    /**
+     * 错误码
+     */
+    const val SUCCESS = 0
+    const val ERROR = 1
+
+    /**
+     * 商户默认密码 111111
+     * 维护默认密码 914387
+     */
+    const val PASSWD_SHOP_DEFAULT = "111111"
+    const val PASSWD_ADMIN_DEFAULT = "914387"
+
+    /**************************************************************/
+    /*************************handler 状态码***********************/
+    const val MSG_CARD_PAYING = 10
+    const val MSG_CARD_READ_AGAIN = 11
+    const val MSG_CARD_PAY_FAIL = 12
+    const val MSG_CARD_PAY_SUC = 13
+    const val MSG_CARD_PAY_QUERY = 14
+    const val MSG_CARD_REVERSE_FAIL = 15
+    const val MSG_CARD_REVERSE_SUC = 16
+    const val MSG_USER_INFO_SHOW = 17
+    const val MSG_USER_INFO_CLEAR = 18
+    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*/
+    const val TRANSFLAG_NORMAL_CONSUME = 0x80 // 正常消费
+    const val TRANSFLAG_MEALER_CONSUME = 0xC0 // 搭伙
+    const val TRANSFLAG_DISCNT_CONSUME = 0xA0 // 折扣
+    const val TRANSFLAG_REVS_ML_CONSUME = 0x40 //冲正带搭伙
+    const val TRANSFLAG_REVS_DST_CONSUME = 0x20 // 冲正带折扣
+    const val TRANSFLAG_REVERSE_AUTO_CONSUME = 0x10 // 自动撤销 (0x00 手动冲正)
+    const val TRANSFLAG_REVERSE_CONSUME = 0x00 //&0x80 最高位0标识冲正(统一标识)
+
+    /*low 4 bit*/
+    const val TRANSFLAG_WRITE_CARD_SUCCESS = 0x01 // 写卡成功
+    const val TRANSFLAG_WRITE_CARD_HALFAWAY = 0x02 // 中途拔卡
+    const val TRANSFLAG_UNWRITE_CARD = 0x03 // 未写卡
+    const val TRANSFLAG_PWD_CONSUME = 0x04 // 密码消费
+
+    const val BG_SERVICE_NAME = "com.supwisdom.service.BackgroundTaskService"
+
+    /**
+     * Toast show
+     */
+    const val TOAST_SHOW_CRY = 1
+    const val TOAST_SHOW_SMILE = 2
+    const val TOAST_SHOW_DOUBT = 3
+
+    const val DIALOG_TYPE_BIG_PICTURE = 1
+    const val DIALOG_TYPE_PURCHASE = 2
+    const val DIALOG_TYPE_PASSWORD = 3
+    const val DIALOG_TYPE_SELECT_ORDER = 4
+    const val DIALOG_TYPE_DPS_CONFIRM = 5
+    const val DIALOG_TYPE_SCAN_RVS_CONFIRM = 6
+    const val DIALOG_TYPE_ORDINARY_CONSUME = 7
+    const val DIALOG_TYPE_DEPOSIT = 8
+    const val DIALOG_TYPE_NSD_CONFIG = 9
+
+    const val CODE_SAME_FORBID_TIME: Long = 10 * 1000
+    const val CAMERA_FIX_PAY_PERIOD: Long = 30 * 60 * 1000
+
+    /**
+     * 本地全局控制参数
+     */
+    const val CONTROL_FIXAMT = "fixamt"
+    const val CONTROL_OFFLINE_DAY_DISABLE = "offdaydisable"
+    const val CONTROL_DEBUG_ENABLE = "debugenable"
+    const val CONTROL_SYNOCODE_ACTIVE = "synocodeactive"
+
+    /**
+     * 消费冲正时限
+     */
+    const val REVERSE_MS_GAP = 600000
+
+    /**
+     *
+     */
+    const val APP_ID = "200001"
+    const val APP_SECRET = "dc1d26c0d43e442588092c8d45c21bce"
+    const val SCHOOL_NO = "999888"
+    const val PATH_SHENG_YUAN = "/mnt/private/newcapec/"
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/utils/UrlBase64.java b/app/src/main/java/com/supwisdom/utils/UrlBase64.java
new file mode 100644
index 0000000..167871a
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/utils/UrlBase64.java
@@ -0,0 +1,147 @@
+package com.supwisdom.utils;
+
+import java.util.Arrays;
+
+public final class UrlBase64 {
+    /* BASE 64 encode table */
+    private static final char base64en[] =
+            {
+                    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+                    'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+                    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
+                    'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
+                    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
+                    'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+                    'w', 'x', 'y', 'z', '0', '1', '2', '3',
+                    '4', '5', '6', '7', '8', '9', '-', '_',
+            };
+    //+/
+    private static final char BASE64_PAD = '=';
+    private static final char BASE64DE_FIRST = '+';
+    private static final char BASE64DE_LAST = 'z';
+    /* ASCII order for BASE 64 decode, -1 in unused character */
+    private static final byte base64de[] =
+            {
+                    /* '+', ',', '-', '.', '/', '0', '1', '2', */
+                    -1, -1, 62, -1, -1, 52, 53, 54,
+
+                    /* '3', '4', '5', '6', '7', '8', '9', ':', */
+                    55, 56, 57, 58, 59, 60, 61, -1,
+
+                    /* ';', '<', '=', '>', '?', '@', 'A', 'B', */
+                    -1, -1, -1, -1, -1, -1, 0, 1,
+
+                    /* 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', */
+                    2, 3, 4, 5, 6, 7, 8, 9,
+
+                    /* 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', */
+                    10, 11, 12, 13, 14, 15, 16, 17,
+
+                    /* 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', */
+                    18, 19, 20, 21, 22, 23, 24, 25,
+
+                    /* '[', '\', ']', '^', '_', '`', 'a', 'b', */
+                    -1, -1, -1, -1, 63, -1, 26, 27,
+
+                    /* 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', */
+                    28, 29, 30, 31, 32, 33, 34, 35,
+
+                    /* 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', */
+                    36, 37, 38, 39, 40, 41, 42, 43,
+
+                    /* 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', */
+                    44, 45, 46, 47, 48, 49, 50, 51,
+            };
+
+    /**
+     * Encodes hex octects into Base64
+     *
+     * @param binaryData Array containing binaryData
+     * @return Encoded Base64 array
+     */
+    public static String encode(byte[] binaryData) {
+        int len = binaryData.length;
+        int i;
+        StringBuilder out = new StringBuilder();
+        for (i = 0; i < len; i++) {
+            int s = i % 3;
+            switch (s) {
+                case 0:
+                    out.append(base64en[(binaryData[i] >> 2) & 0x3F]);
+                    break;
+                case 1:
+                    out.append(base64en[((binaryData[i - 1] & 0x3) << 4) + ((binaryData[i] >> 4) & 0xF)]);
+                    break;
+                case 2:
+                    out.append(base64en[((binaryData[i - 1] & 0xF) << 2) + ((binaryData[i] >> 6) & 0x3)]);
+                    out.append(base64en[binaryData[i] & 0x3F]);
+                    break;
+                default:
+                    break;
+            }
+        }
+        i -= 1;
+        if (i % 3 == 0) {
+            out.append(base64en[(binaryData[i] & 0x3) << 4]);
+            out.append(BASE64_PAD);
+            out.append(BASE64_PAD);
+        } else if (i % 3 == 1) {
+            out.append(base64en[(binaryData[i] & 0xF) << 2]);
+            out.append(BASE64_PAD);
+        }
+        return out.toString();
+    }
+
+    /**
+     * Decodes Base64 data into octects
+     *
+     * @param encoded string containing Base64 data
+     * @return Array containind decoded data.
+     */
+    public static byte[] decode(String encoded) {
+        byte[] out = new byte[encoded.length()];
+        int offset = 0;
+        int len = encoded.length();
+        for (int i = 0; i < len; i++) {
+            int s = i % 4;
+            char ch = encoded.charAt(i);
+            if (ch == '=') {
+                return Arrays.copyOfRange(out, 0, offset);
+            }
+            if (ch < BASE64DE_FIRST || ch > BASE64DE_LAST) {
+                return null;
+            }
+            int c = base64de[ch - BASE64DE_FIRST];
+            if (c == -1) {
+                return null;
+            }
+            switch (s) {
+                case 0:
+                    out[offset] += (byte) ((c << 2) & 0xFF);
+                    break;
+                case 1:
+                    out[offset++] += (byte) ((c >> 4) & 0x3);
+                    /* if not last char with padding */
+                    if (i < len - 3 ||
+                            encoded.charAt(len - 2) != '=') {
+                        out[offset] += (byte) ((c & 0xF) << 4);
+                    }
+                    break;
+                case 2:
+                    out[offset++] += (byte) ((c >> 2) & 0xF);
+                    /* if not last char with padding */
+                    if (i < (len - 2) || encoded.charAt(len - 1) != '=') {
+                        out[offset] += (byte) ((c & 0x3) << 6);
+                    }
+                    break;
+                case 3:
+                    out[offset++] += (byte) c;
+                    break;
+                default:
+                    break;
+            }
+        }
+        return Arrays.copyOfRange(out, 0, offset);
+    }
+
+}
diff --git a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
index 7b27ee8..4566945 100644
--- a/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
+++ b/app/src/main/java/com/supwisdom/view/DialogPurchase.kt
@@ -5,17 +5,22 @@
 import android.graphics.Color
 import android.os.CountDownTimer
 import android.view.KeyEvent
+import android.view.SurfaceView
 import android.view.View
 import android.widget.TextView
 import com.google.zxing.Result
 import com.newcapec.zxinglib.IDecoderAcquirer
 import com.newcapec.zxinglib.PosDecoder
 import com.supwisdom.R
+import com.supwisdom.activities.SPApplication
 import com.supwisdom.activities.consume.bean.CardUserInfoBean
 import com.supwisdom.activities.menu.MenuActivity
 import com.supwisdom.activities.transdtl.TransdtlActivity
 import com.supwisdom.utils.CommonUtil
 import com.supwisdom.utils.LogUtil
+import com.supwisdom.utils.PublicDef
+import com.synodata.scanview.view.IDecodeListener
+import com.synodata.scanview.view.Preview
 
 /**
  ** create by zzq on 2019/7/26
@@ -23,7 +28,7 @@
  **/
 @Suppress("DEPRECATION")
 class DialogPurchase constructor(context: Context, private val callBack: ICallBack) :
-    DialogBase(context), IDecoderAcquirer {
+    DialogBase(context) {
     private val TAG = "DialogPurchase"
     private var vCount: TextView
     private var vPayhint: TextView
@@ -34,6 +39,7 @@
     private var lastCode: String = ""
     private var lastCodeTime: Long = 0
     private val waitTime = 60
+    private var syPreview: Preview? = null
     private var payQueryConfirm = false
     var codePayingNoCancelEnable = false
     var codePaying = false
@@ -46,30 +52,121 @@
         vPayhint = this.findViewById(R.id.tv_pay_hint) as TextView
         vPayamt = this.findViewById(R.id.tv_pay_amount) as TextView
         vUsername = this.findViewById(R.id.tv_pay_username) as TextView
-
-        posDec = PosDecoder(this)
     }
 
-    override fun onFailed() {
-
-    }
-
-    override fun onDecoded(result: String?) {
-
-    }
-
-    override fun onDecoded(result: Result) {
-        val rawSize = result.rawBytes?.size ?: 0
-        if (rawSize > 0) {
-            if (result.text == lastCode &&
-                result.timestamp - lastCodeTime < 5000
-            ) {
-                return
-            }
-            lastCode = result.text
-            lastCodeTime = result.timestamp
-            callBack.callback(result.text)
+    private fun initZxingScan() {
+        /**
+         * 启用zxing时关闭晟元
+         */
+        if (syPreview != null) {
+            syPreview!!.stopScanning()
+            syPreview!!.disconnect()
+            syPreview!!.visibility = View.GONE
+            syPreview = null
         }
+
+        posDec = PosDecoder(object : IDecoderAcquirer {
+            override fun onFailed() {
+
+            }
+
+            override fun onDecoded(result: String?) {
+
+            }
+
+            override fun onDecoded(result: Result) {
+                val rawSize = result.rawBytes?.size ?: 0
+                if (rawSize > 0) {
+                    val tt = System.currentTimeMillis()
+                    if (result.text == lastCode &&
+                        tt - lastCodeTime < PublicDef.CODE_SAME_FORBID_TIME
+                    ) {
+                        return
+                    }
+                    lastCode = result.text
+                    lastCodeTime = tt
+                    callBack.callback(result.text)
+                }
+            }
+        })
+    }
+
+    private fun initSynoScan() {
+        /**
+         * 启用晟元时关闭zxing
+         */
+        posDec?.onResume()
+        posDec = null
+
+        syPreview = this.findViewById<Preview>(R.id.sy_preview)
+        syPreview!!.visibility = SurfaceView.VISIBLE
+        syPreview!!.setDecodeListener(object : IDecodeListener {
+            override fun onDecodeResult(
+                bDecoded: Boolean,
+                result: String?,
+                bytesResult: ByteArray?,
+                type: String
+            ) {
+                if (bDecoded) {
+                    val tt = System.currentTimeMillis()
+                    if (result!! == lastCode &&
+                        tt - lastCodeTime < PublicDef.CODE_SAME_FORBID_TIME
+                    ) {
+                        return
+                    }
+                    lastCode = result
+                    lastCodeTime = tt
+                    callBack.callback(result)
+                }
+            }
+
+            override fun onDecodeResult(bDecoded: Boolean, result: String?, type: String) {
+            }
+
+            override fun onSettingUpdateNotify() {
+            }
+
+        })
+        syPreview!!.showCode11Pre(false)
+        syPreview!!.showCode39Pre(false)
+        syPreview!!.setPreviewSize(640, 480)
+        syPreview!!.sceneMode = 1
+        syPreview!!.setVibrate(false)
+    }
+
+    private fun cameraOpenScan() {
+        val time = System.currentTimeMillis()
+        if (time < lastFixpayDecoderOpenTime ||
+            time - lastFixpayDecoderOpenTime > PublicDef.CAMERA_FIX_PAY_PERIOD
+        ) {
+            lastFixpayDecoderOpenTime = time
+            if (SPApplication.getInstance().isSynoCodeActive()) {
+                if (syPreview == null) {
+                    initSynoScan()
+                }
+                syPreview!!.stopScanning()
+                syPreview!!.disconnect()
+                syPreview!!.connect(context)
+                syPreview!!.startScanning()
+            } else {
+                if (posDec == null) {
+                    initZxingScan()
+                }
+                try {
+                    posDec!!.onPause()
+                } catch (ex: Exception) {
+                    ex.printStackTrace()
+                    LogUtil.d(TAG, "fix close camera exception:" + CommonUtil.getExceptionStack(ex))
+                }
+                try {
+                    posDec!!.onResume()
+                } catch (ex: Exception) {
+                    ex.printStackTrace()
+                    LogUtil.d(TAG, "fix open camera exception:" + CommonUtil.getExceptionStack(ex))
+                }
+            }
+        }
+        syPreview?.startScanning()
     }
 
     override fun dispatchKeyEvent(event: KeyEvent): Boolean {
@@ -99,12 +196,12 @@
     fun show(hint: String, amount: String) {
         vPayhint.text = hint
         vPayhint.setTextColor(context.resources.getColor(R.color.blue))
-        vPayamt.text = null//amount
+        vPayamt.text = amount
         vPayamt.visibility = View.VISIBLE
 
         vUsername.visibility = View.GONE
         show()
-        asyncOpenDecoder()
+        cameraOpenScan()
         resetCounter(waitTime)
     }
 
@@ -125,7 +222,7 @@
 
     fun showPaySuccess(info: CardUserInfoBean) {
         payQueryConfirm = false
-        vPayhint.text = info.retmsg
+        vPayhint.text = info.getErrorMsg()
         vPayhint.setTextColor(Color.GREEN)
         vPayamt.text = CommonUtil.showFormatAmount("金额", info.payamt)
         vPayamt.visibility = View.VISIBLE
@@ -150,7 +247,7 @@
         payQueryConfirm = false
         vPayhint.text = "消费失败"
         vPayhint.setTextColor(Color.RED)
-        vPayamt.text = info.retmsg
+        vPayamt.text = info.getErrorMsg()
         vPayamt.visibility = View.VISIBLE
         vUsername.visibility = View.GONE
         show()
@@ -159,7 +256,7 @@
 
     fun showReverseSuccess(info: CardUserInfoBean) {
         payQueryConfirm = false
-        vPayhint.text = info.retmsg
+        vPayhint.text = info.getErrorMsg()
         vPayhint.setTextColor(Color.GREEN)
         vPayamt.text = CommonUtil.showFormatAmount("金额", info.amount)
         vPayamt.visibility = View.VISIBLE
@@ -172,69 +269,28 @@
         payQueryConfirm = false
         vPayhint.text = "冲正失败"
         vPayhint.setTextColor(Color.RED)
-        vPayamt.text = info.retmsg
+        vPayamt.text = info.getErrorMsg()
         vPayamt.visibility = View.VISIBLE
         vUsername.visibility = View.GONE
         show()
         resetCounter(info.showtime)
     }
 
-    private fun asyncOpenDecoder() {
-        if (!isFixPay) {
-            try {
-                posDec!!.onResume()
-            } catch (ex: Exception) {
-                ex.printStackTrace()
-                LogUtil.d(TAG, "open camera exception:" + CommonUtil.getExceptionStack(ex))
-            }
-        } else {
-            val time = System.currentTimeMillis()
-            if (time < lastFixpayDecoderOpenTime ||
-                time - lastFixpayDecoderOpenTime > 60000
-            ) {
-                lastFixpayDecoderOpenTime = time
-                try {
-                    posDec!!.onPause()
-                } catch (ex: Exception) {
-                    ex.printStackTrace()
-                    LogUtil.d(TAG, "fix close camera exception:" + CommonUtil.getExceptionStack(ex))
-                }
-                try {
-                    posDec!!.onResume()
-                } catch (ex: Exception) {
-                    ex.printStackTrace()
-                    LogUtil.d(TAG, "fix open camera exception:" + CommonUtil.getExceptionStack(ex))
-                }
-            }
-        }
-    }
-
-    private fun asyncCloseDecoder() {
-        if (!isFixPay) {
-            try {
-                posDec!!.onPause()
-            } catch (ex: Exception) {
-                ex.printStackTrace()
-                LogUtil.d(TAG, "close camera exception:" + CommonUtil.getExceptionStack(ex))
-            }
-        }
-    }
-
     private fun finish(isManualCancel: Boolean, isPaying: Boolean) {
+        syPreview?.stopScanning()
         codePaying = false
         codePayingNoCancelEnable = false
         payQueryConfirm = false
         dismiss()
         callBack.callback(isManualCancel, isPaying)
-        asyncCloseDecoder()
     }
 
     private var counter: ConsumeHintCount? = null
 
     private fun resetCounter(times: Int) {
         counter?.cancel()
-        counter = ConsumeHintCount((times * 1000).toLong(), 200)
-        counter?.start()
+        counter = ConsumeHintCount((times * 1000).toLong(), 500)
+        counter!!.start()
     }
 
     private inner class ConsumeHintCount
@@ -253,7 +309,7 @@
         }
 
         override fun onFinish() {
-            finish(false, false)
+            finish(isManualCancel = false, isPaying = false)
         }
     }
 
diff --git a/app/src/main/jniLibs/arm64-v8a/libjava_camera.so b/app/src/main/jniLibs/arm64-v8a/libjava_camera.so
new file mode 100644
index 0000000..a6c77bd
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libjava_camera.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libsyno_getparam.so b/app/src/main/jniLibs/arm64-v8a/libsyno_getparam.so
new file mode 100644
index 0000000..96713e2
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libsyno_getparam.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libsyno_jni.so b/app/src/main/jniLibs/arm64-v8a/libsyno_jni.so
new file mode 100644
index 0000000..37bb8c9
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libsyno_jni.so
Binary files differ
diff --git a/app/src/main/jniLibs/arm64-v8a/libsynochip_qrcode.so b/app/src/main/jniLibs/arm64-v8a/libsynochip_qrcode.so
new file mode 100644
index 0000000..86805d8
--- /dev/null
+++ b/app/src/main/jniLibs/arm64-v8a/libsynochip_qrcode.so
Binary files differ
diff --git a/app/src/main/res/layout/activity_consume.xml b/app/src/main/res/layout/activity_consume.xml
index a1bf974..1ee916e 100644
--- a/app/src/main/res/layout/activity_consume.xml
+++ b/app/src/main/res/layout/activity_consume.xml
@@ -1,424 +1,431 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:background="@color/light_blue2"
-              android:focusable="true"
-              android:orientation="vertical">
-
-    <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="20dp"
-            android:layout_marginTop="20dp"
-            android:layout_marginRight="20dp"
-            android:background="@drawable/corner_bg_white"
-            android:orientation="vertical">
-
-        <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="304dp"
-                android:orientation="vertical">
-
-            <LinearLayout
-                    android:layout_width="match_parent"
-                    android:layout_height="130dp"
-                    android:orientation="horizontal"
-                    android:padding="@dimen/consume_text_pad_size"
-                    android:weightSum="3">
-
-                <LinearLayout
-                        android:layout_width="0dp"
-                        android:layout_height="match_parent"
-                        android:layout_weight="2"
-                        android:orientation="horizontal">
-
-                    <ImageView
-                            android:layout_width="60dp"
-                            android:layout_height="60dp"
-                            android:layout_gravity="center"
-                            android:scaleType="fitXY"
-                            android:src="@mipmap/shop_logo"/>
-
-                    <LinearLayout
-                            android:layout_width="wrap_content"
-                            android:layout_height="match_parent"
-                            android:layout_gravity="center"
-                            android:layout_marginLeft="10dp"
-                            android:layout_marginTop="8dp"
-                            android:orientation="vertical"
-                            android:padding="1dp">
-
-                        <TextView
-                                android:id="@+id/tv_shopname"
-                                android:layout_width="match_parent"
-                                android:layout_height="wrap_content"
-                                android:maxLines="2"
-                                android:text=""
-                                android:textColor="@color/blue"
-                                android:textSize="28sp"/>
-
-                        <TextView
-                                android:id="@+id/tv_nowtime"
-                                android:layout_width="match_parent"
-                                android:layout_height="wrap_content"
-                                android:gravity="start"
-                                android:maxLines="1"
-                                android:text=""
-                                android:textColor="@color/blue"
-                                android:textSize="22sp"/>
-                    </LinearLayout>
-                </LinearLayout>
-
-                <LinearLayout
-                        android:layout_width="0dp"
-                        android:layout_height="match_parent"
-                        android:layout_gravity="center"
-                        android:layout_weight="1"
-                        android:gravity="end"
-                        android:orientation="horizontal">
-
-                    <ImageView
-                            android:id="@+id/tv_linklogo"
-                            android:layout_width="30dp"
-                            android:layout_height="30dp"
-                            android:scaleType="fitXY"
-                            android:src="@drawable/wireless_on"/>
-
-                    <TextView
-                            android:id="@+id/tv_linkstat"
-                            android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:maxLines="1"
-                            android:text="已联网"
-                            android:textColor="@color/blue"
-                            android:textSize="22sp"/>
-                </LinearLayout>
-            </LinearLayout>
-
-            <View
-                    android:layout_width="match_parent"
-                    android:layout_height="1dp"
-                    android:layout_marginLeft="10dp"
-                    android:layout_marginRight="10dp"
-                    android:background="@color/black"/>
-
-            <LinearLayout
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:orientation="horizontal"
-                    android:padding="@dimen/consume_text_pad_size">
-
-                <TextView
-                        android:layout_width="260dp"
-                        android:layout_height="match_parent"
-                        android:gravity="start|center"
-                        android:text="消费金额"
-                        android:textColor="@color/blue"
-                        android:textSize="50sp"
-                        android:textStyle="bold"/>
-
-                <TextView
-                        android:id="@+id/tv_input_amt"
-                        android:layout_width="wrap_content"
-                        android:layout_height="match_parent"
-                        android:gravity="center"
-                        android:maxLines="1"
-                        android:text="0"
-                        android:textColor="@color/orange1"
-                        android:textSize="65sp"
-                        android:textStyle="bold"/>
-            </LinearLayout>
-        </LinearLayout>
-    </LinearLayout>
-
-    <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="20dp"
-            android:layout_marginTop="10dp"
-            android:layout_marginRight="20dp"
-            android:background="@drawable/corner_bg_ordinary_consume_green"
-            android:orientation="vertical">
-
-        <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:padding="10dp">
-
-            <ImageView
-                    android:layout_width="40dp"
-                    android:layout_height="40dp"
-                    android:scaleType="fitXY"
-                    android:src="@mipmap/show_card_info"/>
-
-            <TextView
-                    android:id="@+id/tv_card_info"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:text="市民卡信息"
-                    android:textColor="@color/blue"
-                    android:textSize="@dimen/consume_text_size2"/>
-        </LinearLayout>
-
-        <View
-                android:layout_width="match_parent"
-                android:layout_height="1dp"
-                android:layout_marginLeft="10dp"
-                android:layout_marginTop="5dp"
-                android:layout_marginRight="10dp"
-                android:layout_marginBottom="5dp"
-                android:background="@color/black"/>
-
-        <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:layout_marginLeft="10dp"
-                android:layout_marginTop="5dp"
-                android:orientation="vertical">
-
-            <ImageView
-                    android:layout_width="80dp"
-                    android:layout_height="80dp"
-                    android:layout_gravity="center"
-                    android:scaleType="fitXY"
-                    android:src="@mipmap/default_photo"
-                    android:visibility="gone"/>
-
-
-            <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:padding="@dimen/consume_text_pad_size1"
-                    android:text="如需查询信息,请刷卡!"
-                    android:textColor="@color/blue"
-                    android:textSize="@dimen/consume_text_size2"/>
-
-            <LinearLayout style="@style/consume_wait_account_ll_style">
-
-                <TextView
-                        style="@style/consume_wait_account_paraname_style"
-                        android:text="姓         名: "/>
-
-                <TextView
-                        android:id="@+id/tv_citizen_name"
-                        style="@style/consume_wait_account_paraval_style"/>
-            </LinearLayout>
-
-            <LinearLayout style="@style/consume_wait_account_ll_style">
-
-                <TextView
-                        style="@style/consume_wait_account_paraname_style"
-                        android:text="市民卡号: "/>
-
-                <TextView
-                        android:id="@+id/tv_citizen_cardno"
-                        style="@style/consume_wait_account_paraval_style"/>
-            </LinearLayout>
-
-            <LinearLayout style="@style/consume_wait_account_ll_style">
-
-                <TextView
-                        style="@style/consume_wait_account_paraname_style"
-                        android:text="账户状态: "/>
-
-                <TextView
-                        android:id="@+id/tv_cardstatus"
-                        style="@style/consume_wait_account_paraval_style"/>
-            </LinearLayout>
-        </LinearLayout>
-    </LinearLayout>
-
-    <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_marginLeft="20dp"
-            android:layout_marginTop="10dp"
-            android:layout_marginRight="20dp"
-            android:layout_marginBottom="20dp"
-            android:background="@drawable/corner_bg_ordinary_consume_green"
-            android:orientation="vertical">
-
-        <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:padding="@dimen/consume_text_pad_size1">
-
-            <ImageView
-                    android:layout_width="40dp"
-                    android:layout_height="40dp"
-                    android:scaleType="fitXY"
-                    android:src="@mipmap/bill_lastdtl"/>
-
-            <TextView
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:text="最近一笔"
-                    android:textColor="@color/blue"
-                    android:textSize="@dimen/consume_text_size2"/>
-        </LinearLayout>
-
-        <View
-                android:layout_width="match_parent"
-                android:layout_height="1dp"
-                android:layout_marginLeft="10dp"
-                android:layout_marginTop="10dp"
-                android:layout_marginRight="10dp"
-                android:layout_marginBottom="5dp"
-                android:background="@color/black"/>
-
-        <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:paddingLeft="10dp"
-                android:paddingTop="10dp">
-
-            <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="match_parent"
-                    android:text="支付结果:  "
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/consume_text_size2"/>
-
-            <TextView
-                    android:id="@+id/tv_last_pay_result"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:maxLines="1"
-                    android:text=""
-                    android:textColor="@color/blue"
-                    android:textSize="@dimen/consume_text_size2"
-                    android:textStyle="bold"/>
-        </LinearLayout>
-
-        <LinearLayout
-                android:id="@+id/ll_consume_last_failreason"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:paddingLeft="10dp"
-                android:paddingTop="5dp"
-                android:visibility="gone">
-
-            <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="match_parent"
-                    android:text="失败提示:  "
-                    android:textColor="@color/cl_red"
-                    android:textSize="@dimen/consume_text_size2"/>
-
-            <TextView
-                    android:id="@+id/tv_last_failreason"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:maxLines="1"
-                    android:text=""
-                    android:textColor="@color/cl_red"
-                    android:textSize="@dimen/consume_text_size2"
-                    android:textStyle="bold"/>
-        </LinearLayout>
-        <LinearLayout
-                android:id="@+id/ll_consume_cardno"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:paddingLeft="10dp"
-                android:paddingTop="5dp">
-
-            <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="match_parent"
-                    android:text="支付卡号:  "
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/consume_text_size2"/>
-
-            <TextView
-                    android:id="@+id/tv_last_cardno"
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:maxLines="1"
-                    android:text=""
-                    android:textColor="@color/blue"
-                    android:textSize="@dimen/consume_text_size2"
-                    android:textStyle="bold"/>
-        </LinearLayout>
-        <LinearLayout
-                android:id="@+id/ll_consume_last_payamt"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:paddingLeft="10dp"
-                android:paddingTop="5dp">
-
-            <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="match_parent"
-                    android:text="支付金额:  "
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/consume_text_size2"/>
-
-            <TextView
-                    android:id="@+id/tv_last_payamt"
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:maxLines="1"
-                    android:text=""
-                    android:textColor="@color/blue"
-                    android:textSize="@dimen/consume_text_size2"
-                    android:textStyle="bold"/>
-        </LinearLayout>
-
-        <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:paddingLeft="10dp"
-                android:paddingTop="5dp">
-
-            <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="match_parent"
-                    android:text="支付方式:  "
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/consume_text_size2"/>
-
-            <TextView
-                    android:id="@+id/tv_last_payway"
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:maxLines="1"
-                    android:text=""
-                    android:textColor="@color/blue"
-                    android:textSize="@dimen/consume_text_size2"
-                    android:textStyle="bold"/>
-        </LinearLayout>
-
-        <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal"
-                android:paddingLeft="10dp"
-                android:paddingTop="5dp">
-
-            <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="match_parent"
-                    android:text="支付时间:  "
-                    android:textColor="@color/black"
-                    android:textSize="@dimen/consume_text_size2"/>
-
-            <TextView
-                    android:id="@+id/tv_last_paytime"
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:maxLines="1"
-                    android:text=""
-                    android:textColor="@color/blue"
-                    android:textSize="@dimen/consume_text_size2"
-                    android:textStyle="bold"/>
-        </LinearLayout>
-    </LinearLayout>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:background="@color/light_blue2"
+              android:focusable="true"
+              android:orientation="vertical">
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="20dp"
+            android:layout_marginTop="20dp"
+            android:layout_marginRight="20dp"
+            android:background="@drawable/corner_bg_white"
+            android:orientation="vertical">
+
+        <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="304dp"
+                android:orientation="vertical">
+
+            <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="130dp"
+                    android:orientation="horizontal"
+                    android:padding="@dimen/consume_text_pad_size"
+                    android:weightSum="3">
+
+                <LinearLayout
+                        android:layout_width="0dp"
+                        android:layout_height="match_parent"
+                        android:layout_weight="2"
+                        android:orientation="horizontal">
+
+                    <ImageView
+                            android:layout_width="60dp"
+                            android:layout_height="60dp"
+                            android:layout_gravity="center"
+                            android:scaleType="fitXY"
+                            android:src="@mipmap/shop_logo"/>
+
+                    <LinearLayout
+                            android:layout_width="wrap_content"
+                            android:layout_height="match_parent"
+                            android:layout_gravity="center"
+                            android:layout_marginLeft="10dp"
+                            android:layout_marginTop="8dp"
+                            android:orientation="vertical"
+                            android:padding="1dp">
+
+                        <TextView
+                                android:id="@+id/tv_shopname"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:maxLines="2"
+                                android:text=""
+                                android:textColor="@color/blue"
+                                android:textSize="28sp"/>
+
+                        <TextView
+                                android:id="@+id/tv_nowtime"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:gravity="start"
+                                android:maxLines="1"
+                                android:text=""
+                                android:textColor="@color/blue"
+                                android:textSize="22sp"/>
+                    </LinearLayout>
+                </LinearLayout>
+
+                <LinearLayout
+                        android:layout_width="0dp"
+                        android:layout_height="match_parent"
+                        android:layout_gravity="center"
+                        android:layout_weight="1"
+                        android:gravity="end"
+                        android:orientation="horizontal">
+
+                    <ImageView
+                            android:id="@+id/tv_linklogo"
+                            android:layout_width="30dp"
+                            android:layout_height="30dp"
+                            android:scaleType="fitXY"
+                            android:src="@drawable/wireless_on"/>
+
+                    <TextView
+                            android:id="@+id/tv_linkstat"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:maxLines="1"
+                            android:text="已联网"
+                            android:textColor="@color/blue"
+                            android:textSize="22sp"/>
+                </LinearLayout>
+            </LinearLayout>
+
+            <View
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:layout_marginLeft="10dp"
+                    android:layout_marginRight="10dp"
+                    android:background="@color/black"/>
+
+            <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:orientation="horizontal"
+                    android:padding="@dimen/consume_text_pad_size">
+
+                <TextView
+                        android:layout_width="260dp"
+                        android:layout_height="match_parent"
+                        android:gravity="start|center"
+                        android:text="消费金额"
+                        android:textColor="@color/blue"
+                        android:textSize="50sp"
+                        android:textStyle="bold"/>
+
+                <TextView
+                        android:id="@+id/tv_input_amt"
+                        android:layout_width="wrap_content"
+                        android:layout_height="match_parent"
+                        android:gravity="center"
+                        android:maxLines="1"
+                        android:text="0"
+                        android:textColor="@color/orange1"
+                        android:textSize="65sp"
+                        android:textStyle="bold"/>
+            </LinearLayout>
+        </LinearLayout>
+    </LinearLayout>
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="20dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginRight="20dp"
+            android:background="@drawable/corner_bg_ordinary_consume_green"
+            android:orientation="vertical">
+
+        <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal"
+                android:padding="10dp">
+
+            <ImageView
+                    android:layout_width="40dp"
+                    android:layout_height="40dp"
+                    android:scaleType="fitXY"
+                    android:src="@mipmap/show_card_info"/>
+
+            <TextView
+                    android:id="@+id/tv_card_info"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="市民卡信息"
+                    android:textColor="@color/blue"
+                    android:textSize="@dimen/consume_text_size2"/>
+        </LinearLayout>
+
+        <View
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:layout_marginLeft="10dp"
+                android:layout_marginTop="5dp"
+                android:layout_marginRight="10dp"
+                android:layout_marginBottom="5dp"
+                android:background="@color/black"/>
+
+        <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_marginLeft="10dp"
+                android:layout_marginTop="5dp"
+                android:orientation="vertical">
+
+            <ImageView
+                    android:layout_width="80dp"
+                    android:layout_height="80dp"
+                    android:layout_gravity="center"
+                    android:scaleType="fitXY"
+                    android:src="@mipmap/default_photo"
+                    android:visibility="gone"/>
+
+
+            <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:padding="@dimen/consume_text_pad_size1"
+                    android:text="如需查询信息,请刷卡!"
+                    android:textColor="@color/blue"
+                    android:textSize="@dimen/consume_text_size2"/>
+
+            <LinearLayout style="@style/consume_wait_account_ll_style">
+
+                <TextView
+                        style="@style/consume_wait_account_paraname_style"
+                        android:text="姓         名: "/>
+
+                <TextView
+                        android:id="@+id/tv_citizen_name"
+                        style="@style/consume_wait_account_paraval_style"/>
+            </LinearLayout>
+
+            <LinearLayout style="@style/consume_wait_account_ll_style">
+
+                <TextView
+                        style="@style/consume_wait_account_paraname_style"
+                        android:text="市民卡号: "/>
+
+                <TextView
+                        android:id="@+id/tv_citizen_cardno"
+                        style="@style/consume_wait_account_paraval_style"/>
+            </LinearLayout>
+
+            <LinearLayout style="@style/consume_wait_account_ll_style">
+
+                <TextView
+                        style="@style/consume_wait_account_paraname_style"
+                        android:text="账户状态: "/>
+
+                <TextView
+                        android:id="@+id/tv_cardstatus"
+                        style="@style/consume_wait_account_paraval_style"/>
+            </LinearLayout>
+        </LinearLayout>
+    </LinearLayout>
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="20dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginRight="20dp"
+            android:layout_marginBottom="20dp"
+            android:background="@drawable/corner_bg_ordinary_consume_green"
+            android:orientation="vertical">
+
+        <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal"
+                android:padding="@dimen/consume_text_pad_size1">
+
+            <ImageView
+                    android:layout_width="40dp"
+                    android:layout_height="40dp"
+                    android:scaleType="fitXY"
+                    android:src="@mipmap/bill_lastdtl"/>
+
+            <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="最近一笔"
+                    android:textColor="@color/blue"
+                    android:textSize="@dimen/consume_text_size2"/>
+            <TextView
+                    android:id="@+id/tv_syno_flag"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="!"
+                    android:textColor="@color/blue"
+                    android:textSize="@dimen/consume_text_size2" />
+        </LinearLayout>
+
+        <View
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:layout_marginLeft="10dp"
+                android:layout_marginTop="10dp"
+                android:layout_marginRight="10dp"
+                android:layout_marginBottom="5dp"
+                android:background="@color/black"/>
+
+        <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal"
+                android:paddingLeft="10dp"
+                android:paddingTop="10dp">
+
+            <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:text="支付结果:  "
+                    android:textColor="@color/black"
+                    android:textSize="@dimen/consume_text_size2"/>
+
+            <TextView
+                    android:id="@+id/tv_last_pay_result"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:maxLines="1"
+                    android:text=""
+                    android:textColor="@color/blue"
+                    android:textSize="@dimen/consume_text_size2"
+                    android:textStyle="bold"/>
+        </LinearLayout>
+
+        <LinearLayout
+                android:id="@+id/ll_consume_last_failreason"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal"
+                android:paddingLeft="10dp"
+                android:paddingTop="5dp"
+                android:visibility="gone">
+
+            <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:text="失败提示:  "
+                    android:textColor="@color/cl_red"
+                    android:textSize="@dimen/consume_text_size2"/>
+
+            <TextView
+                    android:id="@+id/tv_last_failreason"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:maxLines="1"
+                    android:text=""
+                    android:textColor="@color/cl_red"
+                    android:textSize="@dimen/consume_text_size2"
+                    android:textStyle="bold"/>
+        </LinearLayout>
+        <LinearLayout
+                android:id="@+id/ll_consume_cardno"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal"
+                android:paddingLeft="10dp"
+                android:paddingTop="5dp">
+
+            <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:text="支付卡号:  "
+                    android:textColor="@color/black"
+                    android:textSize="@dimen/consume_text_size2"/>
+
+            <TextView
+                    android:id="@+id/tv_last_cardno"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:maxLines="1"
+                    android:text=""
+                    android:textColor="@color/blue"
+                    android:textSize="@dimen/consume_text_size2"
+                    android:textStyle="bold"/>
+        </LinearLayout>
+        <LinearLayout
+                android:id="@+id/ll_consume_last_payamt"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal"
+                android:paddingLeft="10dp"
+                android:paddingTop="5dp">
+
+            <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:text="支付金额:  "
+                    android:textColor="@color/black"
+                    android:textSize="@dimen/consume_text_size2"/>
+
+            <TextView
+                    android:id="@+id/tv_last_payamt"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:maxLines="1"
+                    android:text=""
+                    android:textColor="@color/blue"
+                    android:textSize="@dimen/consume_text_size2"
+                    android:textStyle="bold"/>
+        </LinearLayout>
+
+        <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal"
+                android:paddingLeft="10dp"
+                android:paddingTop="5dp">
+
+            <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:text="支付方式:  "
+                    android:textColor="@color/black"
+                    android:textSize="@dimen/consume_text_size2"/>
+
+            <TextView
+                    android:id="@+id/tv_last_payway"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:maxLines="1"
+                    android:text=""
+                    android:textColor="@color/blue"
+                    android:textSize="@dimen/consume_text_size2"
+                    android:textStyle="bold"/>
+        </LinearLayout>
+
+        <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal"
+                android:paddingLeft="10dp"
+                android:paddingTop="5dp">
+
+            <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="match_parent"
+                    android:text="支付时间:  "
+                    android:textColor="@color/black"
+                    android:textSize="@dimen/consume_text_size2"/>
+
+            <TextView
+                    android:id="@+id/tv_last_paytime"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:maxLines="1"
+                    android:text=""
+                    android:textColor="@color/blue"
+                    android:textSize="@dimen/consume_text_size2"
+                    android:textStyle="bold"/>
+        </LinearLayout>
+    </LinearLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_manage.xml b/app/src/main/res/layout/activity_manage.xml
index 7537388..4fb3a1f 100644
--- a/app/src/main/res/layout/activity_manage.xml
+++ b/app/src/main/res/layout/activity_manage.xml
@@ -1,54 +1,74 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              style="@style/head_title_out_style">
-
-    <LinearLayout style="@style/head_title_inner_style">
-        <TextView
-                style="@style/head_title_text_style"
-                android:text="维护管理界面"/>
-
-        <LinearLayout
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:layout_marginLeft="10dp"
-                android:orientation="vertical"
-                android:padding="10dp">
-
-            <TextView
-                    style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_shop_passwd"/>
-
-            <TextView
-                    style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_comm_set"/>
-
-            <TextView
-                    style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_unconfirm_transdtl"/>
-
-            <TextView
-                    style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_out_dtl"/>
-
-            <TextView
-                    style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_upgrade"/>
-
-            <TextView
-                    style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_app_exit"/>
-
-            <TextView
-                    style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_setting"/>
-
-            <TextView
-                    style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_clear_blklist"/>
-
-            <TextView
-                    style="@style/menu_item_text_style"
-                    android:text="@string/consume_menu_control_set"/>
-        </LinearLayout>
-    </LinearLayout>
-</LinearLayout>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        style="@style/head_title_out_style">
+
+    <LinearLayout style="@style/head_title_inner_style">
+
+        <TextView
+                style="@style/head_title_text_style"
+                android:text="维护管理界面" />
+
+        <LinearLayout
+                android:id="@+id/ll_operate"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:orientation="vertical"
+                android:padding="10dp"
+                android:visibility="gone">
+
+            <TextView
+                    android:id="@+id/tv_operate_hint"
+                    style="@style/menu_item_text_style" />
+
+            <TextView
+                    android:id="@+id/tv_operate_result"
+                    style="@style/menu_item_text_style" />
+        </LinearLayout>
+
+        <LinearLayout
+                android:id="@+id/ll_menu"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_marginLeft="10dp"
+                android:orientation="vertical"
+                android:padding="10dp">
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_shop_passwd" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_comm_set" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_unconfirm_transdtl" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_syno_active" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_upgrade" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_app_exit" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_setting" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_clear_blklist" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_control_set" />
+        </LinearLayout>
+    </LinearLayout>
+</LinearLayout>
diff --git a/app/src/main/res/layout/activity_menu.xml b/app/src/main/res/layout/activity_menu.xml
index e938845..3c0950a 100644
--- a/app/src/main/res/layout/activity_menu.xml
+++ b/app/src/main/res/layout/activity_menu.xml
@@ -1,69 +1,88 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@color/light_blue2"
-    android:orientation="vertical">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_margin="20dp"
-        android:background="@drawable/corner_bg_white"
-        android:orientation="vertical">
-
-        <TextView
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="10dp"
-            android:gravity="center"
-            android:text="管理界面"
-            android:textColor="@color/light_blue2"
-            android:textSize="45sp" />
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_marginLeft="10dp"
-            android:orientation="vertical"
-            android:padding="10dp">
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_revenue" />
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_transdtl_upload" />
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_link_check" />
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_auth" />
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_syspara_query" />
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_manage" />
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_shop_password_set" />
-
-            <TextView
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_consume_mode" />
-
-            <TextView
-                android:id="@+id/tv_reverse"
-                style="@style/menu_item_text_style"
-                android:text="@string/consume_menu_reverse" />
-        </LinearLayout>
-    </LinearLayout>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/light_blue2"
+        android:orientation="vertical">
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_margin="20dp"
+            android:background="@drawable/corner_bg_white"
+            android:orientation="vertical">
+
+        <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:gravity="center"
+                android:text="管理界面"
+                android:textColor="@color/light_blue2"
+                android:textSize="45sp" />
+
+        <LinearLayout
+                android:id="@+id/ll_operate"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:orientation="vertical"
+                android:padding="10dp"
+                android:visibility="gone">
+
+            <TextView
+                    android:id="@+id/tv_operate_hint"
+                    style="@style/menu_item_text_style" />
+
+            <TextView
+                    android:id="@+id/tv_operate_result"
+                    style="@style/menu_item_text_style" />
+        </LinearLayout>
+
+        <LinearLayout
+                android:id="@+id/ll_menu"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_marginLeft="10dp"
+                android:orientation="vertical"
+                android:padding="10dp">
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_revenue" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_transdtl_upload" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_link_check" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_auth" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_syspara_query" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_manage" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_shop_password_set" />
+
+            <TextView
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_consume_mode" />
+
+            <TextView
+                    android:id="@+id/tv_reverse"
+                    style="@style/menu_item_text_style"
+                    android:text="@string/consume_menu_reverse" />
+        </LinearLayout>
+    </LinearLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_purchase.xml b/app/src/main/res/layout/dialog_purchase.xml
index bb9a98a..1deb797 100644
--- a/app/src/main/res/layout/dialog_purchase.xml
+++ b/app/src/main/res/layout/dialog_purchase.xml
@@ -1,53 +1,64 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              android:layout_width="450dp"
-              android:layout_height="300dp"
-              android:background="@color/light_blue2"
-              android:layout_gravity="center"
-              android:orientation="vertical">
-    <RelativeLayout android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:layout_gravity="center"
-                    android:layout_margin="10dp"
-                    android:background="@drawable/corner_bg_white"
-                    android:gravity="center_horizontal"
-                    android:orientation="vertical">
-        <!--倒计时-->
-        <TextView
-                android:id="@+id/tv_close_count"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginLeft="15dp"
-                android:layout_marginTop="10dp"
-                android:gravity="start|center"
-                android:text="30s"
-                android:textColor="@color/blue"
-                android:textSize="30sp"/>
-        <LinearLayout
-                style="@style/purchase_ll_text_style"
-                android:layout_below="@+id/tv_close_count">
-
-            <TextView
-                    android:id="@+id/tv_pay_hint"
-                    style="@style/purchase_tv_text_hint_style"
-                    android:text="消费成功"
-                    android:textColor="@color/light_green"/>
-            <TextView
-                    android:id="@+id/tv_pay_username"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="姓名:  张三"
-                    android:textColor="@color/blue"
-                    android:textSize="@dimen/ordinary_consume_text_size"/>
-            <TextView
-                    android:id="@+id/tv_pay_amount"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="10dp"
-                    android:text="金额:  10.00元"
-                    android:textColor="@color/blue"
-                    android:textSize="@dimen/ordinary_consume_text_size"/>
-
-        </LinearLayout>
-    </RelativeLayout>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="450dp"
+        android:layout_height="300dp"
+        android:layout_gravity="center"
+        android:background="@color/light_blue2"
+        android:orientation="vertical">
+
+    <com.synodata.scanview.view.Preview
+            android:id="@+id/sy_preview"
+            android:layout_width="1dp"
+            android:layout_height="1dp"
+            android:visibility="gone" />
+
+    <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_gravity="center"
+            android:layout_margin="10dp"
+            android:background="@drawable/corner_bg_white"
+            android:gravity="center_horizontal"
+            android:orientation="vertical">
+        <!--倒计时-->
+        <TextView
+                android:id="@+id/tv_close_count"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="15dp"
+                android:layout_marginTop="10dp"
+                android:gravity="start|center"
+                android:text="60s"
+                android:textColor="@color/blue"
+                android:textSize="30sp" />
+
+        <LinearLayout
+                style="@style/purchase_ll_text_style"
+                android:layout_below="@+id/tv_close_count">
+
+            <TextView
+                    android:id="@+id/tv_pay_hint"
+                    style="@style/purchase_tv_text_hint_style"
+                    android:text="消费成功"
+                    android:textColor="@color/light_green" />
+
+            <TextView
+                    android:id="@+id/tv_pay_username"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="姓名:  张三"
+                    android:textColor="@color/blue"
+                    android:textSize="@dimen/ordinary_consume_text_size" />
+
+            <TextView
+                    android:id="@+id/tv_pay_amount"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="10dp"
+                    android:text="金额:  10.00元"
+                    android:textColor="@color/blue"
+                    android:textSize="@dimen/ordinary_consume_text_size" />
+
+        </LinearLayout>
+    </RelativeLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c26513d..5b1cfbc 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,136 +1,136 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">消费POS机</string>
-    <string name="title_activity_base">基类</string>
-    <string name="action_settings">设置</string>
-    <string name="title_activity_main">主界面</string>
-    <string name="title_activity_psam">操作psam卡</string>
-    <string name="title_activity_readcard">读卡</string>
-    <string name="title_activity_mode">模式</string>
-    <string name="title_activity_init">初始化</string>
-    <string name="title_activity_load">加载</string>
-    <string name="title_activity_comm">通讯</string>
-    <string name="title_activity_control">控制参数</string>
-    <string name="title_activity_consumecancel">消费撤销</string>
-    <string name="title_activity_library">图书缴费</string>
-    <string name="title_activity_recharge">在线充值</string>
-    <string name="cardlib_name">supwisdom.kscpucard</string>
-    <string name="connfail">连接失败</string>
-    <string name="msg_read_card_error">读卡错误</string>
-    <string name="msg_notsupport_card_oper">不支持卡操作</string>
-    <string name="msg_card_data_error">卡数据错误</string>
-    <string name="nfc_not_support">不支持NFC</string>
-    <string name="nfc_disabled">NFC未启动</string>
-    <string name="confirm_open_nfc">是否打开NFC</string>
-    <string name="action_exit">退出</string>
-    <string name="wait_msg">请刷卡</string>
-    <string name="menu_name_set">设置</string>
-    <string name="menu_name_purchase">消费</string>
-    <string name="title_activity_set">设置</string>
-    <string name="hello_world">hello</string>
-    <string name="devtimefmt">yyyyMMddHHmmss</string>
-    <string name="title_activity_transdtl">交易流水查询</string>
-    <string name="no_mf_files">\"无MF文件\"</string>
-    <string name="creat_mf_files">创建MF文件</string>
-    <string name="creat_mf_success">创建MF文件成功</string>
-    <string name="creat_mf_fail">创建MF文件失败</string>
-    <string name="mf_exist">MF退出</string>
-    <string name="error">错误</string>
-    <string name="reset_psam1_success">重设PSAM1成功</string>
-    <string name="reset_psam1_failed">重设psam1失败</string>
-    <string name="reset_psam2_success">重设psam2成功</string>
-    <string name="reset_psam2_failed">重设psam2失败</string>
-    <string name="get_random_number_failed">获取随机数失败</string>
-    <string name="reset_import1">初始化1失败</string>
-    <string name="reset_failed_cannot_get_random_number1">不能获取随机数1</string>
-    <string name="reset_import2">重设2失败</string>
-    <string name="reset_failed_cannot_get_random_number2">获取随机数2失败</string>
-    <string name="title_activity_show_day_consume">营业额查询</string>
-    <string name="title_activity_password">密码设置</string>
-    <string name="isPasswordCancel">isPassWordCancel</string>
-    <string name="consume_img">消费</string>
-    <string name="title_activity_auth">签到</string>
-    <string name="action_saoma">扫码</string>
-    <string name="scan_text">将二维码或条码放入框内完成扫描</string>
-    <string name="home_back">返回</string>
-    <string name="title_activity_consume">普通消费</string>
-    <string name="title_activity_qrcamera">扫码</string>
-    <string name="title_activity_splash">树维pos</string>
-    <string name="waiting_msg">正在识别，请稍后…</string>
-    <string name="username">姓 名</string>
-    <string name="userStuEmpNo">学工号</string>
-    <string name="userExpireDate">有效期</string>
-    <string name="userBalance">余 额</string>
-    <string name="consumeAmount">消费额(元)</string>
-    <string name="title_activity_consume_cancel">消费撤销</string>
-    <string name="title_activity_update_blacklist">更新黑名单</string>
-    <string name="title_activity_recover_factory">恢复出厂</string>
-    <string name="dialogTitle">提示</string>
-    <string name="all_home_words">主页</string>
-    <string name="all_back_words">返回</string>
-    <string name="title_activity_order_online">在线点餐</string>
-    <string name="title_activity_query_parameter_second">查询第二页</string>
-    <string name="devphyid">终端机编号</string>
-    <string name="samNo">SAM卡号</string>
-    <string name="softVerNo">软件版本号</string>
-    <string name="feerateVerNo">收费参数版本号</string>
-    <string name="sysparaVerNo">主参数版本号</string>
-    <string name="cardverno">黑名单参数版本号</string>
-    <string name="devseqno">POS当前流水号</string>
-    <string name="opentime">开机时间</string>
-    <string name="nextPage">下一页</string>
-    <string name="queryParameters">终端参数查询</string>
-    <string name="title_activity_change_mode">更改模式</string>
-    <string name="title_activity_enable">设备启用</string>
-    <string name="offline_words">脱机状态</string>
-    <string name="online_words">联机状态</string>
-    <string name="title_activity_set_server_info">设置通讯参数</string>
-    <string name="title_activity_test_touch">TestTouchActivity</string>
-    <string name="wait_put_card_words"><![CDATA[请刷卡 >>]]></string>
-    <string name="title_activity_hotel">酒店消费</string>
-    <string name="title_activity_manage">设备管理</string>
-    <string name="title_activity_revenue">营业额</string>
-    <string name="title_activity_pay">支付</string>
-    <string name="title_activity_modifypwd">修改密码</string>
-    <string name="title_activity_syspara">系统参数</string>
-    <string name="title_activity_department">部门限制</string>
-    <string name="title_activity_sddtl">SD卡流水</string>
-    <string name="title_activity_cardlib">卡库</string>
-    <string name="title_activity_upgrade">本地升级</string>
-    <!--消费菜单-->
-    <string name="consume_menu_revenue">1-营业额</string>
-    <string name="consume_menu_transdtl_upload">2-上传流水</string>
-    <string name="consume_menu_link_check">3-链路检测</string>
-    <string name="consume_menu_auth">4-手工签到</string>
-    <string name="consume_menu_syspara_query">5-参数查询</string>
-    <string name="consume_menu_manage">6-管理功能</string>
-    <string name="consume_menu_shop_password_set">7-商户密码</string>
-    <string name="consume_menu_consume_mode">8-消费模式</string>
-    <string name="consume_menu_reverse">9-手工冲正</string>
-    <!--消费维护菜单-->
-    <string name="consume_menu_shop_passwd">1-查看商户密码</string>
-    <string name="consume_menu_comm_set">2-通讯参数设置</string>
-    <string name="consume_menu_unconfirm_transdtl">3-查询未上传流水</string>
-    <string name="consume_menu_out_dtl">4-导出本地流水</string>
-    <string name="consume_menu_upgrade">5-软件在线升级</string>
-    <string name="consume_menu_app_exit">6-退出应用程序</string>
-    <string name="consume_menu_setting">7-进入设置界面</string>
-    <string name="consume_menu_clear_blklist">8-清空黑名单</string>
-    <string name="consume_menu_control_set">9-本地参数设置</string>
-    <!--充值菜单-->
-    <string name="deposit_menu_revenue">1-营业额查询</string>
-    <string name="deposit_menu_login_out">2-退出登录</string>
-    <string name="deposit_menu_reverse">3-手工冲正</string>
-    <string name="deposit_menu_param_query">4-参数查询</string>
-    <string name="deposit_menu_param_manage">5-设备管理</string>
-    <string name="deposit_menu_param_link">6-链路检测</string>
-    <!--充值维护菜单-->
-    <string name="deposit_manage_transdtl_clear">1-清空流水</string>
-    <string name="deposit_manage_comm_set">2-参数设置</string>
-    <string name="deposit_manage_upgrade">3-在线升级</string>
-    <string name="deposit_manage_app_exit">4-退出应用</string>
-    <string name="deposit_manage_setting">5-网络设置</string>
-    <!--充值参数-->
-    <string name="deposit_param_opername">操作员</string>
-</resources>
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <string name="app_name">消费POS机</string>
+    <string name="title_activity_base">基类</string>
+    <string name="action_settings">设置</string>
+    <string name="title_activity_main">主界面</string>
+    <string name="title_activity_psam">操作psam卡</string>
+    <string name="title_activity_readcard">读卡</string>
+    <string name="title_activity_mode">模式</string>
+    <string name="title_activity_init">初始化</string>
+    <string name="title_activity_load">加载</string>
+    <string name="title_activity_comm">通讯</string>
+    <string name="title_activity_control">控制参数</string>
+    <string name="title_activity_consumecancel">消费撤销</string>
+    <string name="title_activity_library">图书缴费</string>
+    <string name="title_activity_recharge">在线充值</string>
+    <string name="cardlib_name">supwisdom.kscpucard</string>
+    <string name="connfail">连接失败</string>
+    <string name="msg_read_card_error">读卡错误</string>
+    <string name="msg_notsupport_card_oper">不支持卡操作</string>
+    <string name="msg_card_data_error">卡数据错误</string>
+    <string name="nfc_not_support">不支持NFC</string>
+    <string name="nfc_disabled">NFC未启动</string>
+    <string name="confirm_open_nfc">是否打开NFC</string>
+    <string name="action_exit">退出</string>
+    <string name="wait_msg">请刷卡</string>
+    <string name="menu_name_set">设置</string>
+    <string name="menu_name_purchase">消费</string>
+    <string name="title_activity_set">设置</string>
+    <string name="hello_world">hello</string>
+    <string name="devtimefmt">yyyyMMddHHmmss</string>
+    <string name="title_activity_transdtl">交易流水查询</string>
+    <string name="no_mf_files">\"无MF文件\"</string>
+    <string name="creat_mf_files">创建MF文件</string>
+    <string name="creat_mf_success">创建MF文件成功</string>
+    <string name="creat_mf_fail">创建MF文件失败</string>
+    <string name="mf_exist">MF退出</string>
+    <string name="error">错误</string>
+    <string name="reset_psam1_success">重设PSAM1成功</string>
+    <string name="reset_psam1_failed">重设psam1失败</string>
+    <string name="reset_psam2_success">重设psam2成功</string>
+    <string name="reset_psam2_failed">重设psam2失败</string>
+    <string name="get_random_number_failed">获取随机数失败</string>
+    <string name="reset_import1">初始化1失败</string>
+    <string name="reset_failed_cannot_get_random_number1">不能获取随机数1</string>
+    <string name="reset_import2">重设2失败</string>
+    <string name="reset_failed_cannot_get_random_number2">获取随机数2失败</string>
+    <string name="title_activity_show_day_consume">营业额查询</string>
+    <string name="title_activity_password">密码设置</string>
+    <string name="isPasswordCancel">isPassWordCancel</string>
+    <string name="consume_img">消费</string>
+    <string name="title_activity_auth">签到</string>
+    <string name="action_saoma">扫码</string>
+    <string name="scan_text">将二维码或条码放入框内完成扫描</string>
+    <string name="home_back">返回</string>
+    <string name="title_activity_consume">普通消费</string>
+    <string name="title_activity_qrcamera">扫码</string>
+    <string name="title_activity_splash">树维pos</string>
+    <string name="waiting_msg">正在识别，请稍后…</string>
+    <string name="username">姓 名</string>
+    <string name="userStuEmpNo">学工号</string>
+    <string name="userExpireDate">有效期</string>
+    <string name="userBalance">余 额</string>
+    <string name="consumeAmount">消费额(元)</string>
+    <string name="title_activity_consume_cancel">消费撤销</string>
+    <string name="title_activity_update_blacklist">更新黑名单</string>
+    <string name="title_activity_recover_factory">恢复出厂</string>
+    <string name="dialogTitle">提示</string>
+    <string name="all_home_words">主页</string>
+    <string name="all_back_words">返回</string>
+    <string name="title_activity_order_online">在线点餐</string>
+    <string name="title_activity_query_parameter_second">查询第二页</string>
+    <string name="devphyid">终端机编号</string>
+    <string name="samNo">SAM卡号</string>
+    <string name="softVerNo">软件版本号</string>
+    <string name="feerateVerNo">收费参数版本号</string>
+    <string name="sysparaVerNo">主参数版本号</string>
+    <string name="cardverno">黑名单参数版本号</string>
+    <string name="devseqno">POS当前流水号</string>
+    <string name="opentime">开机时间</string>
+    <string name="nextPage">下一页</string>
+    <string name="queryParameters">终端参数查询</string>
+    <string name="title_activity_change_mode">更改模式</string>
+    <string name="title_activity_enable">设备启用</string>
+    <string name="offline_words">脱机状态</string>
+    <string name="online_words">联机状态</string>
+    <string name="title_activity_set_server_info">设置通讯参数</string>
+    <string name="title_activity_test_touch">TestTouchActivity</string>
+    <string name="wait_put_card_words"><![CDATA[请刷卡 >>]]></string>
+    <string name="title_activity_hotel">酒店消费</string>
+    <string name="title_activity_manage">设备管理</string>
+    <string name="title_activity_revenue">营业额</string>
+    <string name="title_activity_pay">支付</string>
+    <string name="title_activity_modifypwd">修改密码</string>
+    <string name="title_activity_syspara">系统参数</string>
+    <string name="title_activity_department">部门限制</string>
+    <string name="title_activity_sddtl">SD卡流水</string>
+    <string name="title_activity_cardlib">卡库</string>
+    <string name="title_activity_upgrade">本地升级</string>
+    <!--消费菜单-->
+    <string name="consume_menu_revenue">1-营业额</string>
+    <string name="consume_menu_transdtl_upload">2-上传流水</string>
+    <string name="consume_menu_link_check">3-链路检测</string>
+    <string name="consume_menu_auth">4-手工签到</string>
+    <string name="consume_menu_syspara_query">5-参数查询</string>
+    <string name="consume_menu_manage">6-管理功能</string>
+    <string name="consume_menu_shop_password_set">7-商户密码</string>
+    <string name="consume_menu_consume_mode">8-消费模式</string>
+    <string name="consume_menu_reverse">9-手工冲正</string>
+    <!--消费维护菜单-->
+    <string name="consume_menu_shop_passwd">1-查看商户密码</string>
+    <string name="consume_menu_comm_set">2-通讯参数设置</string>
+    <string name="consume_menu_unconfirm_transdtl">3-查询未上传流水</string>
+    <string name="consume_menu_syno_active">4-激活晟元算法</string>
+    <string name="consume_menu_upgrade">5-软件在线升级</string>
+    <string name="consume_menu_app_exit">6-退出应用程序</string>
+    <string name="consume_menu_setting">7-进入设置界面</string>
+    <string name="consume_menu_clear_blklist">8-清空黑名单</string>
+    <string name="consume_menu_control_set">9-本地参数设置</string>
+    <!--充值菜单-->
+    <string name="deposit_menu_revenue">1-营业额查询</string>
+    <string name="deposit_menu_login_out">2-退出登录</string>
+    <string name="deposit_menu_reverse">3-手工冲正</string>
+    <string name="deposit_menu_param_query">4-参数查询</string>
+    <string name="deposit_menu_param_manage">5-设备管理</string>
+    <string name="deposit_menu_param_link">6-链路检测</string>
+    <!--充值维护菜单-->
+    <string name="deposit_manage_transdtl_clear">1-清空流水</string>
+    <string name="deposit_manage_comm_set">2-参数设置</string>
+    <string name="deposit_manage_upgrade">3-在线升级</string>
+    <string name="deposit_manage_app_exit">4-退出应用</string>
+    <string name="deposit_manage_setting">5-网络设置</string>
+    <!--充值参数-->
+    <string name="deposit_param_opername">操作员</string>
+</resources>
diff --git a/keys-sign.jks b/keys-sign.jks
new file mode 100644
index 0000000..20b9f78
--- /dev/null
+++ b/keys-sign.jks
Binary files differ
