diff --git a/app/src/main/java/com/supwisdom/activities/SPApplication.kt b/app/src/main/java/com/supwisdom/activities/SPApplication.kt
index 61e704d..781fd44 100644
--- a/app/src/main/java/com/supwisdom/activities/SPApplication.kt
+++ b/app/src/main/java/com/supwisdom/activities/SPApplication.kt
@@ -5,7 +5,6 @@
 import android.support.multidex.MultiDex
 import android.support.multidex.MultiDexApplication
 import com.supwisdom.db.Pos
-import com.supwisdom.service.BackgroundTaskService
 import com.supwisdom.utils.CommonUtil
 import com.supwisdom.utils.PublicDef
 
@@ -60,11 +59,11 @@
 
     private fun startService() {
         if (!CommonUtil.isServiceWork(this, PublicDef.BG_SERVICE_NAME)) {
-            startService(Intent(this, BackgroundTaskService::class.java))
+            startService(Intent(this, ServiceDemo::class.java))
         }
     }
 
     fun stopService() {
-        stopService(Intent(this, BackgroundTaskService::class.java))
+        stopService(Intent(this, ServiceDemo::class.java))
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/activities/ServiceDemo.kt b/app/src/main/java/com/supwisdom/activities/ServiceDemo.kt
index c0bc6b1..90d1564 100644
--- a/app/src/main/java/com/supwisdom/activities/ServiceDemo.kt
+++ b/app/src/main/java/com/supwisdom/activities/ServiceDemo.kt
@@ -2,14 +2,81 @@
 
 import android.app.Service
 import android.content.Intent
+import android.os.Binder
 import android.os.IBinder
+import com.supwisdom.service.BackgroundTaskService
+import com.supwisdom.utils.CommonUtil
 
 /**
  ** create by zzq on 2019/7/23
  ** @desc
  **/
 class ServiceDemo : Service() {
+    private var guardThread: Thread? = null
+    private var bind: ServiceBind? = null
+    private var bgTask: BackgroundTaskService? = null
+    private val pos = SPApplication.getInstance().getPos()
+    @Volatile
+    private var isExist = false
+
+    override fun onCreate() {
+        super.onCreate()
+    }
+
+    override fun onDestroy() {
+        closeThread()
+        super.onDestroy()
+    }
+
     override fun onBind(intent: Intent): IBinder? {
-        return null
+        if (bind == null) {
+            bind = ServiceBind()
+        }
+        return bind
+    }
+
+    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
+        createThread()
+        return super.onStartCommand(intent, flags, startId)
+    }
+
+    private fun createThread() {
+        isExist = false
+        if (bgTask == null) {
+            bgTask = BackgroundTaskService()
+        }
+        if (guardThread == null) {
+            guardThread = GuardThread()
+            guardThread!!.start()
+        }
+    }
+
+    private fun closeThread() {
+        bgTask?.interrupt()
+        bgTask = null
+        isExist = true
+        guardThread?.interrupt()
+        guardThread = null
+    }
+
+    private inner class GuardThread : Thread() {
+        override fun run() {
+            CommonUtil.doSleep(60 * 1000)
+            while (!isExist) {
+                val hasInit = pos.getConfigPara()?.initOK ?: false
+                if (hasInit) {
+                    break
+                }
+                CommonUtil.doSleep(1000)
+            }
+            if (!isExist) {
+                bgTask!!.start()
+            }
+        }
+    }
+
+    inner class ServiceBind : Binder() {
+        val serviceDemo: ServiceDemo
+            get() = this@ServiceDemo
     }
 }
\ No newline at end of file
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 9f700d0..64f34f5 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
@@ -5,10 +5,7 @@
 import com.supwisdom.activities.SPApplication
 import com.supwisdom.activities.consume.IConsumeView
 import com.supwisdom.activities.consume.bean.*
