diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
index c151b4b..cff556b 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
@@ -248,6 +248,30 @@
     }
 }
 
+class ConsumePayCancelParam : APIRequestParam() {
+    @Sign
+    var refno:String? = null //流水号
+    @Sign
+    var billno:String?=null //订单号
+    @Sign
+    var shopaccno:String?=null //商户号
+    @Sign
+    var requestbillno:String="" //退款请求唯一标识
+    @Sign
+    var transdate: String = "" //必传
+    @Sign
+    var transtime: String = "" //必传
+
+    override fun checkParam(): Boolean {
+        if (StringUtil.isEmpty(refno) && (StringUtil.isEmpty(billno) || StringUtil.isEmpty(shopaccno))) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "原流水唯一号不能为空")
+        if (StringUtil.isEmpty(requestbillno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "撤销或退款流水号不能为空")
+        if (!DateUtil.checkDatetimeValid(transdate, DateUtil.DATE_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易日期错误[yyyyMMdd]")
+        if (!DateUtil.checkDatetimeValid(transtime, DateUtil.TIME_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易时间错误[HHmmss]")
+
+        return true
+    }
+}
+
 
 
 // ============================ RECHARGE ============================ //
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt
index d66a927..3c749af 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt
@@ -37,6 +37,28 @@
     @Autowired
     lateinit var chargeApiService: ChargeApiService
 
+    /**
+     * ============================================================================
+     * 查询充值流水状态
+     * ============================================================================
+     * */
+    @PostMapping("/queryresult")
+    fun rechargeConfirm(@RequestBody param: CommonQueryRechargeResultParam, authentication: Authentication): ResponseEntity<Any> {
+        chargeApiService.getTransactionMainDtl(param.refno, param.billno, authentication.name).let {
+            if (null == it) {
+                return ResponseEntity.ok(ResponseBodyBuilder.create()
+                        .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "充值流水不存在"))
+            }
+
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .data("refno", it.refno)
+                    .data("billno", it.outTradeNo)
+                    .data("status", it.status)
+                    .data("amount", chargeApiService.getPersonDtl(it.refno).amount)
+                    .data("reverseflag", it.reverseFlag)
+                    .success("查询成功"))
+        }
+    }
 
     /**
      * ============================================================================
@@ -119,26 +141,4 @@
 
     }
 
-    /**
-     * ============================================================================
-     * 查询充值流水状态
-     * ============================================================================
-     * */
-    @PostMapping("/queryresult")
-    fun rechargeConfirm(@RequestBody param: CommonQueryRechargeResultParam, authentication: Authentication): ResponseEntity<Any> {
-        chargeApiService.getTransactionMainDtl(param.refno, param.billno, authentication.name).let {
-            if (null == it) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "充值流水不存在"))
-            }
-
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .data("refno", it.refno)
-                    .data("billno", it.outTradeNo)
-                    .data("status", it.status)
-                    .data("amount", chargeApiService.getPersonDtl(it.refno).amount)
-                    .success("查询成功"))
-        }
-    }
-
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
index 7be1e16..9665c28 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
@@ -52,85 +52,25 @@
     lateinit var transactionService: TransactionServiceProxy
 
     /**
-     * 流水结果查询统一接口
+     * ============================================================================
+     * 消费流水结果查询统一接口
+     * ============================================================================
      * */
