撤销退款接口原型
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