-import com.supwisdom.entity.PayStatus
-import com.supwisdom.entity.ReversalFlag
-import com.supwisdom.entity.TransdtlOfflineRecord
-import com.supwisdom.entity.TransdtlOnlineRecord
+import com.supwisdom.entity.*
 import com.supwisdom.epaycard.Cardlib
 import com.supwisdom.exception.CardNotFoundError
 import com.supwisdom.exception.CardPayCancelFailError
@@ -69,7 +66,9 @@
 
     private inner class CardPayRunnable : Runnable {
         private lateinit var onlRecord: TransdtlOnlineRecord
+        private lateinit var onlRvsRecord: TransdtlOnlineRecord
         private lateinit var offRecord: TransdtlOfflineRecord
+        private lateinit var offRvsRecord: TransdtlOfflineRecord
         private var oldcardphyid: String? = null
         private var onlineBalance = false
         private var curLinkStatus = false
@@ -197,7 +196,113 @@
         }
 
         private fun doReverse() {
-            throw CardPayCancelFailError("暂不支持")
+            val list = pos.getTransdtlUnion(DateUtil.getNowDateNoFormat(), 0, 0, 1)
+            if (list.isEmpty()) {
+                throw CardPayCancelFailError("未找到消费记录")
+            }
+            if (list[0].payway == "offcard") {
+                doOfflineReverse(list[0])
+            } else {
+                doOnlineReverse(list[0])
+            }
+        }
+
+        private fun doOnlineReverse(unionRecord: TransdtlUnionRecord) {
+            val record = pos.getTransdtlOnlineLast() ?: throw CardPayCancelFailError("未找到联机记录")
+            checkOnlineReverseVaild(unionRecord, record)
+            saveTransdtlOnlineReverse(record)
+            showRvsSucInfo(
+                onlRvsRecord.payamt,
+                onlRvsRecord.username!!,
+                onlRvsRecord.transdate + onlRvsRecord.transtime
+            )
+            asyncUpload(onlRvsRecord)
+        }
+
+        private fun doOfflineReverse(unionRecord: TransdtlUnionRecord) {
+            val record = pos.getTransdtlOfflineLast() ?: throw CardPayCancelFailError("未找到离线记录")
+            checkOfflineReverseVaild(unionRecord, record)
+            saveTransdtlOfflineReverse(record)
+            showRvsSucInfo(offRvsRecord.payamt, offRvsRecord.cardno!!, offRvsRecord.transdate + onlRvsRecord.transtime)
+            asyncUpload(offRvsRecord)
+        }
+
+        private fun saveTransdtlOfflineReverse(record: TransdtlOfflineRecord) {
+            offRvsRecord = record.clone()
+            offRvsRecord.devseqno += 1
+            offRvsRecord.transdate = DateUtil.getNowDateNoFormat()
+            offRvsRecord.transtime = DateUtil.getNowTimeNoFormat()
+            offRvsRecord.reversalflag = ReversalFlag.MANUAL
+            offRvsRecord.reversalseqno = record.devseqno
+            offRvsRecord.reversaltransdate = record.transdate
+            offRvsRecord.reversaltranstime = record.transtime
+            offRvsRecord.upflag = 0
+            if (!pos.saveTransdtlOffline(offRvsRecord)) {
+                throw CardPayCancelFailError("保存流水失败")
+            }
+        }
+
+        private fun saveTransdtlOnlineReverse(record: TransdtlOnlineRecord) {
+            onlRvsRecord = record.clone()
+            onlRvsRecord.devseqno += 1
+            onlRvsRecord.transdate = DateUtil.getNowDateNoFormat()
+            onlRvsRecord.transtime = DateUtil.getNowTimeNoFormat()
+            onlRvsRecord.reversalflag = ReversalFlag.MANUAL
+            onlRvsRecord.reversalbillno = record.billno
+            onlRvsRecord.upflag = 0
+            if (!pos.saveTransdtlOnline(onlRvsRecord)) {
+                throw CardPayCancelFailError("保存流水失败")
+            }
+        }
+
+        private fun checkOnlineReverseVaild(unionRecord: TransdtlUnionRecord, record: TransdtlOnlineRecord) {
+            if (record.cardphyid != cardBean.cardphyid) {
+                throw CardPayCancelFailError("该卡不是最后消费")
+            }
+            if (unionRecord.transdate != record.transdate ||
+                unionRecord.transtime != record.transtime
+            ) {
+                throw CardPayCancelFailError("联机记录时间异常")
+            }
+            if (record.reversalflag == ReversalFlag.AUTO
+            ) {
+                throw CardPayCancelFailError("已撤销")
+            }
+            if (record.reversalflag == ReversalFlag.MANUAL) {
+                throw CardPayCancelFailError("已冲正")
+            }
+            if (record.status != PayStatus.SUC) {
+                throw CardPayCancelFailError("消费失败不能冲正")
+            }
+            val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
+            val t2 = System.currentTimeMillis()
+            if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
+                throw CardPayCancelFailError("消费已过期")
+            }
+        }
+
+        private fun checkOfflineReverseVaild(unionRecord: TransdtlUnionRecord, record: TransdtlOfflineRecord) {
+            if (record.cardphyid != cardBean.cardphyid) {
+                throw CardPayCancelFailError("该卡不是最后消费")
+            }
+            if (unionRecord.transdate != record.transdate ||
+                unionRecord.transtime != record.transtime
+            ) {
+                throw CardPayCancelFailError("离线记录时间异常")
+            }
+            if (record.reversalflag == ReversalFlag.MANUAL ||
+                record.reversalflag == ReversalFlag.AUTO
+            ) {
+                throw CardPayCancelFailError("已冲正")
+            }
+            if (record.status != PayStatus.SUC) {
+                throw CardPayCancelFailError("消费失败不能冲正")
+            }
+            val t1 = DateUtil.dateFormatConvertToLong(record.transdate + record.transtime)
+            val t2 = System.currentTimeMillis()
+            if (t2 - t1 > PublicDef.REVERSE_MS_GAP) {
+                throw CardPayCancelFailError("消费已过期")
+            }
         }
 
         private fun doOnlineConsume(): Boolean {
@@ -210,7 +315,7 @@
             resp = consumeApi.payConfirm(onlRecord)
             result = parseConfirmResult(resp)
             if (result) {
-                showOnlSucInfo()
+                showRvsSucInfo(onlRecord.payamt, onlRecord.username!!, onlRecord.transdate + onlRecord.transtime)
             }
             updateTransdtlOnline(result)
             return result
@@ -286,7 +391,7 @@
             initTransdtlOffline()
             checkCardValid()
             updateTransdtlOffline(true)
-            showOffSucInfo()
+            showSucInfo(offRecord.payamt, offRecord.cardno!!, offRecord.transdate + offRecord.transtime)
         }
 
         private fun checkCardValid() {
@@ -354,18 +459,30 @@
             asyncUpload(offRecord)
         }
 
