diff --git a/app/src/main/java/com/supwisdom/activities/BaseActivity.kt b/app/src/main/java/com/supwisdom/activities/BaseActivity.kt
index 7f3f699..6183f9a 100644
--- a/app/src/main/java/com/supwisdom/activities/BaseActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/BaseActivity.kt
@@ -9,7 +9,7 @@
  ** create by zzq on 2019/7/23
  ** @desc
  **/
-class BaseActivity : Activity() {
+open class BaseActivity : Activity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         //getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
diff --git a/app/src/main/java/com/supwisdom/activities/SPApplication.kt b/app/src/main/java/com/supwisdom/activities/SPApplication.kt
index 27cfbbc..16adb48 100644
--- a/app/src/main/java/com/supwisdom/activities/SPApplication.kt
+++ b/app/src/main/java/com/supwisdom/activities/SPApplication.kt
@@ -4,6 +4,7 @@
 import android.content.Intent
 import android.support.multidex.MultiDex
 import android.support.multidex.MultiDexApplication
+import com.supwisdom.db.Pos
 import com.supwisdom.service.BackgroundTaskService
 import com.supwisdom.utils.CommonUtil
 import com.supwisdom.utils.PublicDef
@@ -13,6 +14,8 @@
  ** @desc
  **/
 class SPApplication : MultiDexApplication() {
+    private var mPos: Pos? = null
+
     companion object {
         @Volatile
         private var mInstance: SPApplication? = null
@@ -30,7 +33,7 @@
                 }
             }
         }
-        return mPos
+        return mPos!!
     }
 
     override fun onCreate() {
diff --git a/app/src/main/java/com/supwisdom/activities/YktSession.kt b/app/src/main/java/com/supwisdom/activities/YktSession.kt
new file mode 100644
index 0000000..5975932
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/YktSession.kt
@@ -0,0 +1,90 @@
+package com.supwisdom.activities
+
+import com.supwisdom.okhttp.NetworkHandler
+import com.supwisdom.okhttp.TransResp
+import com.supwisdom.okhttp.WebAPISession
+import com.supwisdom.okhttp.WebParams
+import com.supwisdom.utils.DateUtil
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class YktSession private constructor() {
+    companion object {
+        private var yktSession: YktSession? = null
+        private var mSession: WebAPISession? = null
+        /**
+         * Create YktSession instance
+         *
+         * @return YktSession object
+         */
+        @Synchronized
+        fun getInstance(): YktSession {
+            if (null == yktSession) {
+                synchronized(YktSession::class.java) {
+                    if (null == yktSession) {
+                        yktSession = YktSession()
+                    }
+                }
+            }
+            return yktSession!!
+        }
+    }
+
+    fun setSessionKey(sessionKey: String) {
+        mSession!!.setSessionKey(sessionKey)
+    }
+
+
+    // 设置通信参数
+    fun setWebAPISession(epayIP: String, epayPort: Int, uri: String, termid: String, commTime: Int) {
+        val sb = StringBuilder()
+        if (epayIP.startsWith("http")) {
+            sb.append(epayIP)
+        } else {
+            sb.append("http://").append(epayIP)
+        }
+        sb.append(":").append(epayPort).append("/").append(uri).append("/services")
+
+        mSession!!.setEpayurl(sb.toString())
+        NetworkHandler.getInstance().setCommTime(commTime)
+    }
+
+    fun getWebAPISession(): WebAPISession {
+        return mSession!!
+    }
+
+    // post
+    fun sendYktRequestPost(uri: String, signdata: String, params: WebParams): TransResp? {
+        val timestamp = DateUtil.getNowDateTimeNoFormat()
+        val temp = signdata.replace("null".toRegex(), "")
+        val mysign = calcSignForCardPay(temp, timestamp)
+        params.setParameter("sign", mysign)
+//            .setParameter("sign_method", PublicDef.signMethod)
+//            .setParameter("term_id", mSession.getTermId())
+//            .setParameter("app_id", mSession.getAppId())
+            .setParameter("timestamp", timestamp)
+        val url = mSession!!.getEpayurl() + uri
+        return NetworkHandler.getInstance().post(url, params)
+    }
+
+    fun sendYktRequestLongPost(uri: String, signdata: String, params: WebParams): TransResp? {
+        val timestamp = DateUtil.getNowDateTimeNoFormat()
+        val temp = signdata.replace("null".toRegex(), "")
+        val mysign = calcSignForCardPay(temp, timestamp)
+        params.setParameter("sign", mysign)
+//            .setParameter("sign_method", PublicDef.signMethod)
+//            .setParameter("term_id", mSession.getTermId())
+//            .setParameter("app_id", mSession.getAppId())
+            .setParameter("timestamp", timestamp)
+        val url = mSession!!.getEpayurl() + uri
+        return NetworkHandler.getInstance().longPost(url, params)
+    }
+
+    private fun calcSignForCardPay(extdata: String, nTimestamp: String): String {
+        val signData = extdata + nTimestamp + mSession!!.getSessionKey()
+//        val mySign = Encrypt.HMACSHA1(signData, mSession.getAppSecret())
+        return ""//mySign.toLowerCase()
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeAcvitity.kt b/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeAcvitity.kt
new file mode 100644
index 0000000..025873d
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/upgrade/UpgradeAcvitity.kt
@@ -0,0 +1,22 @@
+package com.supwisdom.activities.upgrade
+
+import android.os.Bundle
+import com.supwisdom.activities.BaseActivity
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class UpgradeAcvitity : BaseActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+
+    override fun onResume() {
+        super.onResume()
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
index 2280950..d4c1de4 100644
--- a/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
+++ b/app/src/main/java/com/supwisdom/db/BeanPropEnum.kt
@@ -7,25 +7,14 @@
 object BeanPropEnum {
     enum class Syspara {
         id,
-        limitSwitch,
         returnFlag,
         heatBeat,
         offlineFlag,
         maxOfflineDays,
-        maxPaycnt,
-        creditLowLimit,
-        minCardbal,
-        maxCardbal,
-        daySumLimitamt,
-        onceLimitamt,
-        password,
-        fixpayConsumeGap,
-        controlFlag,
+        mngpasswd,
+        fixpayGap,
         consumeShowtime,
         consumeFailShowtime,
-        qrOfflineEnable,
-        qrcodeUrl,
-        socketSwitch,
         commTime
     }
 
@@ -48,20 +37,9 @@
         id,
         paraverno,
         paragroupid,
-        feeverno,
-        feegroupid,
         cardverno,
-        codeverno,
-        schoolno,
-        deductlimitamt,
-        sessionKey,
-        mf1key,
-        mf1factor,
-        rootkey,
-        iv,
-        devkey,
-        appId,
-        appSecret
+        jwt,
+        token
     }
 
     enum class ControlPara {
@@ -69,4 +47,38 @@
         paraval
     }
 
+    enum class TransdtlOnline {
+        devphyid,
+        transdate,
+        transtime,
+        devseqno,
+        cardno,
+        cardphyid,
+        qrcode,
+        transtype,
+        payamt,
+        extraamt,
+        billno,
+        reversalflag,
+        reversalbillno,
+        status,
+        upflag
+    }
+
+    enum class TransdtlOffline {
+        devphyid,
+        transdate,
+        transtime,
+        devseqno,
+        cardno,
+        cardphyid,
+        payamt,
+        extraamt,
+        reversalflag,
+        reversalseqno,
+        reversaltransdate,
+        reversaltranstime,
+        status,
+        upflag
+    }
 }
\ 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 8dcc3dc..ff24314 100644
--- a/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBParaHelper.kt
@@ -18,6 +18,18 @@
         val TABLE_NAME_SYSPARA = "tb_syspara"
         val TABLE_NAME_DYNAMICPARA = "tb_dynamicpara"
         val TABLE_NAME_CONTROLPARA = "tb_controlpara"
+
+        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!!
+        }
     }
 
 
@@ -34,61 +46,25 @@
             + BeanPropEnum.DynamicPara.id + " long primary key, "
             + BeanPropEnum.DynamicPara.paraverno + " integer, "
             + BeanPropEnum.DynamicPara.paragroupid + " integer, "
-            + BeanPropEnum.DynamicPara.feeverno + " integer, "
-            + BeanPropEnum.DynamicPara.feegroupid + " integer, "
-            + BeanPropEnum.DynamicPara.cardverno + " char(12),"
-            + BeanPropEnum.DynamicPara.codeverno + " char(14),"
-            + BeanPropEnum.DynamicPara.schoolno + " varchar(16),"
-            + BeanPropEnum.DynamicPara.deductlimitamt + " integer,"
-            + BeanPropEnum.DynamicPara.sessionKey + " char(32),"
-            + BeanPropEnum.DynamicPara.mf1key + " char(16),"
-            + BeanPropEnum.DynamicPara.mf1factor + " char(16),"
-            + BeanPropEnum.DynamicPara.rootkey + " varchar(65),"
-            + BeanPropEnum.DynamicPara.iv + " char(32),"
-            + BeanPropEnum.DynamicPara.devkey + " char(16),"
-            + BeanPropEnum.DynamicPara.appId + " char(8),"
-            + BeanPropEnum.DynamicPara.appSecret + " char(32) )")
+            + BeanPropEnum.DynamicPara.cardverno + " char(14),"
+            + BeanPropEnum.DynamicPara.jwt + " varchar(254),"
+            + 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.limitSwitch + " integer, "
             + BeanPropEnum.Syspara.returnFlag + " integer, "
             + BeanPropEnum.Syspara.heatBeat + " integer, "
             + BeanPropEnum.Syspara.offlineFlag + " integer, "
             + BeanPropEnum.Syspara.maxOfflineDays + " integer, "
