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/checkShoppwd/CheckShoppwdActivity.kt b/app/src/main/java/com/supwisdom/activities/checkShoppwd/CheckShoppwdActivity.kt
index 5b12e29..746c06c 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,160 @@
-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.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)
+
+            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/load/LoadPresenter.kt b/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
index 823c8ca..95f6739 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.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
+                }
+            }
+            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..f0f972b 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,177 @@
-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 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
+                    presenter!!.doSynoActive()
+                }
+                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_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)
+            )
+        )
+    }
+
+    private fun showShopPassword() {
+        AuxScreenController.getInstance()
+            .refreshContent(Arrays.asList<String>("商户密码:", pos.getConfigPara()!!.shopPwd))
+    }
+
+    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..bab3996 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,133 @@
-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
+        }
+        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!!)
+            }
+        }
+    }
 }
\ 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..6c0b764 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.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 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/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..e82f9d8 100644
--- a/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
@@ -1,87 +1,81 @@
-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 = 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 + " 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 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)")
+
+    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) {
+        }
+    }
 }
\ 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..f293c0f 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
@@ -1,226 +1,246 @@
-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
+            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..f745fc1 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
@@ -1,126 +1,131 @@
-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()
+                        + "' 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
+    }
 }
\ 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/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..b9034b1
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/service/SynoCodeService.kt
@@ -0,0 +1,296 @@
+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) {
+            val retBean =
+                GsonUtil.GsonToBean(resp.retjson!!, EpaySynoLicenseUploadRetBean::class.java)
+            return BaseResp(PublicDef.ERROR, retBean.message)
+        }
+        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..7ccc434 100644
--- a/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
@@ -1,287 +1,315 @@
-@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.product.firmware") as String
+        } catch (ex: 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/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 aa442a0..c616cf3 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 {
@@ -104,7 +201,7 @@
 
         vUsername.visibility = View.GONE
         show()
-        asyncOpenDecoder()
+        cameraOpenScan()
         resetCounter(waitTime)
     }
 
@@ -179,54 +276,13 @@
         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 > 180000
-            ) {
-                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
@@ -234,7 +290,7 @@
     private fun resetCounter(times: Int) {
         counter?.cancel()
         counter = ConsumeHintCount((times * 1000).toLong(), 500)
-        counter?.start()
+        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_manage.xml b/app/src/main/res/layout/activity_manage.xml
index 7537388..6b979d6 100644
--- a/app/src/main/res/layout/activity_manage.xml
+++ b/app/src/main/res/layout/activity_manage.xml
@@ -1,54 +1,54 @@
-<?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: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/dialog_purchase.xml b/app/src/main/res/layout/dialog_purchase.xml
index bb9a98a..fc8ef91 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_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>
 </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
