init
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