-            + BeanPropEnum.Syspara.maxPaycnt + " integer, "
-            + BeanPropEnum.Syspara.creditLowLimit + " integer, "
-            + BeanPropEnum.Syspara.minCardbal + " integer, "
-            + BeanPropEnum.Syspara.maxCardbal + " integer, "
-            + BeanPropEnum.Syspara.daySumLimitamt + " integer, "
-            + BeanPropEnum.Syspara.onceLimitamt + " integer, "
-            + BeanPropEnum.Syspara.password + " char(6), "
-            + BeanPropEnum.Syspara.fixpayConsumeGap + " integer, "
-            + BeanPropEnum.Syspara.controlFlag + " integer, "
+            + BeanPropEnum.Syspara.mngpasswd + " char(6), "
+            + BeanPropEnum.Syspara.fixpayGap + " integer, "
             + BeanPropEnum.Syspara.consumeShowtime + " integer, "
             + BeanPropEnum.Syspara.consumeFailShowtime + " integer, "
-            + BeanPropEnum.Syspara.qrOfflineEnable + " integer, "
-            + BeanPropEnum.Syspara.socketSwitch + " integer, "
-            + BeanPropEnum.Syspara.commTime + " integer, "
-            + BeanPropEnum.Syspara.qrcodeUrl + " varchar(128) )")
+            + BeanPropEnum.Syspara.commTime + " integer )")
     private val DROP_TABLE_NAME_SYSPARA = "DROP TABLE IF EXISTS $TABLE_NAME_SYSPARA"
 
-    @Volatile
-    private var instance: DBParaHelper? = null
     private val lock = ReentrantLock()
-
-    fun getInstance(context: Context): DBParaHelper {
-        if (null == instance) {
-            synchronized(DBParaHelper::class.java) {
-                if (null == instance) {
-                    instance = DBParaHelper(context)
-                }
-            }
-        }
-        return instance!!
-    }
-
     fun getLock(): Lock {
         return lock
     }
