init
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