-        private fun showOffSucInfo() {
+        private fun showSucInfo(amount: Int, username: String, datetime: String) {
             val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
             info.showtime = pos.getSysPara()!!.sucShowtime
-            info.amount = offRecord.payamt
-            info.payamt = offRecord.payamt
-            info.username = offRecord.cardno
-            info.datetime = offRecord.transdate + offRecord.transtime
+            info.amount = amount
+            info.payamt = amount
+            info.username = username
+            info.datetime = datetime
             info.payway = "card"
             info.status = PayStatus.SUC
             sendMsg(PublicDef.MSG_CARD_PAY_SUC, info)
         }
 
+        private fun showRvsSucInfo(amount: Int, username: String, datetime: String) {
+            val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
+            info.showtime = pos.getSysPara()!!.sucShowtime
+            info.amount = amount
+            info.payamt = amount
+            info.username = username
+            info.datetime = datetime
+            info.payway = "card"
+            info.status = PayStatus.SUC
+            sendMsg(PublicDef.MSG_CARD_REVERSE_SUC, info)
+        }
+
         private fun asyncUpload(dtl: TransdtlOfflineRecord) {
             ThreadPool.getShortPool().execute(Runnable {
                 try {
@@ -378,6 +495,18 @@
             })
         }
 
+        private fun asyncUpload(dtl: TransdtlOnlineRecord) {
+            ThreadPool.getShortPool().execute(Runnable {
+                try {
+                    EpayApiImpl().uploadTransdtl(dtl)
+                    dtl.upflag = 1
+                    pos.updateTransdtlOnline(dtl)
+                } catch (ex: java.lang.Exception) {
+                    ex.printStackTrace()
+                }
+            })
+        }
+
         private fun doClear() {
             oldcardphyid = null
             onlineBalance = false
@@ -416,18 +545,6 @@
             }
         }
 
-        private fun showOnlSucInfo() {
-            val info = CardUserInfoBean(PublicDef.SUCCESS, "消费成功")
-            info.showtime = pos.getSysPara()!!.sucShowtime
-            info.amount = onlRecord.payamt
-            info.payamt = onlRecord.payamt
-            info.username = onlRecord.username
-            info.datetime = onlRecord.transdate + onlRecord.transtime
-            info.payway = onlRecord.transtype
-            info.status = PayStatus.SUC
-            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
diff --git a/app/src/main/java/com/supwisdom/db/Pos.kt b/app/src/main/java/com/supwisdom/db/Pos.kt
index 6159775..d545378 100644
--- a/app/src/main/java/com/supwisdom/db/Pos.kt
+++ b/app/src/main/java/com/supwisdom/db/Pos.kt
@@ -161,6 +161,15 @@
         return onlMaxSeqno
     }
 
+    fun getTransdtlOnlineLast(): TransdtlOnlineRecord? {
+        try {
+            transdtlOnlineDao.getLock().lock()
+            return transdtlOnlineDao.getLast()
+        } finally {
+            transdtlOnlineDao.getLock().unlock()
+        }
+    }
+
     fun getTransdtlOnlineUnconfirm(): List<TransdtlOnlineRecord> {
         try {
             transdtlOnlineDao.getLock().lock()
@@ -222,6 +231,15 @@
         }
     }
 
+    fun getTransdtlOfflineLast(): TransdtlOfflineRecord? {
+        try {
+            transdtlOfflineDao.getLock().lock()
+            return transdtlOfflineDao.getLast()
+        } finally {
+            transdtlOfflineDao.getLock().unlock()
+        }
+    }
+
     fun saveTransdtlOffline(record: TransdtlOfflineRecord): Boolean {
         try {
             transdtlOfflineDao.getLock().lock()
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
index 20bcec1..10d2238 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOfflineDao.kt
@@ -101,10 +101,25 @@
         }
     }
 
+    fun getLast(): TransdtlOfflineRecord? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val orderBy = BeanPropEnum.TransdtlOffline.devseqno.toString() + " desc"
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, orderBy, "1")
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor)
+            }
+            return null
+        } finally {
+            cursor?.close()
+        }
+    }
+
     fun clear(date: String): Boolean {
         val db = dbHelper.writableDatabase
         val selection =
-            BeanPropEnum.TransdtlOffline.upflag.toString() + "=?" + BeanPropEnum.TransdtlOffline.transdate + "<?"
+            BeanPropEnum.TransdtlOffline.upflag.toString() + "=? and " + BeanPropEnum.TransdtlOffline.transdate + "<?"
         try {
             db.beginTransaction()
             if (db.delete(TABLE, selection, arrayOf("1", date)) < 0) {
diff --git a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
index 9d3d760..d4f2903 100644
--- a/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
+++ b/app/src/main/java/com/supwisdom/db/TransdtlOnlineDao.kt
@@ -72,6 +72,21 @@
         }
     }
 
+    fun getLast(): TransdtlOnlineRecord? {
+        val db = dbHelper.readableDatabase
+        var cursor: Cursor? = null
+        val orderBy = BeanPropEnum.TransdtlOnline.devseqno.toString() + " desc"
+        try {
+            cursor = db.query(TABLE, null, null, null, null, null, orderBy, "1")
+            if (cursor != null && cursor.moveToNext()) {
+                return getRecord(cursor)
+            }
+            return null
+        } finally {
+            cursor?.close()
+        }
+    }
+
     fun getMaxSeqno(): Int {
         val db = dbHelper.readableDatabase
         val sql = ("select max(${BeanPropEnum.TransdtlOnline.devseqno}) as seqno from $TABLE")
@@ -104,7 +119,7 @@
     fun clear(date: String): Boolean {
         val db = dbHelper.writableDatabase
         val selection =
-            BeanPropEnum.TransdtlOnline.upflag.toString() + "=?" + BeanPropEnum.TransdtlOnline.transdate + "<?"
+            BeanPropEnum.TransdtlOnline.upflag.toString() + "=? and " + BeanPropEnum.TransdtlOnline.transdate + "<?"
         try {
             db.beginTransaction()
             if (db.delete(TABLE, selection, arrayOf("1", date)) < 0) {
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
index ea0e3b4..347d10a 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlOfflineRecord.kt
@@ -1,10 +1,12 @@
 package com.supwisdom.entity
 
+import com.supwisdom.utils.GsonUtil
+
 /**
  ** create by zzq on 2019/7/24
  ** @desc 离线流水
  **/
-class TransdtlOfflineRecord {
+class TransdtlOfflineRecord : Cloneable {
     var devphyid: String? = null
     var transdate: String? = null
     var transtime: String? = null
@@ -20,4 +22,9 @@
     var reversaltranstime: String? = null  //被冲正流水时间
     var status: PayStatus? = null // init,fail,suc
     var upflag: Int = 0 // 1已上传
+
+    public override fun clone(): TransdtlOfflineRecord {
+        val tmp = GsonUtil.GsonString(this)
+        return GsonUtil.GsonToBean(tmp, TransdtlOfflineRecord::class.java)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
index b2b0d6e..5eb7e1a 100644
--- a/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
+++ b/app/src/main/java/com/supwisdom/entity/TransdtlOnlineRecord.kt
@@ -1,10 +1,12 @@
 package com.supwisdom.entity
 
+import com.supwisdom.utils.GsonUtil
+
 /**
  ** create by zzq on 2019/7/24
  ** @desc 联机流水
  **/
-class TransdtlOnlineRecord {
+class TransdtlOnlineRecord : Cloneable {
     var devphyid: String? = null
     var transdate: String? = null
     var transtime: String? = null
@@ -23,4 +25,9 @@
     var reversalbillno: String? = null //被冲正交易参考号
     var status: PayStatus? = null // init,fail,suc
     var upflag: Int = 0 // 1已上传
+
+    public override fun clone(): TransdtlOnlineRecord {
+        val tmp = GsonUtil.GsonString(this)
+        return GsonUtil.GsonToBean(tmp, TransdtlOnlineRecord::class.java)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/supwisdom/service/BackgroundTaskService.kt b/app/src/main/java/com/supwisdom/service/BackgroundTaskService.kt
index 8a7c9f7..8c8d0c5 100644
--- a/app/src/main/java/com/supwisdom/service/BackgroundTaskService.kt
+++ b/app/src/main/java/com/supwisdom/service/BackgroundTaskService.kt
@@ -15,43 +15,30 @@
  **/
 class BackgroundTaskService : Thread() {
     private val pos = SPApplication.getInstance().getPos()
-    private val websocketProcess = WebsocketProcess()
-    private var websocketHasRun = false
-    private var apiInterface: APIInterface? = null
+    private var apiInterface: APIInterface = EpayApiImpl()
     private var sysRecord: SysParaRecord? = null
     private var transdtlClearDate: String? = null
+    @Volatile
+    private var isExist = false
 
-    fun getWebsocketProcess(): WebsocketProcess {
-        return websocketProcess
+    override fun start() {
+        isExist = false
+        super.start()
+    }
+
+    override fun interrupt() {
+        isExist = true
+        super.interrupt()
     }
 
     override fun run() {
-        var heartgap = 0
-        CommonUtil.doSleep(60 * 1000)
-        while (true) {
-            val hasInit = pos.getConfigPara()?.initOK ?: false
-            if (hasInit) {
-                break
-            }
-            CommonUtil.doSleep(1000)
-        }
-        while (true) {
+        var heartgap: Int
+        while (!isExist) {
             //做一卡通心跳和流水上传
             heartAndTransdtl()
             //清除流水
             clearTransdtl()
             sysRecord = pos.getSysPara()
-//            if (sysRecord != null && sysRecord!!.getSocketSwitch() != 0) {
-//                if (!websocketHasRun) {
-//                    websocketHasRun = true
-//                    websocketProcess.start()
-//                }
-//            } else {
-//                if (websocketHasRun) {
-//                    websocketHasRun = false
-//                    websocketProcess.stop()
-//                }
-//            }
             heartgap = if (sysRecord == null || sysRecord!!.heatBeat < 10 || sysRecord!!.heatBeat > 600) {
                 60
             } else {
@@ -62,11 +49,11 @@
     }
 
     private fun heartAndTransdtl() {
-        //做一卡通的心跳以及流水上传
+        /**做一卡通的心跳以及流水上传*/
         try {
-            apiInterface!!.heartBeat()
+            apiInterface.heartBeat()
             SPApplication.getInstance().setEpayLinking(true)
-//        /*更新通讯jwt*/
+            /**更新通讯jwt*/
             refreshJwt()
             uploadTransdtl()
         } catch (ex: HeartBeatError) {
@@ -77,12 +64,12 @@
     private fun uploadTransdtl() {
         try {
             pos.getTransdtlOfflineUnconfirm().forEach {
-                apiInterface!!.uploadTransdtl(it)
+                apiInterface.uploadTransdtl(it)
                 it.upflag = 1
                 pos.updateTransdtlOffline(it)
             }
             pos.getTransdtlOnlineUnconfirm().forEach {
-                apiInterface!!.uploadTransdtl(it)
+                apiInterface.uploadTransdtl(it)
                 it.upflag = 1
                 pos.updateTransdtlOnline(it)
             }
diff --git a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
index a7fb734..5c05581 100644
--- a/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
+++ b/app/src/main/java/com/supwisdom/service/EpayApiImpl.kt
@@ -159,28 +159,13 @@
 
     @Throws(TransdtlUploadError::class)
     override fun uploadTransdtl(record: TransdtlOnlineRecord) {
-        var reversalflag = "false"
-        if (record.reversalflag == ReversalFlag.AUTO ||
-            record.reversalflag == ReversalFlag.MANUAL
-        ) {
-            reversalflag = "true"
-        }
-
         val params = WebParams()
         params.setParameter("devphyid", record.devphyid)
             .setParameter("transdate", record.transdate)
             .setParameter("transtime", record.transtime)
             .setParameter("termseqno", record.devseqno)
-            .setParameter("cardno", record.cardno)
-            .setParameter("cardphyid", record.cardphyid)
-            .setParameter("qrcode", record.qrcode)
-            .setParameter("transtype", record.transtype)
-            .setParameter("amount", record.payamt)
-            .setParameter("extraamt", record.extraamt)
-            .setParameter("managefeetype", record.managefeetype)
-            .setParameter("managefeetype", record.managefeetype)
-            .setParameter("billno", record.billno)
-            .setParameter("reversalflag", reversalflag)
+            .setParameter("reversalbillno", record.reversalbillno)
+            .setParameter("reversalflag", record.reversalflag.toString())
             .setParameter("status", record.status.toString())
         val resp = YktSession.getInstance().sendYktRequestPost("/api/pos/paycancel", "", params)
             ?: throw TransdtlUploadError("请求超时")
