diff --git a/app/src/main/java/com/supwisdom/activities/BaseActivity.kt b/app/src/main/java/com/supwisdom/activities/BaseActivity.kt
new file mode 100644
index 0000000..7f3f699
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/activities/BaseActivity.kt
@@ -0,0 +1,31 @@
+package com.supwisdom.activities
+
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import com.supwisdom.utils.AppExitUtil
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+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);
+        AppExitUtil.add(this)
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        AppExitUtil.remove(this)
+    }
+
+    override fun onResume() {
+        super.onResume()
+    }
+
+    fun <T> jumpActivity(cls: Class<T>) {
+        startActivity(Intent(applicationContext, cls))
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/SPApplication.kt b/app/src/main/java/com/supwisdom/activities/SPApplication.kt
index 06040ca..27cfbbc 100644
--- a/app/src/main/java/com/supwisdom/activities/SPApplication.kt
+++ b/app/src/main/java/com/supwisdom/activities/SPApplication.kt
@@ -1,13 +1,57 @@
 package com.supwisdom.activities
 
+import android.content.Context
+import android.content.Intent
+import android.support.multidex.MultiDex
 import android.support.multidex.MultiDexApplication
+import com.supwisdom.service.BackgroundTaskService
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.PublicDef
 
 /**
  ** create by zzq on 2019/7/23
  ** @desc
  **/
-class SPApplication: MultiDexApplication() {
+class SPApplication : MultiDexApplication() {
+    companion object {
+        @Volatile
+        private var mInstance: SPApplication? = null
+
+        fun getInstance(): SPApplication {
+            return mInstance!!
+        }
+    }
+
+    fun getPos(): Pos {
+        if (mPos == null) {
+            synchronized(SPApplication::class.java) {
+                if (mPos == null) {
+                    mPos = Pos(applicationContext)
+                }
+            }
+        }
+        return mPos
+    }
+
     override fun onCreate() {
         super.onCreate()
+        mInstance = this
+        startService()
+        CrashHandler.getInstance().init(applicationContext)
+    }
+
+    override fun attachBaseContext(base: Context) {
+        super.attachBaseContext(base)
+        MultiDex.install(this)
+    }
+
+    private fun startService() {
+        if (!CommonUtil.isServiceWork(this, PublicDef.BG_SERVICE_NAME)) {
+            startService(Intent(this, BackgroundTaskService::class.java))
+        }
+    }
+
+    fun stopService() {
+        stopService(Intent(this, BackgroundTaskService::class.java))
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/service/APIInterface.kt b/app/src/main/java/com/supwisdom/service/APIInterface.kt
new file mode 100644
index 0000000..8f31021
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/service/APIInterface.kt
@@ -0,0 +1,8 @@
+package com.supwisdom.service
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+interface APIInterface {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/service/AuthEpay.kt b/app/src/main/java/com/supwisdom/service/AuthEpay.kt
new file mode 100644
index 0000000..185c534
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/service/AuthEpay.kt
@@ -0,0 +1,11 @@
+package com.supwisdom.service
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+class AuthEpay {
+    fun login() {
+
+    }
+}
\ 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
new file mode 100644
index 0000000..27123cf
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/service/BackgroundTaskService.kt
@@ -0,0 +1,131 @@
+package com.supwisdom.service
+
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.utils.CommonUtil
+import com.supwisdom.utils.DateUtil
+import com.supwisdom.utils.FileUtil
+import com.supwisdom.utils.PublicDef
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+class BackgroundTaskService : Thread() {
+    private val pos = SPApplication.getInstance().()
+    private val websocketProcess = WebsocketProcess()
+    private var websocketHasRun = false
+    private var apiInterface: APIInterface? = null
+    private var sysRecord: SysParaRecord? = null
+    private var transdtlClearDate: String? = null
+
+    fun getWebsocketProcess(): WebsocketProcess {
+        return websocketProcess
+    }
+
+    override fun run() {
+        var heartgap: Long
+        while (true) {
+            //做一卡通心跳和流水上传
+            doYktHeartAndTransdtl()
+            //清除流水
+            clearTransdtl()
+            sysRecord = pos.getSysPara()
+            if (sysRecord != null && sysRecord!!.getSocketSwitch() != 0) {
+                if (!websocketHasRun) {
+                    websocketHasRun = true
+                    websocketProcess.start()
+                }
+            } else {
+                if (websocketHasRun) {
+                    websocketHasRun = false
+                    websocketProcess.stop()
+                }
+            }
+            if (sysRecord == null || sysRecord!!.getHeatBeat() < 10 || sysRecord!!.getHeatBeat() > 600) {
+                heartgap = 60
+            } else {
+                heartgap = sysRecord!!.getHeatBeat()
+            }
+            CommonUtil.doSleep(heartgap * 1000)
+        }
+    }
+
+    private fun doYktHeartAndTransdtl() {
+        //做一卡通的心跳以及流水上传
+        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()
+        }
+
+        uploadCrdDtl()
+        uploadOnlDtl()
+    }
+
+    private fun autoAuth() {
+//        val bean = AuthEpay().login()
+//        if (bean != null && bean!!.getRetcode() == PublicDef.SUCCESS) {
+//            SPApplication.getInstance().setLoginEpayLinking(true)
+//        } else {
+//            SPApplication.getInstance().setLoginEpayLinking(false)
+//        }
+    }
+
+    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)
+        if (date == transdtlClearDate) {
+            /*每天清除流水一次*/
+            return
+        }
+        pos.clearTransdtlCredit(date)
+        pos.clearTransdtlOnline(date)
+        pos.clearTransdtlBarcode(date)
+        pos.clearTransdtlBM1(date)
+        pos.clearTransdtlDps(date)
+
+        transdtlClearDate = date
+
+        /*删除15天前的日志*/
+        FileUtil.removeLogFile(15)
+        FileUtil.removeCrashFile(30)
+        FileUtil.removeDtlFile(3)
+    }
+}
\ 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
new file mode 100644
index 0000000..b438912
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
@@ -0,0 +1,8 @@
+package com.supwisdom.service
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+class EpayApiImpl : APIInterface {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/service/WebsocketProcess.kt b/app/src/main/java/com/supwisdom/service/WebsocketProcess.kt
new file mode 100644
index 0000000..fcad538
--- /dev/null
+++ b/app/src/main/java/com/supwisdom/service/WebsocketProcess.kt
@@ -0,0 +1,328 @@
+package com.supwisdom.service
+
+import android.os.Handler
+import android.os.Message
+import com.alibaba.fastjson.JSONObject
+import com.koushikdutta.async.callback.CompletedCallback
+import com.koushikdutta.async.future.Future
+import com.koushikdutta.async.http.AsyncHttpClient
+import com.koushikdutta.async.http.WebSocket
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.utils.PublicDef
+import java.util.*
+
+/**
+ ** create by zzq on 2019/7/23
+ ** @desc
+ **/
+class WebsocketProcess {
+    private val TAG = "WebsocketProcess"
+    private var handler: Handler? = null
+    private var pos: Pos
+    private var websocketService: WebsocketService
+    private var isExit: Boolean = false
+    private var qrcodeThread: Thread? = null
+    @Volatile
+    private var isConnected: Boolean = false
+    @Volatile
+    private var connectDoing: Boolean = false
+    private var webSocket: Future<WebSocket>? = null
+    private var reLinkCnt: Int = 0
+    private var clientID = ""
+    @Volatile
+    private var hasRecv: Boolean = false
+    private var pingFailCnt: Int = 0
+
+    fun WebsocketProcess(): ??? {
+        pos = SPApplication.getInstance().getPos()
+        websocketService = WebsocketService()
+    }
+
+    fun start() {
+        isExit = false
+        if (qrcodeThread == null) {
+            synchronized(WebsocketProcess::class.java) {
+                if (qrcodeThread == null) {
+                    qrcodeThread = Thread(websocketService)
+                    qrcodeThread!!.start()
+                }
+            }
+        }
+        clientID = SPApplication.getInstance().getPos().getConfigPara().getDevphyid()
+    }
+
+    fun setHandler(handler: Handler) {
+        this.handler = handler
+    }
+
+    fun stop() {
+        isExit = true
+        if (qrcodeThread != null) {
+            qrcodeThread!!.interrupt()
+        }
+        qrcodeThread = null
+    }
+
+    private inner class WebsocketService : Runnable {
+        override fun run() {
+            while (!isExit) {
+                CommonUtil.doSleep(1000)
+                if (!isConnected) {
+                    if (!connectDoing) {
+                        connectDoing = true
+                        createNewWebsocket()
+                    }
+                }
+                if (isConnected) {
+                    try {
+                        webSocket!!.get().ping(clientID)
+                    } catch (e: Exception) {
+                        e.printStackTrace()
+                        pingFailCnt++
+                    }
+
+                    if (hasRecv) {
+                        hasRecv = false
+                        pingFailCnt = 0
+                    } else {
+                        pingFailCnt++
+                        if (pingFailCnt > 10) {
+                            isConnected = false
+                            pingFailCnt = 0
+                        }
+                    }
+                }
+            }
+            if (webSocket != null) {
+                webSocket!!.cancel()
+            }
+        }
+    }
+
+    private fun getServerUrl(): String {
+        val sb = StringBuilder()
+        val url = YktSession.getInstance().getWebAPISession().getEpayurl()
+        val offset = url.lastIndexOf("/")
+        sb.append(url.substring(0, offset))
+            .append("/websocket/device_service")
+        return sb.toString()
+    }
+
+    private fun newWebsocket(url: String): Future<WebSocket> {
+        return AsyncHttpClient.getDefaultInstance().websocket(url, null,
+            AsyncHttpClient.WebSocketConnectCallback { ex, webSocket ->
+                if (ex != null) {
+                    //网络断开
+                    ex.printStackTrace()
+                    connectDoing = false
+                    isConnected = false
+                    return@WebSocketConnectCallback
+                }
+                reLinkCnt = 0
+                isConnected = true
+                connectDoing = false
+                val loginStr = getLoginString()
+                webSocket.send(loginStr)
+                webSocket.stringCallback = WebSocket.StringCallback { s ->
+                    if (!CommonUtil.isEmpty(s)) {
+                        try {
+                            val retBean = GsonUtil.GsonToBean(s, WebsocketRetBean::class.java)
+                            if (retBean.getRetcode() === PublicDef.SUCCESS) {
+                                if ("login" == retBean.getAction()) {
+                                    val retData = WebsocketLoginRetData()
+                                    val data = retBean.getData() as JSONObject
+                                    retData.setHost_time(data["host_time"] as String?)
+                                } else if ("qrpay_in_process" == retBean.getAction()) {
+                                    val retData = WebsockConsumeProcessRetBean()
+                                    val data = retBean.getData() as JSONObject
+                                    retData.setCustname(data["custname"] as String?)
+                                    retData.setStuempno(data["stuempno"] as String?)
+                                    retData.setClientid(data["clientid"] as String?)
+                                    retData.setDevphyid(data["devphyid"] as String?)
+                                    retData.setTransdatetime(data["transdatetime"] as String?)
+
+                                    sendMsg(PublicDef.MSG_CONSUME_PAYING, "扫码付款中...")
+                                    webSocket.send(
+                                        getQRProcessResp(
+                                            retBean.getAction(),
+                                            retBean.getRequestid(),
+                                            retData
+                                        )
+                                    )
+                                } else if ("qrpay_finish" == retBean.getAction()) {
+                                    val retData = WebsockConsumeFinishRetBean()
+                                    val data = retBean.getData() as JSONObject
+                                    retData.setCustname(data["custname"] as String?)
+                                    retData.setStuempno(data["stuempno"] as String?)
+                                    retData.setDevphyid(data["devphyid"] as String?)
+                                    retData.setRefno(data["refno"] as String?)
+                                    retData.setStatus(data["status"] as String?)
+                                    retData.setAmount(data["amount"] as Int?)
+                                    retData.setAvailbal(data["availbal"] as Int?)
+                                    retData.setTransdatetime(data["transdatetime"] as String?)
+
+                                    if ("succ" == retData.getStatus()) {
+                                        val info = UserCardInfo(PublicDef.SUCCESS, "付款成功")
+                                        info.setDatetime(retData.getTransdatetime())
+                                        info.setUsername(retData.getCustname())
+                                        info.setStuempno(retData.getStuempno())
+                                        info.setPayamt(retData.getAmount())
+                                        info.setAmount(retData.getAmount())
+                                        info.setBalance(retData.getAvailbal())
+                                        info.setShowtime(pos.getSysPara().getConsumeShowtime())
+                                        info.setFlag(PublicDef.TRANSFLAG_NORMAL_CONSUME or PublicDef.TRANSFLAG_WRITE_CARD_SUCCESS)
+                                        info.setConsumeType(PublicDef.CONSUME_TYPE_BAR)
+                                        SPApplication.getInstance().setLastInfo(info)
+                                        sendMsg(PublicDef.MSG_CONSUME_QR_SUC, info)
+
+                                        saveTransdtlOnline(info)
+                                    }
+                                    webSocket.send(
+                                        getQRSuccessResp(
+                                            retBean.getAction(),
+                                            retBean.getRequestid(),
+                                            retData
+                                        )
+                                    )
+                                }
+                            }
+                        } catch (e: Exception) {
+                            e.printStackTrace()
+                        }
+
+                    }
+                }
+                webSocket.closedCallback = CompletedCallback {
+                    //主动断网,关服务
+                    //                        isConnected = false;
+                    //                        connectDoing = false;
+                }
+                webSocket.endCallback = CompletedCallback {
+                    //主动断网,关服务
+                    //                        isConnected = false;
+                    //                        connectDoing = false;
+                }
+                webSocket.pongCallback = WebSocket.PongCallback { hasRecv = true }
+                webSocket.setPingCallback { hasRecv = true }
+            })
+    }
+
+    private fun doSleep() {
+        reLinkCnt *= 2
+        if (reLinkCnt < 2 || reLinkCnt > 128) {
+            reLinkCnt = 2
+        }
+        CommonUtil.doSleep(reLinkCnt * 1000)
+    }
+
+    private fun buildServerUrl(clientId: String): String {
+        val nowtime = CommonUtil.getNowDateTimeNoFormat()
+        val signdata = StringBuilder()
+        signdata.append(PublicDef.APP_ID).append(clientId).append(nowtime)
+        val sign = Encrypt.HMACSHA1(signdata.toString(), PublicDef.APP_SECRET)
+
+        val uri = StringBuilder()
+        uri.append("?local_time=").append(CommonUtil.getNowDateTimeNoFormat()).append("&appid=")
+            .append(PublicDef.APP_ID)
+            .append("&clientid=").append(clientId).append("&sign=").append(sign)
+        return getServerUrl() + uri.toString()
+    }
+
+    private fun tryCloseWebsocket(sc: Future<WebSocket>?) {
+        if (sc != null) {
+            if (sc.cancel()) {
+                LogUtil.d(
+                    TAG,
+                    clientID + " websocket cancel fail,exception=" + CommonUtil.getExceptionStack(sc.tryGetException())
+                )
+            } else {
+                LogUtil.d(TAG, "$clientID websocket cancel success")
+            }
+        }
+    }
+
+    private fun createNewWebsocket() {
+        doSleep()
+        tryCloseWebsocket(webSocket)
+        webSocket = newWebsocket(buildServerUrl(clientID))
+    }
+
+    private fun getQRProcessResp(action: String, requestid: String, retData: WebsockConsumeProcessRetBean): String {
+        val data = WebsockConsumeProcessRespBean.Content()
+        data.setDevphyid(retData.getDevphyid())
+        val resp = WebsockConsumeProcessRespBean()
+        resp.setRetcode(PublicDef.SUCCESS)
+        resp.setRetmsg("推流成功")
+        resp.setAction(action)
+        resp.setRequestid(requestid)
+        resp.setData(data)
+        return GsonUtil.GsonString(resp)
+    }
+
+    private fun getQRSuccessResp(action: String, requestid: String, retData: WebsockConsumeFinishRetBean): String {
+        val data = WebsockConsumeFinishRespBean.Content()
+        data.setDevphyid(retData.getDevphyid())
+        val resp = WebsockConsumeFinishRespBean()
+        resp.setRetcode(PublicDef.SUCCESS)
+        resp.setRetmsg("推流成功")
+        resp.setAction(action)
+        resp.setRequestid(requestid)
+        resp.setData(data)
+        return GsonUtil.GsonString(resp)
+    }
+
+    fun getLoginString(): String {
+        val data = WebsocketLoginDataReqBean()
+        data.setClientid(clientID)
+        data.setLocal_time(CommonUtil.getNowDateTimeNoFormat())
+
+        val req = WebsocketLoginReqBean()
+        req.setAction("login")
+        req.setNeedresp("true")
+        req.setRequestid(getRandom())
+        req.setData(data)
+        return GsonUtil.GsonString(req)
+    }
+
+    private fun getRandom(): String {
+        val rand = Random()
+        rand.setSeed(System.currentTimeMillis())
+        return String.format("%010d", rand.nextInt(999999999))
+    }
+
+    private fun saveTransdtlOnline(info: UserCardInfo): Boolean {
+        val record = TransdtlOnlineRecord()
+        var seqno = pos.getTransdtlOnlineSeqno()
+        if (seqno == 0) {
+            val ctlRecord = pos.getControlPara(PublicDef.CONTROL_TRANSDTLONL_SEQNO)
+            if (ctlRecord != null) {
+                seqno = Integer.valueOf(ctlRecord!!.getValue())
+            }
+        }
+        record.setDevseqno(seqno + 1)
+        record.setCustname(info.getUsername())
+        record.setStuempno(info.getStuempno())
+        record.setTransdate(info.getDatetime().substring(0, 8))
+        record.setTranstime(info.getDatetime().substring(8))
+        record.setDevphyid(pos.getConfigPara().getDevphyid())
+        record.setPayamt(info.getAmount())
+        record.setConsumetype(PublicDef.CONSUME_TYPE_BAR)
+        record.setFlag(PublicDef.TRANSFLAG_NORMAL_CONSUME or PublicDef.TRANSFLAG_WRITE_CARD_SUCCESS)
+        record.setUpflag(1)
+        return pos.saveTransdtlOnline(record)
+    }
+
+    private fun sendMsg(code: Int, o: Any) {
+        if (handler == null) {
+            return
+        }
+        try {
+            val msg = Message()
+            msg.what = code
+            msg.obj = o
+            handler!!.sendMessage(msg)
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
+    }
+}
\ 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 2f3e62b..e2b15c9 100644
--- a/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
+++ b/app/src/main/java/com/supwisdom/utils/CommonUtil.kt
@@ -4,6 +4,7 @@
 
 import android.annotation.SuppressLint
 import android.app.Activity
+import android.app.ActivityManager
 import android.content.Context
 import android.content.Intent
 import android.content.pm.PackageManager
@@ -52,19 +53,42 @@
     }
 
     /**
+     * 判断服务是否开启
+     *
+     * @param mContext
+     * @param serviceName
+     * @return
+     */
+    fun isServiceWork(mContext: Context, serviceName: String): Boolean {
+        val myAM = mContext
+            .getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
+        val myList = myAM.getRunningServices(40)
+        if (myList.size <= 0) {
+            return false
+        }
+        for (i in myList.indices) {
+            val mName = myList[i].service.className.toString()
+            if (mName == serviceName) {
+                return true
+            }
+        }
+        return false
+    }
+
+    /**
      * get App versionName
      *
      * @param context
      * @return
      */
     fun getVersionName(context: Context): String {
-        try {
+        return try {
             val packageManager = context.packageManager
             val packageInfo = packageManager.getPackageInfo(context.packageName, 0)
-            return packageInfo.versionName
+            packageInfo.versionName
         } catch (e: PackageManager.NameNotFoundException) {
             e.printStackTrace()
-            return "error:" + e.message
+            "error:" + e.message
         }
 
     }
diff --git a/app/src/main/java/com/supwisdom/utils/PublicDef.kt b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
index 372f8a7..c6c766c 100644
--- a/app/src/main/java/com/supwisdom/utils/PublicDef.kt
+++ b/app/src/main/java/com/supwisdom/utils/PublicDef.kt
@@ -23,137 +23,19 @@
     /*************************handler 状态码***********************/
     /*************************不能重复*****************************/
     /**
-     * @desc 刷卡消费
+     * 卡消费标志(1 byte)
      */
-    const val MSG_CARD_USER_INFO_CLEAR = 10
-    const val MSG_CARD_USER_INFO_SHOW = 11
-    const val MSG_CARD_READ_AGAIN = 12
-    const val MSG_CARD_PASSWORD_CHECK = 13
-    const val MSG_CARD_PAY_SUCCESS = 14
-    const val MSG_CARD_PAY_FAIL = 15
-    const val MSG_CARD_PAYING_HINT = 16
-    const val MSG_CARD_REVERSE_SUCCESS = 17
-    const val MSG_CARD_REVERSE_FAIL = 18
-    const val MSG_HOME_CLEAR = 19
-
-    const val MSG_QRCODE_PASSWORD_CHECK = 20
-    const val MSG_QRCODE_PAY_SUCCESS = 21
-    const val MSG_QRCODE_PAY_FAIL = 22
-    const val MSG_QRCODE_REVERSE_SUCCESS = 23
-    const val MSG_QRCODE_REVERSE_FAIL = 24
-    const val MSG_QRCODE_PAYING_HINT = 25
-
-    const val MSG_GOODS_UPDATE = 26
-    const val MSG_LINK_STATUS_UPDATE = 27
-    const val MSG_PHONE_BILL_UPDATE = 28
-
-    const val MSG_ORDER_HISTORY_SHOW = 29
-    const val MSG_ORDER_PHONE_SHOW = 30
-    const val MSG_ORDER_WEIGH_WEIGHT = 31
-
-    const val MSG_ORDINARY_REFRESH_LASTORDER = 32
-    const val MSG_NO_CARD_PAY_SUCCESS = 33
-    const val MSG_PRINT_ERROR = 34
-    const val MSG_PRINT = 35
-
-    const val MSG_TAKE_NOTIFY_SUC = 45
-    const val MSG_TAKE_NOTIFY_FAIL = 46
-    /**
-     * dialog 创建类型
-     */
-    const val DIALOG_TYPE_PHONE_BILL_HINT = 3 //在线订单提醒弹窗
-    const val DIALOG_TYPE_ORDERX_HISTORY_BILL = 4 //服务器点餐模式历史订单
-    const val DIALOG_TYPE_NSD_CONFIG = 5 //NSD 参数配置列表
-    /**
-     * 点餐界面显示模式
-     */
-    const val ORDER_VIEW_SHOW_PIC4 = 1 //2列
-    const val ORDER_VIEW_SHOW_PIC9 = 2 //3列
-    const val ORDER_VIEW_SHOW_PIC16 = 3//4列
-    const val ORDER_VIEW_SHOW_PIC20 = 4//5列
-    const val ORDER_VIEW_SHOW_PIC25 = 5//5列
-    const val ORDER_VIEW_SHOW_PIC30 = 6//5列
-    const val ORDER_VIEW_SHOW_SIMPLE35 = 7//5列
-    const val ORDER_VIEW_SHOW_SIMPLE40 = 8//5列
-    const val ORDER_VIEW_SHOW_SIMPLE45 = 9//5列
-    const val ORDER_VIEW_SHOW_SIMPLE50 = 10//5列
-    const val ORDER_VIEW_SHOW_SIMPLE55 = 11//5列
-    const val ORDER_VIEW_SHOW_SIMPLE60 = 12//5列
-    /**
-     *点餐界面可点单份菜品最大数量
-     */
-    const val SHOW_FOOD_ONCE_SOLD_MAXNUM = 9
-    /**
-     *点餐界面历史流水最大数量
-     */
-    const val SHOW_FOOD_CLIENT_HISTORY_MAXNUM = 15
-    const val SHOW_FOOD_WAITER_HISTORY_MAXNUM = 50
-    /**
-     * 点餐菜品对应菜品ID
-     */
-    const val Food_Zhcn_MiFan = "米饭"
-    const val Food_MiFan = "110200000014"
-    /**
-     * 菜品启用状态
-     */
-    const val FOOD_ENABLE = "A"
-    const val FOOD_DISABLE = "C"
-    /**
-     * 点餐背景图配色
-     */
-    const val COLOR_BG_0 = 0
-    const val COLOR_BG_1 = 1
-    const val COLOR_BG_2 = 2
-    const val COLOR_BG_3 = 3
-    const val COLOR_BG_4 = 4
-    const val COLOR_BG_5 = 5
-    const val COLOR_BG_6 = 6
-    const val COLOR_BG_7 = 7
-    const val COLOR_BG_8 = 8
-    const val COLOR_BG_9 = 9
-
-    /**
-     * 寻卡间隔
-     */
-    const val FIND_CARD_GAP = 200L
-
-
-    /**
-     * 包间点餐(ms)
-     */
-    const val ROOM_ANIMATION_BUTTON_GAP: Long = 600
-    /**
-     *反扫二维码间隔(ms)
-     */
-    const val ORDER_QRCODE_GAP: Long = 5000
-    /**
-     * 点餐模式
-     */
-    const val ORDER_MODE_CLIENT_POPULAR = "clientPopular" //用户大众模式
-    const val ORDER_MODE_WAITER_POPULAR = "waiterPopular" //服务员大众模式
-    const val ORDER_MODE_CALL_POPULAR = "callPopular" //叫号模式
-    const val ORDER_MODE_PRIVATE_ROOM = "privateRoom" //包间模式
-
-
-    /**
-     * 包间模式参数key
-     */
-    const val ARG_ROOM_ID = "roomId"
-    const val ARG_ROOM_NAME = "roomName"
-    const val ARG_ROOM_BILLNO = "roomBillno"
-
-    const val SYSPROP_NAVIBAR = "persist.sys.hidenavibar"
-
-    const val PRINT_FOOD_ALL = 0
-    const val PRINT_FOOD_HUN = 1
-    const val PRINT_FOOD_SU = 2
-    const val BG_SERVICE_NAME = "com.supwisdom.dcpos.service.BackgroundTaskService"
-
-
-    /**
-     * 人脸识别常量
-     */
-    const val KEY_EXTRA_BUNDLE = "key_extra_bundle"
-    const val KEY_EXTRA_AMT = "key_extra_amt"
-    const val KEY_BUNDLE_FACEDATA = "key_bundle_facedata"
+    /*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标识冲正(统一标识)
+    /*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 // 密码消费
 }
\ No newline at end of file