diff --git a/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt b/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
index da9587b..04f7f6e 100644
--- a/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
@@ -14,10 +14,11 @@
     companion object {
         private val DB_NAME = "db_transdtl"
         private val VERSION = 1
-        @Volatile
         private var instance: DBTransdtlHelper? = null
 
         val TABLE_NAME_CONFIGPARA = "tb_configpara"
+        val TABLE_NAME_DTL_ONLINE = "tb_dtl_online"
+        val TABLE_NAME_DTL_OFFLINE = "tb_dtl_offline"
 
         fun getInstance(context: Context): DBTransdtlHelper {
             if (null == instance) {
@@ -49,6 +50,39 @@
             + BeanPropEnum.ConfigPara.managePwd + " char(6),"
             + BeanPropEnum.ConfigPara.initOK + " integer ) ")
     private val DROP_TABLE_NAME_CONFIGPARA = "DROP TABLE IF EXISTS $TABLE_NAME_CONFIGPARA"
+    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.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 + " integer,"
+            + 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 {
@@ -57,6 +91,8 @@
 
     override fun onCreate(db: SQLiteDatabase) {
         db.execSQL(CREATE_TABLE_NAME_CONFIGPARA)
+        db.execSQL(CRAETE_TABLE_NAME_DTL_ONLINE)
+        db.execSQL(CRAETE_TABLE_NAME_DTL_OFFLINE)
     }
 
     override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
diff --git a/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt b/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt
new file mode 100644
index 0000000..f3b4e24
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/DynamicParaDao.kt
@@ -0,0 +1,103 @@
+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.paraverno = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.paraverno.toString()))
+        record.paragroupid = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.DynamicPara.paragroupid.toString()))
+        record.cardverno = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.cardverno.toString()))
+        record.jwt = cursor.getString(cursor.getColumnIndex(BeanPropEnum.DynamicPara.jwt.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.paraverno.toString(), record.paraverno)
+        values.put(BeanPropEnum.DynamicPara.paragroupid.toString(), record.paragroupid)
+        values.put(BeanPropEnum.DynamicPara.cardverno.toString(), record.cardverno)
+        values.put(BeanPropEnum.DynamicPara.jwt.toString(), record.jwt)
+        values.put(BeanPropEnum.DynamicPara.token.toString(), record.token)
+        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 0bbd00e..eff19ce 100644
--- a/app/src/main/java/com/supwisdom/db/Pos.kt
+++ b/app/src/main/java/com/supwisdom/db/Pos.kt
@@ -1,7 +1,7 @@
 package com.supwisdom.db
 
 import android.content.Context
-import com.supwisdom.entity.ConfigParaRecord
+import com.supwisdom.entity.*
 
 /**
  ** create by zzq on 2019/7/24
@@ -10,8 +10,14 @@
 class Pos constructor(context: Context) {
     private val context = context
     private val sdContext = SDContext(context)
-    private var configParaDao = ConfigParaDao(context)
-    private var configParaRecord: ConfigParaRecord? = null
+    private val configParaDao = ConfigParaDao(context)
+    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 transdtlOnlineDao = TransdtlOnlineDao(sdContext)
+    private val transdtlOfflineDao = TransdtlOfflineDao(sdContext)
 
     init {
     }
@@ -19,12 +25,11 @@
     /**
      * 设备参数
      */
-
     fun replaceConfigPara(record: ConfigParaRecord): Boolean {
         try {
             configParaDao.getLock().lock()
             if (configParaDao.replace(record)) {
-                configParaRecord = record
+                cfgRecord = record
                 return true
             }
         } finally {
@@ -34,14 +39,135 @@
     }
 
     fun getConfigPara(): ConfigParaRecord? {
-        if (configParaRecord == null) {
+        if (cfgRecord == null) {
             try {
                 configParaDao.getLock().lock()
-                configParaRecord = configParaDao.get()
+                cfgRecord = configParaDao.get()
             } finally {
                 configParaDao.getLock().unlock()
             }
         }
-        return configParaRecord
+        return cfgRecord
+    }
+
+    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 getTransdtlOnlineUnconfirm(): List<TransdtlOnlineRecord> {
+        try {
+            transdtlOnlineDao.getLock().lock()
+            return transdtlOnlineDao.getUnconfirm()
+        } finally {
+            transdtlOnlineDao.getLock().unlock()
+        }
+    }
+
+    fun saveTransdtlOnline(record: TransdtlOnlineRecord): Boolean {
+        try {
+            transdtlOnlineDao.getLock().lock()
+            return transdtlOnlineDao.save(record)
+        } 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 getTransdtlOfflineUnconfirm(): List<TransdtlOfflineRecord> {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            return transdtlOfflineDao.getUnconfirm()
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+    }
+    fun saveTransdtlOffline(record: TransdtlOfflineRecord): Boolean {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            return transdtlOfflineDao.save(record)
+        } 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()
+        }
     }
 }
\ 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
new file mode 100644
index 0000000..8d3b045
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/SysParaDao.kt
@@ -0,0 +1,112 @@
+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) {
+                db.setTransactionSuccessful()
+                return true
+            }
+        } finally {
+            db.endTransaction()
+        }
+        return false
+    }
+
+    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()))
+        record.offlineFlag = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.offlineFlag.toString()))
+        record.maxOfflineDays = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.maxOfflineDays.toString()))
+        record.mngPasswd = cursor.getString(cursor.getColumnIndex(BeanPropEnum.Syspara.mngpasswd.toString()))
+        record.fixpayGap = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.fixpayGap.toString()))
+        record.consumeShowtime = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.Syspara.consumeShowtime.toString()))
+        record.consumeFailShowtime =
+            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)
+        values.put(BeanPropEnum.Syspara.offlineFlag.toString(), record.offlineFlag)
+        values.put(BeanPropEnum.Syspara.maxOfflineDays.toString(), record.maxOfflineDays)
+        values.put(BeanPropEnum.Syspara.mngpasswd.toString(), record.mngPasswd)
+        values.put(BeanPropEnum.Syspara.fixpayGap.toString(), record.fixpayGap)
+        values.put(BeanPropEnum.Syspara.consumeShowtime.toString(), record.consumeShowtime)
+        values.put(BeanPropEnum.Syspara.consumeFailShowtime.toString(), record.consumeFailShowtime)
+        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
new file mode 100644
index 0000000..f3b3f6c
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
@@ -0,0 +1,148 @@
+package com.supwisdom.db
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+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 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 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.TransdtlOffline.upflag.toString() + "=?" + 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()))
+        val flag = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.reversalflag.toString()))
+        record.reversalflag = flag == 1
+        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()))
+        record.status = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOffline.status.toString()))
+        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)
+        if (record.reversalflag) {
+            values.put(BeanPropEnum.TransdtlOffline.reversalflag.toString(), 1)
+        } else {
+            values.put(BeanPropEnum.TransdtlOffline.reversalflag.toString(), 0)
+        }
+        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)
+        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
new file mode 100644
index 0000000..e4e7b55
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
@@ -0,0 +1,144 @@
+package com.supwisdom.db
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+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 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 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() + "=?" + 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.payamt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.payamt.toString()))
+        record.extraamt = cursor.getInt(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.extraamt.toString()))
+        record.reversalflag =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.reversalflag.toString()))
+        record.reversalbillno =
+            cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.reversalbillno.toString()))
+        record.status = cursor.getString(cursor.getColumnIndex(BeanPropEnum.TransdtlOnline.status.toString()))
+        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.reversalflag.toString(), record.reversalflag)
+        values.put(BeanPropEnum.TransdtlOnline.reversalbillno.toString(), record.reversalbillno)
+        values.put(BeanPropEnum.TransdtlOnline.status.toString(), record.status)
+        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/entity/DynamicParaRecord.kt b/app/src/main/java/com/supwisdom/entity/DynamicParaRecord.kt
new file mode 100644
index 0000000..bb2a939
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/entity/DynamicParaRecord.kt
@@ -0,0 +1,13 @@
+package com.supwisdom.entity
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class DynamicParaRecord {
+    var paraverno: Int = 0//参数版本
+    var paragroupid: Int = 0//参数组id
+    var cardverno: String? = null // 黑名单版本号 12byte
+    var jwt: String? = null
+    var token: String? = null
+}
\ 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
new file mode 100644
index 0000000..288567e
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/entity/SysParaRecord.kt
@@ -0,0 +1,20 @@
+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 offlineFlag: Int = 0 // 脱机消费时限开关  0-关闭， 1-开启
+    var maxOfflineDays: Int = 0// 最大脱机天数
+    var mngPasswd: String? = null// 维护密码
+    var consumeShowtime: Int = 0// 消费成功显示时间
+    var consumeFailShowtime: Int = 0 //消费失败显示时间
+    var commTime: Int = 0   //通讯超时时间 默认2s
+    /**
+     * 定额消费同卡消费间隔(s)
+     */
+    var fixpayGap: Int = 0
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
new file mode 100644
index 0000000..9018e4a
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
@@ -0,0 +1,23 @@
+package com.supwisdom.entity
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc 离线流水
+ **/
+class TransdtlOfflineRecord {
+    var devphyid: String? = null
+    var transdate: String? = null
+    var transtime: String? = null
+    var devseqno: Int = 0
+    var cardno: String? = null
+    var cardphyid: String? = null
+    var payamt: Int = 0
+    var extraamt: Int = 0
+    var managefeetype: String? = null // none,discount,mealer
+    var reversalflag = false
+    var reversalseqno: Int = 0 //被冲正流水号
+    var reversaltransdate: String? = null //被冲正流水日期
+    var reversaltranstime: String? = null  //被冲正流水时间
+    var status: String? = null // init,fail,suc
+    var upflag: Int = 0 // 1已上传
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
new file mode 100644
index 0000000..ba06561
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
@@ -0,0 +1,24 @@
+package com.supwisdom.entity
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc 联机流水
+ **/
+class TransdtlOnlineRecord {
+    var devphyid: String? = null
+    var transdate: String? = null
+    var transtime: String? = null
+    var devseqno: Int = 0
+    var cardno: String? = null
+    var cardphyid: String? = null
+    var qrcode: String? = null
+    var transtype: String? = null //card,code
+    var payamt: Int = 0
+    var extraamt: Int = 0
+    var managefeetype: String? = null // none,discount,mealer
+    var billno: String? = null
+    var reversalflag: String? = null //消费null 自动冲正auto 手动撤销 manual
+    var reversalbillno: String? = null //被冲正交易参考号
+    var status: String? = null // init,fail,suc
+    var upflag: Int = 0 // 1已上传
+}
\ 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 f91b0de..8a163cb 100644
--- a/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
+++ b/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
@@ -16,7 +16,20 @@
  **/
 @Suppress("DEPRECATION")
 class NetworkHandler private constructor() {
-    private var instance: NetworkHandler? = null
+    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 = MediaType.parse("application/json; charset=utf-8")
@@ -92,16 +105,6 @@
         return ssfFactory
     }
 
-    fun getInstance(): NetworkHandler {
-        if (instance == null) {
-            synchronized(NetworkHandler::class.java) {
-                if (instance == null) {
-                    instance = NetworkHandler()
-                }
-            }
-        }
-        return instance!!
-    }
 
     fun get(url: String, params: WebParams): TransResp? {
         val request = Request.Builder()
diff --git a/app/src/main/java/com/supwisdom/okhttp/WebParams.kt b/app/src/main/java/com/supwisdom/okhttp/WebParams.kt
index 04ac771..8a6beb7 100644
--- a/app/src/main/java/com/supwisdom/okhttp/WebParams.kt
+++ b/app/src/main/java/com/supwisdom/okhttp/WebParams.kt
@@ -8,19 +8,19 @@
  ** @desc
  **/
 class WebParams {
-    private val mParameters = hashMapOf<String, Any>()
+    private val mParameters = hashMapOf<String, Any?>()
 
-    fun setParameter(name: String, value: String): WebParams {
+    fun setParameter(name: String, value: String?): WebParams {
         mParameters[name] = value
         return this
     }
 
-    fun setParameter(name: String, value: Int): WebParams {
+    fun setParameter(name: String, value: Int?): WebParams {
         mParameters[name] = value
         return this
     }
 
-    fun setParameter(name: String, value: Float): WebParams {
+    fun setParameter(name: String, value: Float?): WebParams {
         mParameters[name] = value
         return this
     }
diff --git a/app/src/main/java/com/supwisdom/service/APIInterface.kt b/app/src/main/java/com/supwisdom/service/APIInterface.kt
index 8f31021..20330a5 100644
--- a/app/src/main/java/com/supwisdom/service/APIInterface.kt
+++ b/app/src/main/java/com/supwisdom/service/APIInterface.kt
@@ -1,8 +1,22 @@
 package com.supwisdom.service
 
+import com.supwisdom.entity.TransdtlOfflineRecord
+import com.supwisdom.entity.TransdtlOnlineRecord
+
 /**
  ** create by zzq on 2019/7/23
  ** @desc
  **/
 interface APIInterface {
+    fun heartBeat()
+
+    fun linkCheck()
+
+    fun downloadSyspara(paraverno: Int, paragroupid: Int)
+
+    fun downloadWhitelist(maxCardverno: String)
+
+    fun uploadTransdtl(record: TransdtlOnlineRecord)
+
+    fun uploadTransdtl(record: TransdtlOfflineRecord)
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/service/BackgroundTaskService.kt b/app/src/main/java/com/supwisdom/service/BackgroundTaskService.kt
index 27123cf..66e1930 100644
--- a/app/src/main/java/com/supwisdom/service/BackgroundTaskService.kt
+++ b/app/src/main/java/com/supwisdom/service/BackgroundTaskService.kt
@@ -1,6 +1,7 @@
 package com.supwisdom.service
 
 import com.supwisdom.activities.SPApplication
+import com.supwisdom.entity.SysParaRecord
 import com.supwisdom.utils.CommonUtil
 import com.supwisdom.utils.DateUtil
 import com.supwisdom.utils.FileUtil
@@ -11,7 +12,7 @@
  ** @desc
  **/
 class BackgroundTaskService : Thread() {
-    private val pos = SPApplication.getInstance().()
+    private val pos = SPApplication.getInstance().getPos()
     private val websocketProcess = WebsocketProcess()
     private var websocketHasRun = false
     private var apiInterface: APIInterface? = null
@@ -23,28 +24,28 @@
     }
 
     override fun run() {
-        var heartgap: Long
+        var heartgap = 0
         while (true) {
             //做一卡通心跳和流水上传
             doYktHeartAndTransdtl()
             //清除流水
             clearTransdtl()
             sysRecord = pos.getSysPara()
-            if (sysRecord != null && sysRecord!!.getSocketSwitch() != 0) {
-                if (!websocketHasRun) {
-                    websocketHasRun = true
-                    websocketProcess.start()
-                }
+//            if (sysRecord != null && sysRecord!!.getSocketSwitch() != 0) {
+//                if (!websocketHasRun) {
+//                    websocketHasRun = true
+//                    websocketProcess.start()
+//                }
+//            } else {
+//                if (websocketHasRun) {
+//                    websocketHasRun = false
+//                    websocketProcess.stop()
+//                }
+//            }
+            heartgap = if (sysRecord == null || sysRecord!!.heatBeat < 10 || sysRecord!!.heatBeat > 600) {
+                60
             } else {
-                if (websocketHasRun) {
-                    websocketHasRun = false
-                    websocketProcess.stop()
-                }
-            }
-            if (sysRecord == null || sysRecord!!.getHeatBeat() < 10 || sysRecord!!.getHeatBeat() > 600) {
-                heartgap = 60
-            } else {
-                heartgap = sysRecord!!.getHeatBeat()
+                sysRecord!!.heatBeat
             }
             CommonUtil.doSleep(heartgap * 1000)
         }
@@ -52,20 +53,25 @@
 
     private fun doYktHeartAndTransdtl() {
         //做一卡通的心跳以及流水上传
-        val resp = apiInterface!!.heartBeat()
-        if (resp.getRetcode() != PublicDef.SUCCESS) {
-            SPApplication.getInstance().setEpayLinking(false)
-            return
+//        val resp = apiInterface!!.heartBeat()
+//        if (resp.getRetcode() != PublicDef.SUCCESS) {
+//            SPApplication.getInstance().setEpayLinking(false)
+//            return
+//        }
+//        SPApplication.getInstance().setEpayLinking(true)
+//
+//        /*自动签到*/
+//        if (SPApplication.getInstance().getAuthStatus() > 2 && SPApplication.getInstance().getAuthStatus() < 5) {
+//            autoAuth()
+//        }
+        pos.getTransdtlOnlineUnconfirm().forEach {
+            apiInterface!!.uploadTransdtl(it)
+            it.upflag = 1
         }
-        SPApplication.getInstance().setEpayLinking(true)
-
-        /*自动签到*/
-        if (SPApplication.getInstance().getAuthStatus() > 2 && SPApplication.getInstance().getAuthStatus() < 5) {
-            autoAuth()
+        pos.getTransdtlOfflineUnconfirm().forEach {
+            apiInterface!!.uploadTransdtl(it)
+            it.upflag = 1
         }
-
-        uploadCrdDtl()
-        uploadOnlDtl()
     }
 
     private fun autoAuth() {
@@ -77,49 +83,14 @@
 //        }
     }
 
-    private fun uploadCrdDtl() {
-        val list = pos.getTransdtlCreditUnconfirm()
-        if (list != null) {
-            for (i in list!!.indices) {
-                val record = list!!.get(i)
-                if (record != null) {
-                    val resp = apiInterface!!.uploadTransdtl(record, false)
-                    if (resp.getRetcode() == PublicDef.SUCCESS) {
-                        pos.updateTransdtlCredit(record!!.getDevseqno(), 1)
-                    } else {
-                        break
-                    }
-                }
-            }
-        }
-    }
-
-    private fun uploadOnlDtl() {
-        val list = pos.getTransdtlReverse(null)
-        if (list != null) {
-            for (i in list!!.indices) {
-                val record = list!!.get(i)
-                val resp = apiInterface!!.uploadTransdtl(record)
-                if (resp.getRetcode() == PublicDef.SUCCESS) {
-                    pos.updateTransdtlReverse(record.getDevseqno(), 1)
-                } else {
-                    break
-                }
-            }
-        }
-    }
-
     private fun clearTransdtl() {
-        val date = DateUtil.getDayDateNoFormatBefore(35)
+        val date = DateUtil.getDayDateNoFormatBefore(100)
         if (date == transdtlClearDate) {
             /*每天清除流水一次*/
             return
         }
-        pos.clearTransdtlCredit(date)
         pos.clearTransdtlOnline(date)
-        pos.clearTransdtlBarcode(date)
-        pos.clearTransdtlBM1(date)
-        pos.clearTransdtlDps(date)
+        pos.clearTransdtlOffline(date)
 
         transdtlClearDate = date
 
diff --git a/app/src/main/java/com/supwisdom/service/ConsumeApi.kt b/app/src/main/java/com/supwisdom/service/ConsumeApi.kt
new file mode 100644
index 0000000..5b460fa
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/service/ConsumeApi.kt
@@ -0,0 +1,52 @@
+package com.supwisdom.service
+
+import com.supwisdom.activities.YktSession
+import com.supwisdom.entity.TransdtlOnlineRecord
+import com.supwisdom.okhttp.TransResp
+import com.supwisdom.okhttp.WebParams
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class ConsumeApi {
+    fun payInit(record: TransdtlOnlineRecord): TransResp? {
+//        val feetype = when {
+//            record.transflag and 0x60 == 0x40 -> "mealer"
+//            record.transflag and 0x60 == 0x20 -> "discount"
+//            else -> "none"
+//        }
+        val params = WebParams()
+        params.setParameter("cardno", record.cardno)
+            .setParameter("cardphyid", record.cardphyid)
+            .setParameter("qrcode", record.qrcode)
+            .setParameter("devphyid", record.devphyid)
+            .setParameter("termseqno", record.devseqno)
+            .setParameter("termdate", record.transdate)
+            .setParameter("termtime", record.transtime)
+            .setParameter("transtype", record.transtype)
+
+        return YktSession.getInstance().sendYktRequestPost("/api/pos/payinit", "", params)
+    }
+
+    fun payConfirm(record: TransdtlOnlineRecord): TransResp? {
+        val params = WebParams()
+        params.setParameter("devphyid", record.devphyid)
+            .setParameter("billno", record.billno)
+            .setParameter("amount", record.payamt)
+            .setParameter("termdate", record.transdate)
+            .setParameter("termtime", record.transtime)
+
+        return YktSession.getInstance().sendYktRequestPost("/api/pos/payconfirm", "", params)
+    }
+
+    fun payQuery(record: TransdtlOnlineRecord): TransResp? {
+        val params = WebParams()
+        params.setParameter("devphyid", record.devphyid)
+            .setParameter("billno", record.billno)
+            .setParameter("termdate", record.transdate)
+            .setParameter("termtime", record.transtime)
+
+        return YktSession.getInstance().sendYktRequestPost("/api/pos/payquery", "", params)
+    }
+}
\ 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 b438912..6a4d21f 100644
--- a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
+++ b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
@@ -1,8 +1,80 @@
 package com.supwisdom.service
 
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.YktSession
+import com.supwisdom.entity.TransdtlOfflineRecord
+import com.supwisdom.entity.TransdtlOnlineRecord
+import com.supwisdom.okhttp.WebParams
+import com.supwisdom.utils.DateUtil
+
 /**
  ** create by zzq on 2019/7/23
  ** @desc
  **/
 class EpayApiImpl : APIInterface {
+    private val pos = SPApplication.getInstance().getPos()
+    override fun heartBeat() {
+        val dyRecord = pos.getDynamicPara()
+        val params = WebParams()
+        params.setParameter("devphyid", pos.getConfigPara()!!.devphyid)
+            .setParameter("termdate", DateUtil.getNowDateNoFormat())
+            .setParameter("termtime", DateUtil.getNowTimeNoFormat())
+            .setParameter("paragroupid", dyRecord?.paragroupid)
+            .setParameter("cardverno", dyRecord?.cardverno)
+
+        val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/heartbeat", "", params)
+    }
+
+    override fun linkCheck() {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun downloadSyspara(paraverno: Int, paragroupid: Int) {
+        val dyRecord = pos.getDynamicPara()
+        val params = WebParams()
+        params.setParameter("devphyid", pos.getConfigPara()!!.devphyid)
+            .setParameter("termdate", DateUtil.getNowDateNoFormat())
+            .setParameter("termtime", DateUtil.getNowTimeNoFormat())
+            .setParameter("paragroupid", dyRecord?.paragroupid)
+
+        val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/systempara", "", params)
+    }
+
+    override fun downloadWhitelist(maxCardverno: String) {
+        val params = WebParams()
+        params.setParameter("devphyid", pos.getConfigPara()!!.devphyid)
+            .setParameter("cardverno", pos.getDynamicPara()!!.cardverno)
+            .setParameter("maxcount", 20)
+
+        val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/whitelist", "", params)
+    }
+
+    override fun uploadTransdtl(record: TransdtlOnlineRecord) {
+        val params = WebParams()
+        params.setParameter("devphyid", record.devphyid)
+            .setParameter("termseqno", record.devseqno)
+            .setParameter("maxcount", 20)
+
+        val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/paycancel", "", params)
+    }
+
+    override fun uploadTransdtl(record: TransdtlOfflineRecord) {
+        val params = WebParams()
+        params.setParameter("devphyid", record.devphyid)
+            .setParameter("termseqno", record.devseqno)
+            .setParameter("transdate", record.transdate)
+            .setParameter("transtime", record.transtime)
+            .setParameter("cardno", record.cardno)
+            .setParameter("cardphyid", record.cardphyid)
+            .setParameter("amount", record.payamt)
+            .setParameter("extraamt", record.extraamt)
+            .setParameter("managefeetype", record.managefeetype)
+            .setParameter("reversalflag", record.reversalflag.toString())
+            .setParameter("reversaltermseqno", record.reversalseqno)
+            .setParameter("reversaltransdate", record.reversaltransdate)
+            .setParameter("reversaltransdate", record.reversaltranstime)
+            .setParameter("status", record.status)
+
+        val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/offlinetransdtl", "", params)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/service/NtpClient.kt b/app/src/main/java/com/supwisdom/service/NtpClient.kt
new file mode 100644
index 0000000..2e4f3f0
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/service/NtpClient.kt
@@ -0,0 +1,120 @@
+package com.supwisdom.service
+
+import android.os.SystemClock
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.ThreadPool
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc
+ **/
+class NtpClient {
+    private val NTP_TIME_OUT_MILLISECOND = 10000
+    /**
+     * 国内ntp服务器地址集
+     */
+    private val ntpServerHost = arrayOf("cn.pool.ntp.org", "tw.pool.ntp.org")
+    private var privatelServerHost: String? = null
+
+    fun setPrivatelServerHost(privatelServerHost: String) {
+        this.privatelServerHost = privatelServerHost
+    }
+
+    private fun getTimeFromNtpServer(ntpHost: String?): Long {
+        val client = SntpClient()
+        val isSuccessful = client.requestTime(ntpHost!!, NTP_TIME_OUT_MILLISECOND)
+        return if (isSuccessful) {
+            client.getNtpTime()
+        } else {
+            -1
+        }
+    }
+
+    /**
+     * @param synctime yyyyMMddHHmmss
+     */
+    fun startCalibrateTime(synctime: String) {
+        val time = DateUtil.dateFormatConvertToLong(synctime)
+        startCalibrateTime(time)
+    }
+
+    /**
+     * @param synctime ms
+     */
+    fun startCalibrateTime(synctime: Long) {
+        val localTime = System.currentTimeMillis()
+        if (synctime > 0) {
+            if (synctime > localTime && synctime - localTime > 60000) {
+                setCurrentTimeMillis(synctime)
+            } else if (localTime > synctime && localTime - synctime > 60000) {
+                setCurrentTimeMillis(synctime)
+            }
+        }
+    }
+
+    /**
+     * 开始校准时间
+     */
+    fun startCalibrateTime() {
+        ThreadPool.getShortPool().execute(Runnable {
+            /**
+             * 优先使用专网ntp服务器地址
+             */
+            /**
+             * 优先使用专网ntp服务器地址
+             */
+            if (privatelServerHost != null) {
+                val time = getTimeFromNtpServer(privatelServerHost)
+                if (time > 0) {
+                    val isSetTimeSuccessful = setCurrentTimeMillis(time)
+                    if (isSetTimeSuccessful) {
+                        //                            LogUtil.d("set time successful");
+                        return@Runnable
+                    } else {
+                        //                            LogUtil.d("set time failure");
+                    }
+                }
+            }
+            for (itemHost in ntpServerHost) {
+                val time = getTimeFromNtpServer(itemHost)
+                if (time > 0) {
+                    val isSetTimeSuccessful = setCurrentTimeMillis(time)
+                    if (isSetTimeSuccessful) {
+                        return@Runnable
+                    } else {
+                        //                            LogUtil.d("set time failure");
+                    }
+                }
+            }
+        })
+    }
+
+    /**
+     * 设置当前的系统时间
+     *
+     * @param time
+     * @return true表示设置成功, false表示设置失败
+     */
+    //    private Boolean setCurrentTimeMillis(long time) {
+    //        try {
+    //            TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
+    //            String datetime = CommonUtil.getDatetimeStringByLong(time);
+    //            LogUtil.d("set time is: " + datetime);
+    //            Process process = Runtime.getRuntime().exec("su");
+    //            DataOutputStream os = new DataOutputStream(process.getOutputStream());
+    //            //os.writeBytes("setprop persist.sys.timezone GMT\n");
+    //            os.writeBytes("/system/bin/date -s " + datetime + "\n");
+    //            os.writeBytes("clock -w\n");
+    //            os.writeBytes("exit\n");
+    //            os.flush();
+    //            return true;
+    //        } catch (Exception ex) {
+    //            LogUtil.d("set time exception = " + CommonUtil.getExceptionStack(ex));
+    //            ex.printStackTrace();
+    //            return false;
+    //        }
+    //    }
+    private fun setCurrentTimeMillis(time: Long): Boolean {
+        return SystemClock.setCurrentTimeMillis(time)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/service/SntpClient.kt b/app/src/main/java/com/supwisdom/service/SntpClient.kt
new file mode 100644
index 0000000..d6e9ab9
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/service/SntpClient.kt
@@ -0,0 +1,202 @@
+package com.supwisdom.service
+
+import android.os.SystemClock
+import com.supwisdom.utils.unsignedToLong
+import java.net.DatagramPacket
+import java.net.DatagramSocket
+import java.net.InetAddress
+import kotlin.experimental.and
+
+/**
+ ** create by zzq on 2019/7/24
+ ** @desc 时钟同步
+ **/
+class SntpClient {
+    /**
+     * 从ntp服务器中获取时间
+     * @param ntpHost ntp服务器域名地址
+     * @return 如果失败返回-1，否则返回当前的毫秒数
+     */
+    private val REFERENCE_TIME_OFFSET = 16
+    private val ORIGINATE_TIME_OFFSET = 24
+    private val RECEIVE_TIME_OFFSET = 32
+    private val TRANSMIT_TIME_OFFSET = 40
+    private val NTP_PACKET_SIZE = 48
+
+    private val NTP_PORT = 123
+    private val NTP_MODE_CLIENT = 3
+    private val NTP_VERSION = 3
+
+    // Number of seconds between Jan 1, 1900 and Jan 1, 1970
+    // 70 years plus 17 leap days
+    private val OFFSET_1900_TO_1970: Long = ((365L * 70L) + 17L) * 24L * 60L * 60L
+
+    // system time computed from NTP server response
+    private var mNtpTime: Long = 0
+
+    // value of SystemClock.elapsedRealtime() corresponding to mNtpTime
+    private var mNtpTimeReference: Long = 0
+
+    // round trip time in milliseconds
+    private var mRoundTripTime: Long = 0
+
+    /**
+     * Sends an SNTP request to the given host and processes the response.
+     *
+     * @param host    host name of the server.
+     * @param timeout network timeout in milliseconds.
+     * @return true if the transaction was successful.
+     */
+    fun requestTime(host: String, timeout: Int): Boolean {
+        var socket: DatagramSocket? = null
+        try {
+            socket = DatagramSocket()
+            socket.soTimeout = timeout
+            val address: InetAddress = InetAddress.getByName(host)
+            val buffer = ByteArray(NTP_PACKET_SIZE)
+            val request = DatagramPacket(buffer, buffer.size, address, NTP_PORT)
+
+            // set mode = 3 (client) and version = 3
+            // mode is in low 3 bits of first byte
+            // version is in bits 3-5 of first byte
+//            buffer[0] = NTP_MODE_CLIENT or (NTP_VERSION << 3)
+            buffer[0] = (NTP_MODE_CLIENT or (NTP_VERSION shl 3)).toByte()
+
+
+            // get current time and write it to the request packet
+            val requestTime = System.currentTimeMillis()
+            val requestTicks = SystemClock.elapsedRealtime()
+            writeTimeStamp(buffer, TRANSMIT_TIME_OFFSET, requestTime)
+
+            socket.send(request)
+
+            // read the response
+            val response = DatagramPacket(buffer, buffer.size)
+            socket.receive(response)
+            val responseTicks = SystemClock.elapsedRealtime()
+            val responseTime = requestTime + (responseTicks - requestTicks)
+
+            // extract the results
+            val originateTime = readTimeStamp(buffer, ORIGINATE_TIME_OFFSET)
+            val receiveTime = readTimeStamp(buffer, RECEIVE_TIME_OFFSET)
+            val transmitTime = readTimeStamp(buffer, TRANSMIT_TIME_OFFSET)
+            val roundTripTime = responseTicks - requestTicks - (transmitTime - receiveTime)
+            // receiveTime = originateTime + transit + skew
+            // responseTime = transmitTime + transit - skew
+            // clockOffset = ((receiveTime - originateTime) + (transmitTime - responseTime))/2
+            //             = ((originateTime + transit + skew - originateTime) +
+            //                (transmitTime - (transmitTime + transit - skew)))/2
+            //             = ((transit + skew) + (transmitTime - transmitTime - transit + skew))/2
+            //             = (transit + skew - transit + skew)/2
+            //             = (2 * skew)/2 = skew
+            val clockOffset = ((receiveTime - originateTime) + (transmitTime - responseTime)) / 2
+            // save our results - use the times on this side of the network latency
+            // (response rather than request time)
+            mNtpTime = responseTime + clockOffset
+            mNtpTimeReference = responseTicks
+            mRoundTripTime = roundTripTime
+        } catch (ex: Exception) {
+            ex.printStackTrace()
+            return false
+        } finally {
+            socket?.close()
+        }
+        return true
+    }
+
+    /**
+     * Returns the time computed from the NTP transaction.
+     *
+     * @return time value computed from NTP server response.
+     */
+    fun getNtpTime(): Long {
+        return mNtpTime
+    }
+
+    /**
+     * Returns the reference clock value (value of SystemClock.elapsedRealtime())
+     * corresponding to the NTP time.
+     *
+     * @return reference clock corresponding to the NTP time.
+     */
+    fun getNtpTimeReference(): Long {
+        return mNtpTimeReference
+    }
+
+    /**
+     * Returns the round trip time of the NTP transaction
+     *
+     * @return round trip time in milliseconds.
+     */
+    fun getRoundTripTime(): Long {
+        return mRoundTripTime
+    }
+
+    /**
+     * Reads an unsigned 32 bit big endian number from the given offset in the buffer.
+     */
+    private fun read32(buffer: ByteArray, offset: Int): Long {
+        val b0 = buffer[offset]
+        val b1 = buffer[offset + 1]
+        val b2 = buffer[offset + 2]
+        val b3 = buffer[offset + 3]
+        // convert signed bytes to unsigned values
+        var i0 = b0.unsignedToLong()
+        if (b0 and 0x80.toByte() == 0x80.toByte()) {
+            i0 = ((b0 and 0x7F.toByte()) + 0x80.toByte()).toByte().unsignedToLong()
+        }
+        var i1 = b1.unsignedToLong()
+        if (b1 and 0x80.toByte() == 0x80.toByte()) {
+            i1 = ((b1 and 0x7F.toByte()) + 0x80.toByte()).toByte().unsignedToLong()
+        }
+        var i2 = b2.unsignedToLong()
+        if (b2 and 0x80.toByte() == 0x80.toByte()) {
+            i2 = ((b2 and 0x7F.toByte()) + 0x80.toByte()).toByte().unsignedToLong()
+        }
+        var i3 = b3.unsignedToLong()
+        if (b3 and 0x80.toByte() == 0x80.toByte()) {
+            i3 = ((b3 and 0x7F.toByte()) + 0x80.toByte()).toByte().unsignedToLong()
+        }
+//        val i0 = (b0 and 0x80.toByte()) == 0x80 ? (b0 & 0x7F)+0x80 : b0)
+//        val i1 = ((b1 & 0x80) == 0x80 ? (b1 & 0x7F)+0x80 : b1)
+//        val i2 = ((b2 & 0x80) == 0x80 ? (b2 & 0x7F)+0x80 : b2)
+//        val i3 = ((b3 & 0x80) == 0x80 ? (b3 & 0x7F)+0x80 : b3)
+
+        return (i0 shl 24) + (i1 shl 16) + (i2 shl 8) + i3
+    }
+
+    /**
+     * Reads the NTP time stamp at the given offset in the buffer and returns
+     * it as a system time (milliseconds since January 1, 1970).
+     */
+    private fun readTimeStamp(buffer: ByteArray, offset: Int): Long {
+        val seconds = read32(buffer, offset)
+        val fraction = read32(buffer, offset + 4)
+        return ((seconds - OFFSET_1900_TO_1970) * 1000) + ((fraction * 1000L) / 0x100000000L)
+    }
+
+    /**
+     * Writes system time (milliseconds since January 1, 1970) as an NTP time stamp
+     * at the given offset in the buffer.
+     */
+    private fun writeTimeStamp(buffer: ByteArray, offset: Int, time: Long) {
+        var tmpOffset = offset
+        var seconds = time / 1000L
+        val milliseconds = time - seconds * 1000L
+        seconds += OFFSET_1900_TO_1970
+
+        // write seconds in big endian format
+        buffer[tmpOffset++] = (seconds shr 24).toByte()
+        buffer[tmpOffset++] = (seconds shr 16).toByte()
+        buffer[tmpOffset++] = (seconds shr 8).toByte()
+        buffer[tmpOffset++] = (seconds shr 0).toByte()
+
+        val fraction = milliseconds * 0x100000000L / 1000L
+        // write fraction in big endian format
+        buffer[tmpOffset++] = (fraction shr 24).toByte()
+        buffer[tmpOffset++] = (fraction shr 16).toByte()
+        buffer[tmpOffset++] = (fraction shr 8).toByte()
+        // low order bits should be random data
+        buffer[tmpOffset] = (Math.random() * 255.0).toByte()
+    }
+}
\ 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 b0e3aeb..aaeac12 100644
--- a/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
@@ -24,9 +24,9 @@
  * @desc  公共类
  */
 object CommonUtil {
-    fun doSleep(ms: Long) {
+    fun doSleep(ms: Int) {
         try {
-            Thread.sleep(ms)
+            Thread.sleep(ms.toLong())
         } catch (e: InterruptedException) {
             e.printStackTrace()
         }
diff --git a/app/src/main/java/com/supwisdom/utils/DateUtil.kt b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
index 8354b4a..786fee3 100644
--- a/app/src/main/java/com/supwisdom/utils/DateUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
@@ -326,10 +326,10 @@
      * @desc 将日期格式的字符串转换为长整型
      */
     fun dateFormatConvertToLong(datetime: String): Long {
-        try {
-            return FORMAT_yyyyMMddHHmmss.parse(datetime).time
+        return try {
+            FORMAT_yyyyMMddHHmmss.parse(datetime).time
         } catch (ex: ParseException) {
-            return 0L
+            0L
         }
     }
 
@@ -361,10 +361,10 @@
      * @desc 将日期格式的字符串转换为长整型
      */
     fun dateFormatConvertToDate(datetime: String): Date? {
-        try {
-            return FORMAT_yyyy_MM_dd_HH_mm_ss.parse(datetime)
+        return try {
+            FORMAT_yyyy_MM_dd_HH_mm_ss.parse(datetime)
         } catch (ex: ParseException) {
-            return null
+            null
         }
     }
 
@@ -385,15 +385,15 @@
      * @return yyyyMMdd
      */
     fun getSpecifiedDayBefore(specifiedDay: String): String {
-        try {
+        return try {
             val c = Calendar.getInstance()
             val date = FORMAT_yyyyMMdd.parse(specifiedDay)
             c.time = date
             val day = c.get(Calendar.DATE)
             c.set(Calendar.DATE, day - 1)
-            return FORMAT_yyyyMMdd.format(c.time)
+            FORMAT_yyyyMMdd.format(c.time)
         } catch (e: ParseException) {
-            return ""
+            ""
         }
     }
 
@@ -416,15 +416,15 @@
      * @return yyyyMMdd
      */
     fun getSpecifiedDayAfter(specifiedDay: String): String {
-        try {
+        return try {
             val c = Calendar.getInstance()
             val date = FORMAT_yyyyMMdd.parse(specifiedDay)
             c.time = date
             val day = c.get(Calendar.DATE)
             c.set(Calendar.DATE, day + 1)
-            return FORMAT_yyyyMMdd.format(c.time)
+            FORMAT_yyyyMMdd.format(c.time)
         } catch (e: ParseException) {
-            return ""
+            ""
         }
     }
 
@@ -435,15 +435,15 @@
      * @return yyyy-MM-dd
      */
     fun getSpecifiedDayAfter1(specifiedDay: String): String {
-        try {
+        return try {
             val c = Calendar.getInstance()
             val date = FORMAT_yyyy_MM_dd.parse(specifiedDay)
             c.time = date
             val day = c.get(Calendar.DATE)
             c.set(Calendar.DATE, day + 1)
-            return FORMAT_yyyy_MM_dd.format(c.time)
+            FORMAT_yyyy_MM_dd.format(c.time)
         } catch (e: ParseException) {
-            return ""
+            ""
         }
     }
 
diff --git a/app/src/main/java/com/supwisdom/utils/PublicDef.kt b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
index c6c766c..b860920 100644
--- a/app/src/main/java/com/supwisdom/utils/PublicDef.kt
+++ b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
@@ -26,16 +26,18 @@
      * 卡消费标志(1 byte)
      */
     /*high 4 bit*/
-    val TRANSFLAG_NORMAL_CONSUME = 0x80 // 正常消费
-    val TRANSFLAG_MEALER_CONSUME = 0xC0 // 搭伙
-    val TRANSFLAG_DISCNT_CONSUME = 0xA0 // 折扣
-    val TRANSFLAG_REVS_ML_CONSUME = 0x40 //冲正带搭伙
-    val TRANSFLAG_REVS_DST_CONSUME = 0x20 // 冲正带折扣
-    val TRANSFLAG_REVERSE_AUTO_CONSUME = 0x10 // 自动撤销 (0x00 手动冲正)
-    val TRANSFLAG_REVERSE_CONSUME = 0x00 //&0x80 最高位0标识冲正(统一标识)
+    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*/
-    val TRANSFLAG_WRITE_CARD_SUCCESS = 0x01 // 写卡成功
-    val TRANSFLAG_WRITE_CARD_HALFAWAY = 0x02 // 中途拔卡
-    val TRANSFLAG_UNWRITE_CARD = 0x03 // 未写卡
-    val TRANSFLAG_PWD_CONSUME = 0x04 // 密码消费
+    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"
 }
\ No newline at end of file