-    fun queryDtlResult(@RequestBody param: QueryDtlResultParam,
-                       request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            val dtl = transactionMainDao.findByRefnoForUpdate(param.refno)
-                    ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易参考号错误<${param.refno}>"))
-
-            val person = if (dtl.person) {
-                userService.findPersonByUserid(dtl.personDtl.userid)
-            } else {
-                null
-            }
+    @PostMapping("/queryresult")
+    fun queryDtlResult(@RequestBody param: QueryDtlResultParam): ResponseEntity<Any> {
+        consumePayService.getTransactionMainDtl(param.refno, param.billno, param.shopaccno)?.let {
             return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .data("refno", dtl.refno)
-                    .data("amount", dtl.personDtl.amount)
-                    .data("paytype", dtl.personDtl.sourceType)
-                    .data("payinfo", dtl.personDtl.payinfo)
-                    .also {
-                        if (null != person) {
-                            it.data("name", person.name)
-                        }
-                    }
+                    .data("refno", it.refno)
+                    .data("billno", it.outTradeNo)
+                    .data("amount", it.shopDtl.amount)
+                    .data("status", it.status)
+                    .data("sourcetype", it.personDtl.sourceType)
+                    .data("payinfo", it.personDtl.payinfo)
+                    .data("reverseflag", it.reverseFlag)
+                    .data("transdesc", it.shopDtl.transdesc)
                     .success("查询成功"))
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "查询错误"))
-        }
-    }
-
-    private fun consumeMealer(@Suppress("UNUSED_PARAMETER") param: CitizenCardPayinitParam,
-                              builder: TransactionBuilder,
-                              feetype: ConsumeFeetype, person: TAccount, shop: TShopacc) {
-        val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER,
-                TradeDict.PAYTYPE_BALANCE)
-        val amount = feetype.amount / 100.0
-        when (feetypeConfig.crsubjno) {
-            shop.subjno -> {
-                builder.addDebitCreditRecord(AccountProxy(person), AccountProxy(shop),
-                        amount, feetypeConfig.summary)
-                        .shop().also {
-                            it.addAmount(amount)
-                        }
-            }
-            else -> {
-                val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno)
-                builder.addDebitCreditRecord(AccountProxy(person), AccountProxy(subject),
-                        amount, feetypeConfig.summary)
-            }
-        }
-
-    }
-
-    private fun consumeDiscount(@Suppress("UNUSED_PARAMETER") param: CitizenCardPayinitParam,
-                                builder: TransactionBuilder,
-                                feetype: ConsumeFeetype, person: TAccount, shop: TShopacc) {
-        val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER,
-                TradeDict.PAYTYPE_BALANCE)
-        val amount = feetype.amount / 100.0
-        when (feetypeConfig.drsubjno) {
-            shop.subjno -> {
-                builder.addDebitCreditRecord(AccountProxy(shop), AccountProxy(person),
-                        amount, feetypeConfig.summary)
-            }
-            else -> {
-                val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno)
-                builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shop),
-                        amount, feetypeConfig.summary)
-            }
-        }
+        } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
     }
 
     /**
@@ -307,17 +247,39 @@
 
     /**
      * ============================================================================
+     * 消费流水撤销
+     * ============================================================================
+     * */
+    @PostMapping("/paycancel")
+    fun payCancel(@RequestBody param: ConsumePayCancelParam): ResponseEntity<Any> {
+        consumePayService.getTransactionMainDtl(param.refno, param.billno, param.shopaccno)?.let {
+            //fixme: 撤销逻辑
+
+
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .success("交易确认成功"))
+        } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
+    }
+
+    /**
+     * ============================================================================
+     * 消费流水退款
+     * ============================================================================
+     * */
+    @PostMapping("/payrefund")
+    fun payRefund(@RequestBody param: ConsumePayCancelParam): ResponseEntity<Any> {
+        return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "退款逻辑未实现"))
+    }
+
+    /**
+     * ============================================================================
      *                           一卡通支付【交易初始化】
      * ============================================================================
      * */
     @PostMapping("/ykt/payinit")
-    fun yktPayInit(@RequestBody param: YktCardPayinitParam, authentication: Authentication): ResponseEntity<Any> {
-        try {
-            if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authentication.name))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-//
+    fun yktPayInit(@RequestBody param: YktCardPayinitParam): ResponseEntity<Any> {
 //            val person = param.uid?.let { userService.findByThirdUniqueIdenty(it) } //没注册，可能匿名?
 //            if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_YKT_CARD, person == null)) {
 //                val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
@@ -353,15 +315,8 @@
 //
 //            }
 
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<一卡通支付>"))
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
+        return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<一卡通支付>"))
     }
 
 
@@ -371,47 +326,34 @@
      * ============================================================================
      * */
     @PostMapping("/ykt/payfinish")
-    fun yktPayFinish(@RequestBody param: CitizenCardPayfinishParam, authentication: Authentication): ResponseEntity<Any> {
-        try {
-            if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authentication.name))) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-//
-//            var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+    fun yktPayFinish(@RequestBody param: CitizenCardPayfinishParam): ResponseEntity<Any> {
+//        var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+//                .setRefno(param.refno)
+//                .wip(personBalancePayService)
+//        val extendMap = consumePayService.getUserdtlExtendParamMap(dtl.refno)
+//        val code = CallService.callYktPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_YKT_CARD, dtl.shopaccno, dtl.userid == null),
+//                dtl, DateUtil.getNow(), extendMap["stuempno"]!!, extendMap["yktshopid"]!!, extendMap["devphyid"])
+//        if (code.retcode == "0") {
+//            dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
 //                    .setRefno(param.refno)
