Merge tag '1.1.0' into develop

tag 1.1.0
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