diff --git a/app/src/main/java/com/supwisdom/activities/YktSession.kt b/app/src/main/java/com/supwisdom/activities/YktSession.kt
index 5975932..54d8dc7 100644
--- a/app/src/main/java/com/supwisdom/activities/YktSession.kt
+++ b/app/src/main/java/com/supwisdom/activities/YktSession.kt
@@ -51,10 +51,6 @@
         NetworkHandler.getInstance().setCommTime(commTime)
     }
 
-    fun getWebAPISession(): WebAPISession {
-        return mSession!!
-    }
-
     // post
     fun sendYktRequestPost(uri: String, signdata: String, params: WebParams): TransResp? {
         val timestamp = DateUtil.getNowDateTimeNoFormat()
diff --git a/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt b/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt
index c6119a2..fc520a8 100644
--- a/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/cardlib/CardlibActivity.kt
@@ -14,7 +14,6 @@
 import com.supwisdom.auxscreen.AuxScreenController
 import com.supwisdom.utils.AppExitUtil
 import com.supwisdom.utils.DateUtil
-import com.supwisdom.utils.PublicDef
 import com.supwisdom.view.BigProgressDialog
 
 /**
@@ -86,7 +85,6 @@
 
     override fun showInitCardlibResult(issuccess: Boolean, msg: String) {
         if (issuccess) {
-            pos.getControlPara(PublicDef.CONTROL_HAS_REGISTER) ?: jumpActivity(InitActivity::class.java)
             val record = pos.getConfigPara()
             if (record != null && record.initOK) {
                 jumpActivity(LoadActivity::class.java)
diff --git a/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt b/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
index 4534f7e..9bf22b9 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/mode/CardPayService.kt
@@ -237,12 +237,12 @@
             onlRecord = TransdtlOnlineRecord()
             var seqno = pos.getTransdtlOnlineMaxSeqno()
             if (seqno == 0) {
-                seqno = pos.getControlPara(PublicDef.CONTROL_TRANSDTLONL_SEQNO)?.paraval?.toInt() ?: 0
+                seqno = pos.getDynamicPara()?.onlineseqno ?: 0
             }
             onlRecord.devphyid = pos.getConfigPara()!!.devphyid
             onlRecord.transdate = cardBean.datetime!!.substring(0, 8)
             onlRecord.transtime = cardBean.datetime!!.substring(8)
-            onlRecord.devseqno = seqno
+            onlRecord.devseqno = seqno + 1
             onlRecord.cardno = cardBean.cardNo
             onlRecord.cardphyid = cardBean.cardphyid
             onlRecord.payamt = cardBean.amount
@@ -282,7 +282,7 @@
             val ctlRecord = pos.getControlPara(PublicDef.CONTROL_OFFLINE_DAY_DISABLE)
             if (ctlRecord == null || ctlRecord.paraval != "1") {
                 val offdate = DateUtil.getDayDateNoFormatBefore(sysRecord.maxOfflineDays)
-                val validdate = pos.getDynamicPara()!!.lastauthtime?.substring(0, 8) ?: "00000000"
+                val validdate = pos.getDynamicPara()!!.jwtExpire?.substring(0, 8) ?: "00000000"
                 if (offdate > validdate) {
                     throw CardPayFailError("设备已脱机${sysRecord.maxOfflineDays}天")
                 }
@@ -302,12 +302,12 @@
             offRecord = TransdtlOfflineRecord()
             var seqno = pos.getTransdtlOfflineMaxSeqno()
             if (seqno == 0) {
-                seqno = pos.getControlPara(PublicDef.CONTROL_TRANSDTLOFF_SEQNO)?.paraval?.toInt() ?: 0
+                seqno = pos.getDynamicPara()?.onlineseqno ?: 0
             }
             offRecord.devphyid = pos.getConfigPara()!!.devphyid
             offRecord.transdate = cardBean.datetime!!.substring(0, 8)
             offRecord.transtime = cardBean.datetime!!.substring(8)
-            offRecord.devseqno = seqno
+            offRecord.devseqno = seqno + 1
             offRecord.cardno = cardBean.cardNo
             offRecord.cardphyid = cardBean.cardphyid
             offRecord.payamt = cardBean.amount
diff --git a/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt b/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt
index eee106f..452db49 100644
--- a/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/init/InitActivity.kt
@@ -66,7 +66,7 @@
             record.devphyid = "12345678"
             record.epayIP = "127.0.0.1"
             record.epayPort = 8080
-            record.epayUri = "epayapi"
+            record.epayUri = "restaurant"
         }
         record.initOK = false
         pos.replaceConfigPara(record)
diff --git a/app/src/main/java/com/supwisdom/activities/init/InitPresenter.kt b/app/src/main/java/com/supwisdom/activities/init/InitPresenter.kt
index 86dee25..13d527e 100644
--- a/app/src/main/java/com/supwisdom/activities/init/InitPresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/init/InitPresenter.kt
@@ -25,13 +25,18 @@
             iInitView.showSWToastInfo("终端机编号不能为空!", PublicDef.TOAST_SHOW_DOUBT)
             return
         }
-        record.devphyid = devphyid.replace(" ", "")
+        record.devphyid = devphyid
 
         if (TextUtils.isEmpty(serverip)) {
             iInitView.showSWToastInfo("服务器IP不能为空!", PublicDef.TOAST_SHOW_DOUBT)
             return
         }
-        record.epayIP = serverip.replace(" ", "")
+        record.epayIP = if (serverip.startsWith("http")) {
+            serverip
+        } else {
+            "http://$serverip"
+        }
+
         try {
             val tmpPort = Integer.valueOf(port)
             if (tmpPort > 65535) {
diff --git a/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt b/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
index b067352..03fc13b 100644
--- a/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
+++ b/app/src/main/java/com/supwisdom/activities/load/LoadPresenter.kt
@@ -52,7 +52,6 @@
 
         ThreadPool.getShortPool().execute(Runnable {
             sendMessage(LOAD_PROGRESS, "正在系统签到...")
-            val apiInterface = EpayApiImpl()
             val bean = AuthEpay().login()
             if (bean.retcode != PublicDef.SUCCESS) {
                 sendMessage(LOAD_DONE, bean.retmsg!!)
@@ -62,27 +61,25 @@
                     return@Runnable
                 }
             } else {
-                cfgRecord = pos.getConfigPara()
-                cfgRecord!!.deviceid = bean.deviceid
-                cfgRecord!!.merchaccno = bean.merchaccno
-                cfgRecord!!.shopname = bean.shopname
+                val dyRecord = pos.getDynamicPara()
+                dyRecord!!.deviceid = bean.deviceid
+                dyRecord.merchaccno = bean.merchaccno
+                dyRecord.shopname = bean.shopname
+                dyRecord.onlineseqno = bean.onlineseqno
+                dyRecord.offlineseqno = bean.offlineseqno
+                dyRecord.paragroupid = bean.paragroupid
                 pos.replaceConfigPara(cfgRecord!!)
 
-                // 保存流水号
-                if (!hasInit) {
-                    pos.replaceControlPara(PublicDef.CONTROL_TRANSDTLONL_SEQNO, bean.onlineseqno.toString())
-                    pos.replaceControlPara(PublicDef.CONTROL_TRANSDTLOFF_SEQNO, bean.offlineseqno.toString())
-                }
-
                 SPApplication.getInstance().setEpayLinking(true)
                 sendMessage(LOAD_DONE, "系统签到成功")
             }
 
             // 设置通讯参数
 //            YktSession.getInstance().setSessionKey(pos.getDynamicPara().getSessionKey())
+            val apiInterface = EpayApiImpl()
             try {
                 sendMessage(LOAD_PROGRESS, "加载系统参数...")
-                apiInterface.downloadSyspara( bean.paragroupid,bean.paraverno)
+                apiInterface.downloadSyspara(bean.paragroupid, bean.paraverno)
                 sendMessage(LOAD_DONE, "加载系统参数成功")
             } catch (ex: Exception) {
                 sendMessage(LOAD_DONE, "加载系统参数失败:${ex.message}")
@@ -107,8 +104,6 @@
             cfgRecord = pos.getConfigPara()
             cfgRecord!!.initOK = true
             pos.replaceConfigPara(cfgRecord!!)
-            pos.replaceControlPara(PublicDef.CONTROL_HAS_REGISTER, "1")
-
             sendMessage(LOAD_SUCCESS, "加载成功")
         })
     }
diff --git a/app/src/main/java/com/supwisdom/bean/AuthJwtRetBean.kt b/app/src/main/java/com/supwisdom/bean/AuthJwtRetBean.kt
new file mode 100644
index 0000000..0514140
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/bean/AuthJwtRetBean.kt
@@ -0,0 +1,10 @@
+package com.supwisdom.bean
+
+/**
+ ** create by zzq on 2019/7/29
+ ** @desc
+ **/
+class AuthJwtRetBean : BaseResp() {
+    var jwt: String? = null
+    var expiredAt: String? = null //过期时间 UTC格式
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/bean/AuthTokenRetBean.kt b/app/src/main/java/com/supwisdom/bean/AuthTokenRetBean.kt
new file mode 100644
index 0000000..440ad89
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/bean/AuthTokenRetBean.kt
@@ -0,0 +1,10 @@
+package com.supwisdom.bean
+
+/**
+ ** create by zzq on 2019/7/29
+ ** @desc
+ **/
+class AuthTokenRetBean : BaseResp() {
+    var token: String? = null
+    var timestamp: String? = null
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/ConfigParaRecord.kt b/app/src/main/java/com/supwisdom/entity/ConfigParaRecord.kt
index 3c344a7..4b536ac 100644
--- a/app/src/main/java/com/supwisdom/entity/ConfigParaRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/ConfigParaRecord.kt
@@ -6,9 +6,6 @@
  **/
 class ConfigParaRecord {
     var mode: Int = 0//
-    var deviceid: Int = 0 // 设备ID
-    var merchaccno: Int = 0//商户号
-    var shopname: String? = null//商户名
     var devphyid: String? = null
     var epayIP: String? = null
     var epayPort: Int = 0
diff --git a/app/src/main/java/com/supwisdom/entity/DynamicParaRecord.kt b/app/src/main/java/com/supwisdom/entity/DynamicParaRecord.kt
index d396060..bee1dbe 100644
--- a/app/src/main/java/com/supwisdom/entity/DynamicParaRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/DynamicParaRecord.kt
@@ -5,10 +5,17 @@
  ** @desc 后台动态参数
  **/
 class DynamicParaRecord {
+    var appid: String? = null
+    var appsecret: String? = null
+    var deviceid: Int = 0 // 设备ID
+    var merchaccno: Int = 0 //商户号
+    var shopname: String? = null //商户名
     var paraverno: Int = 0//参数版本
     var paragroupid: Int = 0//参数组id
+    var onlineseqno: Int = 0 //后台最大联机流水号
+    var offlineseqno: Int = 0 //后台最大离线流水号
     var cardverno: String? = null // 黑名单版本号 12byte
     var jwt: String? = null
     var token: String? = null
-    var lastauthtime: String? = null //最后一次认证时间 yyyyMMddhhmmss
+    var jwtExpire: String? = null //jwt有效期 yyyyMMddhhmmss
 }
\ 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 f55b2bb..7ce9650 100644
--- a/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
+++ b/app/src/main/java/com/supwisdom/okhttp/NetworkHandler.kt
@@ -35,6 +35,8 @@
     private val JSON = MediaType.parse("application/json; charset=utf-8")
     private val FORM_ENCODE = MediaType.parse("application/x-www-form-urlencoded;charset=utf-8")
     private var commTime = 2
+    private var clientId = "clientId"
+    private var jwt = "jwt"
 
     init {
         client = OkHttpClient()
@@ -73,6 +75,14 @@
         }
     }
 
+    fun setClientId(clientId: String) {
+        this.clientId = clientId
+    }
+
+    fun setJwt(jwt: String) {
+        this.jwt = jwt
+    }
+
     private class TrustAllCerts : X509TrustManager {
         @Throws(CertificateException::class)
         override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {
@@ -110,6 +120,8 @@
         val request = Request.Builder()
             .url(geturl(url, params))
             .addHeader("Accept", "application/json; q=0.5")
+            .addHeader("X-TENANT-ID", clientId)
+            .addHeader("Authorization", "Bearer $jwt")
             .addHeader("Connection", "close")
             .build()
         return getTransResp(request)
@@ -119,6 +131,8 @@
         val request = Request.Builder()
             .url(geturl(url, params))
             .addHeader("Accept", "application/json; q=0.5")
+            .addHeader("X-TENANT-ID", clientId)
+            .addHeader("Authorization", "Bearer $jwt")
             .addHeader("Connection", "close")
             .build()
         client!!.newCall(request).enqueue(object : Callback {
@@ -151,6 +165,8 @@
         val request = Request.Builder()
             .url(url)
             .addHeader("Accept", "application/json; q=0.5")
+            .addHeader("X-TENANT-ID", clientId)
+            .addHeader("Authorization", "Bearer $jwt")
             .addHeader("Connection", "close")
             .post(builder.build())
             .build()
@@ -165,6 +181,8 @@
         val request = Request.Builder()
             .url(url)
             .addHeader("Accept", "application/json; q=0.5")
+            .addHeader("X-TENANT-ID", clientId)
+            .addHeader("Authorization", "Bearer $jwt")
             .addHeader("Connection", "close")
             .post(builder.build())
             .build()
@@ -176,6 +194,8 @@
         val request = Request.Builder()
             .url(url)
             .addHeader("Accept", "application/json; q=0.5")
+            .addHeader("X-TENANT-ID", clientId)
+            .addHeader("Authorization", "Bearer $jwt")
             .addHeader("Connection", "close")
             .post(body)
             .build()
@@ -187,6 +207,8 @@
         val request = Request.Builder()
             .url(url)
             .addHeader("Accept", "application/json; q=0.5")
+            .addHeader("X-TENANT-ID", clientId)
+            .addHeader("Authorization", "Bearer $jwt")
             .addHeader("Connection", "close")
             .post(body)
             .build()
diff --git a/app/src/main/java/com/supwisdom/service/AuthEpay.kt b/app/src/main/java/com/supwisdom/service/AuthEpay.kt
index ebe4961..319c217 100644
--- a/app/src/main/java/com/supwisdom/service/AuthEpay.kt
+++ b/app/src/main/java/com/supwisdom/service/AuthEpay.kt
@@ -1,10 +1,15 @@
 package com.supwisdom.service
 
+import android.text.TextUtils
 import com.supwisdom.activities.SPApplication
 import com.supwisdom.activities.YktSession
+import com.supwisdom.bean.AuthJwtRetBean
 import com.supwisdom.bean.AuthRetBean
+import com.supwisdom.bean.AuthTokenRetBean
 import com.supwisdom.exception.AuthEpayError
+import com.supwisdom.okhttp.NetworkHandler
 import com.supwisdom.okhttp.WebParams
+import com.supwisdom.utils.CryptUtil
 import com.supwisdom.utils.DateUtil
 import com.supwisdom.utils.GsonUtil
 import com.supwisdom.utils.PublicDef
@@ -16,29 +21,99 @@
 class AuthEpay {
     private val pos = SPApplication.getInstance().getPos()
 
+    @Throws(AuthEpayError::class)
     fun login(): AuthRetBean {
-        return AuthRetBean(PublicDef.ERROR, "未实行")
+        val token = getAccessToken()
+        getAccessJwt(token)
+        return secureAuth()
     }
 
-    private fun getAccessToken() {
-
+    @Throws(AuthEpayError::class)
+    fun refresh() {
+        val record = pos.getConfigPara()
+        val url = StringBuilder()
+        url.append(record!!.epayIP).append(":").append(record.epayPort)
+            .append("/").append(record.epayUri)
+            .append("/api/auth/refresh/").append(record.devphyid)
+        val resp = NetworkHandler.getInstance().get(url.toString(), null)
+            ?: throw AuthEpayError("jwt刷新请求超时")
+        val retBean = GsonUtil.GsonToBean(resp.retjson!!, AuthJwtRetBean::class.java)
+        dealSession(retBean)
     }
 
-    private fun secureAuth() {
+    private fun getAccessToken(): String {
+        val record = pos.getConfigPara()
+        val url = StringBuilder()
+        url.append(record!!.epayIP).append(":").append(record.epayPort)
+            .append("/").append(record.epayUri)
+            .append("/api/auth/gettoken/").append(record.devphyid)
+
+        NetworkHandler.getInstance().setClientId(record.devphyid!!)
+
+        val resp = NetworkHandler.getInstance().get(url.toString(), null)
+            ?: throw AuthEpayError("token请求超时")
+        val retBean = GsonUtil.GsonToBean(resp.retjson!!, AuthTokenRetBean::class.java)
+        if (retBean.retcode != PublicDef.SUCCESS) {
+            throw AuthEpayError(retBean.retmsg!!)
+        }
+        if (TextUtils.isEmpty(retBean.token)) {
+            throw AuthEpayError("token不能为空")
+        }
+        return retBean.token!!
+    }
+
+    private fun getAccessJwt(token: String) {
+        val record = pos.getConfigPara()
+        val url = StringBuilder()
+        url.append(record!!.epayIP).append(":").append(record.epayPort)
+            .append("/").append(record.epayUri)
+            .append("/api/auth/authentication/").append(record.devphyid)
+
+        val secret = CryptUtil.HMACSHA256(token, pos.getDynamicPara()!!.appsecret!!)
+        val params = WebParams()
+        params.setParameter("appid", pos.getDynamicPara()!!.appid)
+            .setParameter("app_secret", secret)
+
+        val resp = NetworkHandler.getInstance().get(url.toString(), params)
+            ?: throw AuthEpayError("jwt请求超时")
+        val retBean = GsonUtil.GsonToBean(resp.retjson!!, AuthJwtRetBean::class.java)
+        dealSession(retBean)
+    }
+
+    private fun secureAuth(): AuthRetBean {
         val dyRecord = pos.getDynamicPara()
+        val cardverno = dyRecord!!.cardverno ?: "0"
         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)
+            .setParameter("paragroupid", dyRecord.paragroupid)
+            .setParameter("cardverno", cardverno)
 
-        val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/heartbeat", "", params)
+        val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/login", "", params)
             ?: throw AuthEpayError("请求超时")
         val retBean = GsonUtil.GsonToBean(resp.retjson!!, AuthRetBean::class.java)
         if (retBean.retcode != PublicDef.SUCCESS) {
             throw AuthEpayError(retBean.retmsg!!)
         }
+        return retBean
+    }
 
+    private fun dealSession(bean: AuthJwtRetBean) {
+        if (bean.retcode != PublicDef.SUCCESS) {
+            throw AuthEpayError(bean.retmsg!!)
+        }
+        if (TextUtils.isEmpty(bean.jwt)) {
+            throw AuthEpayError("jwt不能为空")
+        }
+        NetworkHandler.getInstance().setJwt(bean.jwt!!)
+
+        val dyRecord = pos.getDynamicPara()
+        dyRecord!!.jwt = bean.jwt
+        //TODO
+        dyRecord.jwtExpire = DateUtil.utcToLocal(bean.expiredAt!!)
+        if (!pos.replaceDynamicPara(dyRecord)) {
+            throw AuthEpayError("保存参数失败")
+        }
     }
 }
\ 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 45862db..473225e 100644
--- a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
+++ b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
@@ -54,6 +54,10 @@
                 throw SysParaError(ex.message ?: "null")
             }
         }
+        /**
+         * 时钟校准
+         */
+        NtpClient().startCalibrateTime(retBean.systime!!)
     }
 
     @Throws(HeartBeatError::class)
diff --git a/app/src/main/java/com/supwisdom/utils/CryptUtil.kt b/app/src/main/java/com/supwisdom/utils/CryptUtil.kt
index d1677e6..b3d7f97 100644
--- a/app/src/main/java/com/supwisdom/utils/CryptUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/CryptUtil.kt
@@ -49,6 +49,22 @@
         return null
     }
 
+    fun HMACSHA256(data: String, key: String): String? {
+        try {
+            val algorithm = "HmacSHA256"
+            val mac = Mac.getInstance(algorithm)
+            val spec = SecretKeySpec(key.toByteArray(), algorithm)
+            mac.init(spec)
+            val byteHMAC = mac.doFinal(data.toByteArray())
+            return byteHMAC.encodeHex()
+        } catch (e: InvalidKeyException) {
+            e.printStackTrace()
+        } catch (ignore: NoSuchAlgorithmException) {
+            ignore.printStackTrace()
+        }
+        return null
+    }
+
     private fun algorithm2(text: String?, algorithm: String, isUpperCase: Boolean): String? {
         if (text != null && text.isNotEmpty()) {
             try {
diff --git a/app/src/main/java/com/supwisdom/utils/DateUtil.kt b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
index f125399..a134bac 100644
--- a/app/src/main/java/com/supwisdom/utils/DateUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/DateUtil.kt
@@ -1,6 +1,7 @@
 package com.supwisdom.utils
 
 import java.text.ParseException
+import java.text.SimpleDateFormat
 import java.util.*
 
 /**
@@ -26,6 +27,8 @@
     private val FORMAT_yyyy_MM_dd = org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd")
     private val FORMAT_HH_mm_ss = org.apache.commons.lang3.time.FastDateFormat.getInstance("HH:mm:ss")
     private val FORMAT_HH_mm = org.apache.commons.lang3.time.FastDateFormat.getInstance("HH:mm")
+    private val FORMAT_UTC_yyyyMMddHHmmss =
+        org.apache.commons.lang3.time.FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")
 
     /**
      * @return yyyy-MM-dd HH:mm:ss
@@ -128,21 +131,37 @@
         return ""
     }
 
+    fun utcToLocal(utctime: String): String {
+        val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
+        sdf.timeZone = TimeZone.getTimeZone("TUC")
+        try {
+            val utcDate = sdf.parse(utctime)
+            sdf.timeZone = TimeZone.getDefault()
+            val localTime = sdf.format(utcDate.time)
+            val localDate = sdf.parse(localTime)
+            System.out.println("test")
+        } catch (ex: ParseException) {
+            ex.printStackTrace()
+        }
+        return ""
+    }
+
+
     /**
      * @param datetime yyyyMMddHHmmss
      * @return yy-MM-dd HH:mm:ss
      */
-    fun getNowDatetimeFromNoFormat2(datetime: String): String {
-        try {
-            return datetime.substring(2, 4) + "-" +
+    fun getNowDatetimeFromNoFormat2(datetime: String): String? {
+        return try {
+            datetime.substring(2, 4) + "-" +
                     datetime.substring(4, 6) + "-" +
                     datetime.substring(6, 8) + " " +
                     datetime.substring(8, 10) + ":" +
                     datetime.substring(10, 12) + ":" +
                     datetime.substring(12)
         } catch (ex: Exception) {
+            null
         }
-        return ""
     }
 
     /**
@@ -174,10 +193,10 @@
      * @return HH:mm:ss
      */
     fun getNowTimeWithArg(date: Date): String? {
-        try {
-            return FORMAT_HH_mm_ss.format(date)
+        return try {
+            FORMAT_HH_mm_ss.format(date)
         } catch (e: Exception) {
-            return null
+            null
         }
     }
 
@@ -185,28 +204,27 @@
      * @param time HHmm
      * @return HH:mm
      */
-    fun formatTime(time: String): String {
-        try {
+    fun formatTime(time: String): String? {
+        return try {
             val sb = StringBuilder()
             sb.append(time.substring(0, 2)).append(":")
                 .append(time.substring(2, 4))
-            return sb.toString()
+            sb.toString()
         } catch (e: Exception) {
-            e.printStackTrace()
+            null
         }
-        return ""
     }
 
     /**
      * @return MMdd
      */
     fun getDateMMdd(): String? {
-        try {
-            return FORMAT_MMdd.format(Date())
+        return try {
+            FORMAT_MMdd.format(Date())
         } catch (e: Exception) {
             e.printStackTrace()
+            null
         }
-        return null
     }
 
     /**
diff --git a/app/src/main/java/com/supwisdom/utils/PublicDef.kt b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
index d5fac32..ca1da56 100644
--- a/app/src/main/java/com/supwisdom/utils/PublicDef.kt
+++ b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
@@ -71,10 +71,7 @@
     /**
      * 本地全局控制参数
      */
-    const val CONTROL_TRANSDTLONL_SEQNO = "onlseqno"
-    const val CONTROL_TRANSDTLOFF_SEQNO = "offseqno"
     const val CONTROL_FIXAMT = "fixamt"
-    const val CONTROL_HAS_REGISTER = "hasregister"
     const val CONTROL_OFFLINE_DAY_DISABLE = "offdaydisable"
     const val CONTROL_DEBUG_ENABLE = "debugenable"
     /**