-//                    .wip(personBalancePayService)
-//            val extendMap = consumePayService.getUserdtlExtendParamMap(dtl.refno)
-//            val code = CallService.callYktPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_YKT_CARD, dtl.shopaccno, dtl.userid == null),
-//                    dtl, DateUtil.getNow(), extendMap["stuempno"]!!, extendMap["yktshopid"]!!, extendMap["devphyid"])
-//            if (code.retcode == "0") {
-//                dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-//                        .setRefno(param.refno)
-//                        .addResult(code.data)
-//                        .success(personBalancePayService) //流水置成功
+//                    .addResult(code.data)
+//                    .success(personBalancePayService) //流水置成功
 //
-//                return ResponseEntity.ok(ResponseBodyBuilder.create()
-//                        .data("refno", dtl.refno)
-//                        .data("billno", dtl.outtradeno)
-//                        .success())
-//            } else {
-//                PersonTransBuilder.newBuilder(accountUtilServcie)
-//                        .setRefno(param.refno)
-//                        .addResult("errmsg", code.retmsg!!)
-//                        .finish(personBalancePayService, TradeDict.DTL_STATUS_FAIL) //流水置成功
+//            return ResponseEntity.ok(ResponseBodyBuilder.create()
+//                    .data("refno", dtl.refno)
+//                    .data("billno", dtl.outtradeno)
+//                    .success())
+//        } else {
+//            PersonTransBuilder.newBuilder(accountUtilServcie)
+//                    .setRefno(param.refno)
+//                    .addResult("errmsg", code.retmsg!!)
+//                    .finish(personBalancePayService, TradeDict.DTL_STATUS_FAIL) //流水置成功
 //
-//                return ResponseEntity.ok(ResponseBodyBuilder.create()
-//                        .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
-//            }
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败"))
-        } catch (ex: RequestParamCheckException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
+//            return ResponseEntity.ok(ResponseBodyBuilder.create()
+//                    .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
+//        }
+        return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败"))
     }
 
 // ============================================== //
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
index 1fa74f3..ec92ddc 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay.api.service
 
+import com.supwisdom.dlpay.api.domain.TTransactionMain
 import org.springframework.transaction.annotation.Propagation
 import org.springframework.transaction.annotation.Transactional
 
@@ -12,4 +13,7 @@
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true)
     fun getUserdtlExtendParamMap(refno: String): Map<String, String>
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true)
+    fun getTransactionMainDtl(refno: String?, billno: String?, shopaccno: String?): TTransactionMain?
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt
index 3eb78fd..f367feb 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt
@@ -3,8 +3,11 @@
 import com.supwisdom.dlpay.api.dao.SourceTypeDao
 import com.supwisdom.dlpay.api.dao.ShopPaytypeConfigDao
 import com.supwisdom.dlpay.api.dao.ShopPaytypeDao
+import com.supwisdom.dlpay.api.dao.TransactionMainDao
+import com.supwisdom.dlpay.api.domain.TTransactionMain
 import com.supwisdom.dlpay.api.service.ConsumePayService
 import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.util.StringUtil
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
 import com.supwisdom.dlpay.util.ConstantUtil
 import org.springframework.beans.factory.annotation.Autowired
@@ -18,6 +21,8 @@
     lateinit var shopPaytypeDao: ShopPaytypeDao
     @Autowired
     lateinit var shopPaytypeConfigDao: ShopPaytypeConfigDao
+    @Autowired
+    lateinit var transactionMainDao: TransactionMainDao
 
     override fun checkShopPaytype(shopaccno: String, sourceType: String, anonymousflag: Boolean?): Boolean {
         sourceTypeDao.getBySourceType(sourceType).let {
@@ -91,7 +96,16 @@
                 ?: throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$paytype]未配置参数")
     }
 
+    override fun getTransactionMainDtl(refno: String?, billno: String?, shopaccno: String?): TTransactionMain? {
+        return when (!StringUtil.isEmpty(refno)) {
+            true -> transactionMainDao.findByRefno(refno)
+            false -> transactionMainDao.findByBillno(billno, shopaccno)
+        }
+    }
+
     override fun getUserdtlExtendParamMap(refno: String): Map<String, String> {
         TODO("未实现方法")
     }
+
+
 }
\ No newline at end of file
