diff --git a/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt b/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt
index 989ef92..4485976 100644
--- a/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt
+++ b/app/src/main/java/com/supwisdom/activities/consume/mode/CodePayService.kt
@@ -1,222 +1,236 @@
-package com.supwisdom.activities.consume.mode
-
-import android.os.Handler
-import android.os.Message
-import com.supwisdom.activities.SPApplication
-import com.supwisdom.activities.consume.bean.CardPayConfirmRetBean
-import com.supwisdom.activities.consume.bean.CardPayInitRetBean
-import com.supwisdom.activities.consume.bean.CardUserInfoBean
-import com.supwisdom.activities.consume.bean.LastPayBean
-import com.supwisdom.entity.PayStatus
-import com.supwisdom.entity.ReversalFlag
-import com.supwisdom.entity.TransdtlOnlineRecord
-import com.supwisdom.exception.CardPayFailError
-import com.supwisdom.okhttp.TransResp
-import com.supwisdom.utils.*
-import org.apache.http.HttpStatus
-
-/**
- ** create by zzq on 2019/7/30
- ** @desc 二维码消费
- **/
-class CodePayService constructor(private val handler: Handler) {
-    private val TAG = "CodePayService"
-    private val pos = SPApplication.getInstance().getPos()
-    private lateinit var codeRecord: TransdtlOnlineRecord
-    private val consumeApi = ConsumeApi()
-    /**
-     * 消费过程中可按键主动取消
-     * 手动取消后不冲正,以手机消费结果为准
-     */
-    @Volatile
-    private var interruptedPay: Boolean = false
-    @Volatile
-    private var amount = 0
-    var isFixMode = false
-    private val lastPayBean = LastPayBean()
-
-    fun interruptPay() {
-        interruptedPay = true
-    }
-
-    fun pay(code: String, amount: Int) {
-        this.amount = amount
-        interruptedPay = false
-        try {
-            if (isFixMode) {
-                if (lastPayBean.code == code) {
-                    val gap = (pos.getSysPara()?.fixpayGap ?: 10).toLong()
-                    if (System.currentTimeMillis() - lastPayBean.suctime < gap * 1000) {
-                        throw CardPayFailError("${gap}s内不能连续消费")
-                    }
-                }
-            }
-            initTransdtlOnline(code, amount)
-            var resp = consumeApi.payInit(codeRecord)
-            parseInitResult(resp)
-            resp = consumeApi.payConfirm(codeRecord)
-            var result = parseConfirmResult(resp)
-            if (!result) {
-                result = payResultQuery()
-            }
-            updateTransdtlOnline(result)
-            if (result) {
-                showSucInfo()
-            }
-        } catch (ex: CardPayFailError) {
-            sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo(ex.message))
-        }
-    }
-
-    private fun payResultQuery(): Boolean {
-        sendMsg(PublicDef.MSG_PAYING_QUERY, "谨慎操作查询取消")
-        LogUtil.d(TAG, "扫码消费确认超时,进行查询操作:billno=${codeRecord.billno}")
-        sleepWithCancel(1500)
-        var searchCnt = 1
-        while (!interruptedPay) {
-            sendMsg(PublicDef.MSG_CARD_PAYING, String.format("正在%d次查询...", searchCnt))
-            val resp = consumeApi.payQuery(codeRecord)
-            if (resp != null) {
-                val result = parseConfirmResult(resp)
-                if (!result) {
-                    searchCnt++
-                    sendMsg(PublicDef.MSG_CARD_PAYING, String.format("等待%d次查询...", searchCnt))
-                    sleepWithCancel(5000)
-                    continue
-                }
-                return result
-            } else {
-                searchCnt++
-                sendMsg(PublicDef.MSG_CARD_PAYING, String.format("等待%d次查询...", searchCnt))
-                sleepWithCancel(3000)
-            }
-        }
-        LogUtil.d(TAG, "扫码消费确认超时,操作员手工取消查询:billno=${codeRecord.billno}")
-        return false
-    }
-
-    private fun parseConfirmResult(resp: TransResp?): Boolean {
-        if (resp == null) {
-            SPApplication.getInstance().setEpayLinking(false)
-            return false
-        }
-        if (resp.retcode != HttpStatus.SC_OK) {
-            throw CardPayFailError("错误码=${resp.retcode}")
-        }
-        val retBean = try {
-            GsonUtil.GsonToBean(resp.retjson!!, CardPayConfirmRetBean::class.java)
-        } catch (ex: Exception) {
-            throw CardPayFailError("json异常:${ex.message}")
-        }
-        if (retBean.retcode != PublicDef.SUCCESS) {
-            throw CardPayFailError(retBean.getErrorMsg())
-        }
-        if (retBean.require_query) {
-            // 等待查询
-            return false
-        }
-        codeRecord.payamt = retBean.amount
-        codeRecord.extraamt = retBean.extraamt
-        return true
-    }
-
-    private fun parseInitResult(resp: TransResp?): Boolean {
-        if (resp == null) {
-            SPApplication.getInstance().setEpayLinking(false)
-            throw CardPayFailError("请求超时")
-        }
-        if (resp.retcode != HttpStatus.SC_OK) {
-            throw CardPayFailError("错误码=${resp.retcode}")
-        }
-        val retBean = try {
-            GsonUtil.GsonToBean(resp.retjson!!, CardPayInitRetBean::class.java)
-        } catch (ex: Exception) {
-            throw CardPayFailError("json异常:${ex.message}")
-        }
-        if (retBean.retcode != PublicDef.SUCCESS) {
-            throw CardPayFailError(retBean.getErrorMsg())
-        }
-        codeRecord.billno = retBean.billno
-        codeRecord.username = retBean.username
-        return true
-    }
-
-    private fun initTransdtlOnline(code: String, amount: Int) {
-        codeRecord = TransdtlOnlineRecord()
-        var seqno = pos.getTransdtlOnlineMaxSeqno()
-        if (seqno == 0) {
-            seqno = pos.getDynamicPara()?.onlineseqno ?: 0
-        }
-        codeRecord.devphyid = pos.getConfigPara()!!.devphyid
-        codeRecord.transdate = DateUtil.getNowDateNoFormat()
-        codeRecord.transtime = DateUtil.getNowTimeNoFormat()
-        codeRecord.devseqno = seqno + 1
-        codeRecord.qrcode = code
-        codeRecord.payamt = amount
-        codeRecord.reversalflag = ReversalFlag.NONE
-        codeRecord.extraamt = 0
-        codeRecord.transtype = "code"
-        codeRecord.status = PayStatus.INIT
-        codeRecord.upflag = 1
-        if (!pos.saveTransdtlOnline(codeRecord)) {
-            throw CardPayFailError("保存流水失败")
-        }
-    }
-
-    private fun updateTransdtlOnline(issuccess: Boolean) {
-        if (issuccess) {
-            codeRecord.status = PayStatus.SUC
-        } else {
-            codeRecord.status = PayStatus.FAIL
-        }
-        codeRecord.upflag = 1
-        pos.updateTransdtlOnline(codeRecord)
-    }
-
-    private fun sleepWithCancel(ms: Long) {
-        var sum: Long = 0
-        while (!interruptedPay) {
-            CommonUtil.doSleep(100)
-            sum += 100
-            if (sum > ms) {
-                break
-            }
-        }
-    }
-
-    private fun showSucInfo() {
-        lastPayBean.code = codeRecord.qrcode
-        lastPayBean.suctime = System.currentTimeMillis()
-        val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
-        info.showtime = pos.getSysPara()!!.sucShowtime
-        info.amount = codeRecord.payamt
-        info.payamt = codeRecord.payamt
-        info.username = codeRecord.username
-        info.cardno = codeRecord.cardno
-        info.transdate = codeRecord.transdate
-        info.transtime = codeRecord.transtime
-        info.payway = codeRecord.transtype
-        info.status = codeRecord.status
-        info.reversalFlag = codeRecord.reversalflag
-        sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
-    }
-
-    private fun getErrorInfo(errmsg: String?): CardUserInfoBean {
-        val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
-        info.showtime = pos.getSysPara()!!.failShowtime
-        info.status = PayStatus.FAIL
-        info.amount = amount
-        info.payamt = amount
-        info.payway = "code"
-        info.transdate = DateUtil.getNowDateNoFormat()
-        info.transtime = DateUtil.getNowTimeNoFormat()
-        return info
-    }
-
-    private fun sendMsg(code: Int, obj: Any) {
-        val msg = Message()
-        msg.what = code
-        msg.obj = obj
-        handler.sendMessage(msg)
-    }
+package com.supwisdom.activities.consume.mode
+
+import android.os.Handler
+import android.os.Message
+import com.supwisdom.activities.SPApplication
+import com.supwisdom.activities.consume.bean.CardPayConfirmRetBean
+import com.supwisdom.activities.consume.bean.CardPayInitRetBean
+import com.supwisdom.activities.consume.bean.CardUserInfoBean
+import com.supwisdom.activities.consume.bean.LastPayBean
+import com.supwisdom.entity.PayStatus
+import com.supwisdom.entity.ReversalFlag
+import com.supwisdom.entity.TransdtlOnlineRecord
+import com.supwisdom.exception.CardPayFailError
+import com.supwisdom.okhttp.TransResp
+import com.supwisdom.utils.*
+import org.apache.http.HttpStatus
+
+/**
+ ** create by zzq on 2019/7/30
+ ** @desc 二维码消费
+ **/
+class CodePayService constructor(private val handler: Handler) {
+    private val TAG = "CodePayService"
+    private val pos = SPApplication.getInstance().getPos()
+    private lateinit var codeRecord: TransdtlOnlineRecord
+    private val consumeApi = ConsumeApi()
+
+    /**
+     * 消费过程中可按键主动取消
+     * 手动取消后不冲正,以手机消费结果为准
+     */
+    @Volatile
+    private var interruptedPay: Boolean = false
+
+    @Volatile
+    private var amount = 0
+    var isFixMode = false
+    private val lastPayBean = LastPayBean()
+
+    fun interruptPay() {
+        interruptedPay = true
+    }
+
+    fun pay(code: String, amount: Int) {
+        this.amount = amount
+        interruptedPay = false
+        try {
+            if (isFixMode) {
+                if (lastPayBean.code == code) {
+                    val gap = (pos.getSysPara()?.fixpayGap ?: 10).toLong()
+                    if (System.currentTimeMillis() - lastPayBean.suctime < gap * 1000) {
+                        throw CardPayFailError("${gap}s内不能连续消费")
+                    }
+                }
+            }
+            initTransdtlOnline(code, amount)
+            var resp = consumeApi.payInit(codeRecord)
+            parseInitResult(resp)
+            resp = consumeApi.payConfirm(codeRecord)
+            var result = parseConfirmResult(resp)
+            if (!result) {
+                result = payResultQuery()
+                updateTransdtlOnlineHalfBreak(result)
+            } else {
+                updateTransdtlOnline(result)
+            }
+            if (result) {
+                showSucInfo()
+            }
+        } catch (ex: CardPayFailError) {
+            sendMsg(PublicDef.MSG_CARD_PAY_FAIL, getErrorInfo(ex.message))
+        }
+    }
+
+    private fun payResultQuery(): Boolean {
+        sendMsg(PublicDef.MSG_PAYING_QUERY, "谨慎操作查询取消")
+        LogUtil.d(TAG, "扫码消费确认超时,进行查询操作:billno=${codeRecord.billno}")
+        sleepWithCancel(1500)
+        var searchCnt = 1
+        while (!interruptedPay) {
+            sendMsg(PublicDef.MSG_CARD_PAYING, String.format("正在%d次查询...", searchCnt))
+            val resp = consumeApi.payQuery(codeRecord)
+            if (resp != null) {
+                val result = parseConfirmResult(resp)
+                if (!result) {
+                    searchCnt++
+                    sendMsg(PublicDef.MSG_CARD_PAYING, String.format("等待%d次查询...", searchCnt))
+                    sleepWithCancel(3000)
+                    continue
+                }
+                return result
+            } else {
+                searchCnt++
+                sendMsg(PublicDef.MSG_CARD_PAYING, String.format("等待%d次查询...", searchCnt))
+                sleepWithCancel(3000)
+            }
+        }
+        LogUtil.d(TAG, "扫码消费确认超时,操作员手工取消查询:billno=${codeRecord.billno}")
+        return false
+    }
+
+    private fun parseConfirmResult(resp: TransResp?): Boolean {
+        if (resp == null) {
+            SPApplication.getInstance().setEpayLinking(false)
+            return false
+        }
+        if (resp.retcode != HttpStatus.SC_OK) {
+            throw CardPayFailError("错误码=${resp.retcode}")
+        }
+        val retBean = try {
+            GsonUtil.GsonToBean(resp.retjson!!, CardPayConfirmRetBean::class.java)
+        } catch (ex: Exception) {
+            throw CardPayFailError("json异常:${ex.message}")
+        }
+        if (retBean.retcode != PublicDef.SUCCESS) {
+            throw CardPayFailError(retBean.getErrorMsg())
+        }
+        if (retBean.require_query) {
+            // 等待查询
+            return false
+        }
+        codeRecord.payamt = retBean.amount
+        codeRecord.extraamt = retBean.extraamt
+        return true
+    }
+
+    private fun parseInitResult(resp: TransResp?): Boolean {
+        if (resp == null) {
+            SPApplication.getInstance().setEpayLinking(false)
+            throw CardPayFailError("请求超时")
+        }
+        if (resp.retcode != HttpStatus.SC_OK) {
+            throw CardPayFailError("错误码=${resp.retcode}")
+        }
+        val retBean = try {
+            GsonUtil.GsonToBean(resp.retjson!!, CardPayInitRetBean::class.java)
+        } catch (ex: Exception) {
+            throw CardPayFailError("json异常:${ex.message}")
+        }
+        if (retBean.retcode != PublicDef.SUCCESS) {
+            throw CardPayFailError(retBean.getErrorMsg())
+        }
+        codeRecord.billno = retBean.billno
+        codeRecord.username = retBean.username
+        return true
+    }
+
+    private fun initTransdtlOnline(code: String, amount: Int) {
+        codeRecord = TransdtlOnlineRecord()
+        var seqno = pos.getTransdtlOnlineMaxSeqno()
+        if (seqno == 0) {
+            seqno = pos.getDynamicPara()?.onlineseqno ?: 0
+        }
+        codeRecord.devphyid = pos.getConfigPara()!!.devphyid
+        codeRecord.transdate = DateUtil.getNowDateNoFormat()
+        codeRecord.transtime = DateUtil.getNowTimeNoFormat()
+        codeRecord.devseqno = seqno + 1
+        codeRecord.qrcode = code
+        codeRecord.payamt = amount
+        codeRecord.reversalflag = ReversalFlag.NONE
+        codeRecord.extraamt = 0
+        codeRecord.transtype = "code"
+        codeRecord.status = PayStatus.INIT
+        codeRecord.upflag = 1
+        if (!pos.saveTransdtlOnline(codeRecord)) {
+            throw CardPayFailError("保存流水失败")
+        }
+    }
+
+    private fun updateTransdtlOnline(issuccess: Boolean) {
+        if (issuccess) {
+            codeRecord.status = PayStatus.SUC
+        } else {
+            codeRecord.status = PayStatus.FAIL
+        }
+        codeRecord.upflag = 1
+        pos.updateTransdtlOnline(codeRecord)
+    }
+
+    private fun updateTransdtlOnlineHalfBreak(issuccess: Boolean) {
+        if (issuccess) {
+            codeRecord.status = PayStatus.SUC
+        } else {
+            codeRecord.status = PayStatus.UNCONFIRM
+        }
+        codeRecord.upflag = 1
+        pos.updateTransdtlOnline(codeRecord)
+    }
+
+    private fun sleepWithCancel(ms: Long) {
+        var sum: Long = 0
+        while (!interruptedPay) {
+            CommonUtil.doSleep(100)
+            sum += 100
+            if (sum > ms) {
+                break
+            }
+        }
+    }
+
+    private fun showSucInfo() {
+        lastPayBean.code = codeRecord.qrcode
+        lastPayBean.suctime = System.currentTimeMillis()
+        val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
+        info.showtime = pos.getSysPara()!!.sucShowtime
+        info.amount = codeRecord.payamt
+        info.payamt = codeRecord.payamt
+        info.username = codeRecord.username
+        info.cardno = codeRecord.cardno
+        info.transdate = codeRecord.transdate
+        info.transtime = codeRecord.transtime
+        info.payway = codeRecord.transtype
+        info.status = codeRecord.status
+        info.reversalFlag = codeRecord.reversalflag
+        sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
+    }
+
+    private fun getErrorInfo(errmsg: String?): CardUserInfoBean {
+        val info = CardUserInfoBean(PublicDef.ERROR, errmsg ?: "null")
+        info.showtime = pos.getSysPara()!!.failShowtime
+        info.status = PayStatus.FAIL
+        info.amount = amount
+        info.payamt = amount
+        info.payway = "code"
+        info.transdate = DateUtil.getNowDateNoFormat()
+        info.transtime = DateUtil.getNowTimeNoFormat()
+        return info
+    }
+
+    private fun sendMsg(code: Int, obj: Any) {
+        val msg = Message()
+        msg.what = code
+        msg.obj = obj
+        handler.sendMessage(msg)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt b/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt
index 877e944..e76c109 100644
--- a/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt
+++ b/app/src/main/java/com/supwisdom/activities/transdtl/TransdtlActivity.kt
@@ -25,6 +25,7 @@
     private lateinit var vSeqno: TextView
     private lateinit var vContent: TextView
     private var isSearching: Boolean = false
+
     @Volatile
     private var keyActive = true
     private var hasdtlFlag = true
@@ -144,6 +145,9 @@
                 } else {
                     "消费成功"
                 }
+            } else if (record.status == PayStatus.UNCONFIRM) {
+                //反扫消费查询超时
+                "以手机结果为准"
             } else {
                 if (record.reversalflag == ReversalFlag.AUTO ||
                     record.reversalflag == ReversalFlag.MANUAL
@@ -220,7 +224,10 @@
         counter!!.start()
     }
 
-    private inner class ContinuePressTimer internal constructor(millisInFuture: Long, countDownInterval: Long) :
+    private inner class ContinuePressTimer internal constructor(
+        millisInFuture: Long,
+        countDownInterval: Long
+    ) :
         CountDownTimer(millisInFuture, countDownInterval) {
 
         override fun onTick(millisUntilFinished: Long) {
diff --git a/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt b/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
index e82f9d8..790a7fb 100644
--- a/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
+++ b/app/src/main/java/com/supwisdom/db/DBTransdtlHelper.kt
@@ -12,7 +12,7 @@
     SQLiteOpenHelper(context, DB_NAME, null, VERSION) {
     companion object {
         private val DB_NAME = "db_transdtl"
-        private val VERSION = 1
+        private val VERSION = 2
         private var instance: DBTransdtlHelper? = null
 
         const val TABLE_NAME_DTL_ONLINE = "tb_dtl_online"
@@ -52,6 +52,8 @@
             + BeanPropEnum.TransdtlOnline.reversalbillno + " varchar(32) default 0,"
             + BeanPropEnum.TransdtlOnline.status + " varchar(8) default 0,"
             + BeanPropEnum.TransdtlOnline.upflag + " integer default 0)")
+    private val CREATE_INDEX_NAME_DTLONL_TRANSDATE = ("create index idx_dtlonl_transdate on "
+            + TABLE_NAME_DTL_ONLINE + " (" + BeanPropEnum.TransdtlOnline.transdate + ")")
     private val CRAETE_TABLE_NAME_DTL_OFFLINE = ("create table IF NOT EXISTS "
             + TABLE_NAME_DTL_OFFLINE + " ( "
             + BeanPropEnum.TransdtlOffline.devphyid + " varchar(8) default 0,"
@@ -68,14 +70,22 @@
             + BeanPropEnum.TransdtlOffline.reversaltranstime + " varchar(6) default 0,"
             + BeanPropEnum.TransdtlOffline.status + " varchar(8) default 0,"
             + BeanPropEnum.TransdtlOffline.upflag + " integer default 0)")
+    private val CREATE_INDEX_NAME_DTLOFF_TRANSDATE = ("create index idx_dtloff_transdate on "
+            + TABLE_NAME_DTL_OFFLINE + " ( " + BeanPropEnum.TransdtlOffline.transdate + ")")
 
     override fun onCreate(db: SQLiteDatabase) {
         db.execSQL(CRAETE_TABLE_NAME_DTL_ONLINE)
         db.execSQL(CRAETE_TABLE_NAME_DTL_OFFLINE)
+        db.execSQL(CREATE_INDEX_NAME_DTLONL_TRANSDATE)
+        db.execSQL(CREATE_INDEX_NAME_DTLOFF_TRANSDATE)
     }
 
     override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
         if (oldVersion < newVersion) {
+            if (oldVersion < 2 && newVersion >= 2) {
+                db.execSQL(CREATE_INDEX_NAME_DTLONL_TRANSDATE)
+                db.execSQL(CREATE_INDEX_NAME_DTLOFF_TRANSDATE)
+            }
         }
     }
 }
\ 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
index f293c0f..37a97be 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
@@ -212,6 +212,7 @@
             PayStatus.INIT.toString() -> record.status = PayStatus.INIT
             PayStatus.FAIL.toString() -> record.status = PayStatus.FAIL
             PayStatus.SUC.toString() -> record.status = PayStatus.SUC
+            PayStatus.UNCONFIRM.toString() -> record.status = PayStatus.UNCONFIRM
             else -> record.status = PayStatus.INIT
         }
         record.upflag =
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
index f745fc1..3d9c305 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlUnionDao.kt
@@ -58,9 +58,10 @@
                 ("select * from ("
                         + tablesql.toString()
                         + ") where " + BeanPropEnum.TransdtlUnion.transdate + "='" + date
-                        + "' and " + BeanPropEnum.TransdtlUnion.status + "='"
-                        + PayStatus.SUC.toString()
-                        + "' order by " + BeanPropEnum.TransdtlUnion.transtime
+                        + "' and (" + BeanPropEnum.TransdtlUnion.status + "='"
+                        + PayStatus.SUC.toString() + "' or " + BeanPropEnum.TransdtlUnion.status + "='"
+                        + PayStatus.UNCONFIRM.toString()
+                        + "') order by " + BeanPropEnum.TransdtlUnion.transtime
                         + " desc ")
             }
             else -> {
@@ -122,6 +123,7 @@
             PayStatus.INIT.toString() -> record.status = PayStatus.INIT
             PayStatus.FAIL.toString() -> record.status = PayStatus.FAIL
             PayStatus.SUC.toString() -> record.status = PayStatus.SUC
+            PayStatus.UNCONFIRM.toString() -> record.status = PayStatus.UNCONFIRM
             else -> record.status = PayStatus.INIT
         }
         record.upflag =
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt
index 967fbd8..5030919 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlUnionRecord.kt
@@ -1,40 +1,42 @@
-package com.supwisdom.entity
-
-/**
- ** create by zzq on 2019/7/25
- ** @desc
- **/
-class TransdtlUnionRecord {
-    var username: String? = null
-    var cardno: String? = null
-    var transdate: String? = null
-    var transtime: String? = null
-    var devseqno: Int = 0
-    var payway: String? = null //card,code,offcard
-    var reversalflag: ReversalFlag? = null //消费none 自动冲正auto 手动撤销 manual
-    var payamt: Int = 0
-    var status: PayStatus? = null // init,fail,suc
-    var upflag: Int = 0
-}
-
-/**
- * NONE -- 正常消费
- * AUTO -- 自动冲正
- * MANUAL -- 手动撤销
- */
-enum class ReversalFlag {
-    NONE,
-    AUTO,
-    MANUAL
-}
-
-/**
- * INIT -- 初始化
- * FAIL -- 支付失败
- * SUC --支付成功
- */
-enum class PayStatus {
-    INIT,
-    FAIL,
-    SUC
+package com.supwisdom.entity
+
+/**
+ ** create by zzq on 2019/7/25
+ ** @desc
+ **/
+class TransdtlUnionRecord {
+    var username: String? = null
+    var cardno: String? = null
+    var transdate: String? = null
+    var transtime: String? = null
+    var devseqno: Int = 0
+    var payway: String? = null //card,code,offcard
+    var reversalflag: ReversalFlag? = null //消费none 自动冲正auto 手动撤销 manual
+    var payamt: Int = 0
+    var status: PayStatus? = null // init,fail,suc
+    var upflag: Int = 0
+}
+
+/**
+ * NONE -- 正常消费
+ * AUTO -- 自动冲正
+ * MANUAL -- 手动撤销
+ */
+enum class ReversalFlag {
+    NONE,
+    AUTO,
+    MANUAL
+}
+
+/**
+ * INIT -- 初始化
+ * FAIL -- 支付失败
+ * SUC --支付成功
+ * UNCONFIRM --未确认
+ */
+enum class PayStatus {
+    INIT,
+    FAIL,
+    SUC,
+    UNCONFIRM
 }
\ No newline at end of file
