chore: 测试了撤销和退款业务流程
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java b/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
index 9b145e0..bf9ac18 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
@@ -311,32 +311,24 @@
         creditSum += dtl.getAmount();
       }
     }
-    int balanceFlag = 2;
-    if (Subject.SUBJNO_MACHANT_INCOME.equals(subjno)) {
-      balanceFlag = 2;
-    } else if (Subject.SUBJNO_PERSONAL_DEPOSIT.equals(subjno)) {
-      balanceFlag = 2;
-    } else if (subjno.startsWith("1")) {
-      balanceFlag = 1;
-    }
-    if ("debit".equals(debitOrCredit)) {
-      if (balanceFlag == 2) {
+    if (Subject.SUBJNO_MACHANT_INCOME.equals(subjno)
+        || Subject.SUBJNO_PERSONAL_DEPOSIT.equals(subjno)) {
+      if ("debit".equals(debitOrCredit)) {
         return -debitSum;
-      } else {
-        return debitSum;
-      }
-    } else if ("credit".equals(debitOrCredit)) {
-      if (balanceFlag == 1) {
-        return -creditSum;
-      } else {
+      } else if ("credit".equals(debitOrCredit)) {
         return creditSum;
-      }
-    } else {
-      if (balanceFlag == 2) {
-        return -(debitSum - creditSum);
       } else {
         return debitSum - creditSum;
       }
+    } else if (subjno.startsWith("1")) {
+      if ("debit".equals(debitOrCredit)) {
+        return debitSum;
+      } else if ("credit".equals(debitOrCredit)) {
+        return -creditSum;
+      } else {
+        return creditSum - debitSum;
+      }
     }
+    return 0.0;
   }
 }
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 3c749af..da8c986 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
@@ -88,7 +88,7 @@
                 description = "账户充值"
             }.person(account).apply {
                 setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
-                this.opposite = AccountProxy(rechargeDrsubjno)
+                setOpposite(AccountProxy(rechargeDrsubjno))
             }.and().addDebitCreditRecord(AccountProxy(rechargeDrsubjno), AccountProxy(account),
                     param.amount / 100.0, "账户充值")
                     .also { builder ->
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 4530820..9e0ebd5 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
@@ -4,13 +4,11 @@
 import com.supwisdom.dlpay.api.CallService
 import com.supwisdom.dlpay.api.TransactionBuilder
 import com.supwisdom.dlpay.api.bean.*
-import com.supwisdom.dlpay.api.dao.TransactionMainDao
 import com.supwisdom.dlpay.api.service.AccountUtilServcie
 import com.supwisdom.dlpay.api.service.ConsumePayService
 import com.supwisdom.dlpay.api.service.TransactionServiceProxy
 import com.supwisdom.dlpay.api.service.UserService
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
-import com.supwisdom.dlpay.framework.service.CommonService
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.Subject
 import com.supwisdom.dlpay.framework.util.TradeCode
@@ -81,10 +79,10 @@
                 description = "账户余额消费"
             }.person(account).apply {
                 setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
-                opposite = AccountProxy(shopacc)
+                setOpposite(AccountProxy(shopacc))
             }.and().shop(shopacc).apply {
                 setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
-                opposite = AccountProxy(account)
+                setOpposite(AccountProxy(account))
             }.and().addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc),
                     param.amount / 100.0, "账户余额消费")
                     .also {
@@ -153,10 +151,10 @@
                 description = "市民卡代扣消费"
             }.person(account).apply {
                 setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
-                opposite = AccountProxy(shopacc)
+                setOpposite(AccountProxy(shopacc))
             }.and().shop(shopacc).apply {
                 setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN)
-                opposite = AccountProxy(account)
+                setOpposite(AccountProxy(account))
             }.and().addDebitCreditRecord(AccountProxy(subject), AccountProxy(account),
                     param.amount / 100.0, "市民卡代扣消费")
                     .addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc),
@@ -250,6 +248,7 @@
             }
             transactionService.success(cancelTrans.refno)
             return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .data("refno", cancelTrans.refno)
                     .success("交易确认成功"))
         } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
                 .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
@@ -275,6 +274,7 @@
             }
             transactionService.success(refundTrans.refno)
             return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .data("refno", refundTrans.refno)
                     .success("交易确认成功"))
         } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
                 .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
index 1f9f468..ad6b740 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
@@ -50,6 +50,18 @@
         builder.preCheck()
     }
 
+    private fun getDebitOrCredit(tradeFlag: String, reverseTrans: Boolean): String {
+        return when (tradeFlag) {
+            TradeDict.TRADE_FLAG_IN -> if (!reverseTrans) "credit" else "debit"
+            TradeDict.TRADE_FLAG_OUT -> if (!reverseTrans) "debit" else "credit"
+            else -> "both"
+        }
+    }
+
+    private fun getTransAmountFromDetail(builder: TransactionBuilder, amount: Double): Double {
+        return amount
+    }
+
     private fun builderRecords(builder: TransactionBuilder, status: String): TTransactionMain {
         try {
             preCheck(builder)
@@ -68,7 +80,8 @@
                 reverseFlag = builder.reverseType
                 checkable = sourceType.checkable
                 transCode = builder.transCode
-                reverseType = TradeDict.REVERSE_FLAG_NONE
+                reverseType = builder.reverseType
+                reverseRefno = builder.reverseRefno
                 refundAmount = 0.0
                 checkDate = null
                 settleDate = null
@@ -86,18 +99,14 @@
                     transdate = builder.transDate
                     transtime = builder.transTime
                     befbal = builder.person().person.availbal
-                    amount = if (builder.person().tradeFlag == TradeDict.TRADE_FLAG_IN) {
-                        builder.person().amount
-                    } else {
-                        -builder.person().amount
-                    }
+                    amount = builder.person().amount
                     this.sourceType = builder.sourceType
                     payinfo = builder.person().payinfo
                     transcode = builder.transCode
                     tradeflag = builder.person().tradeFlag
                     transdesc = builder.person().description
-                    oppositeAccNo = builder.person().opposite.getAccountNo()
-                    oppositeAccName = builder.person().opposite.getAccountName()
+                    oppositeAccNo = builder.person().oppositeAccNo()
+                    oppositeAccName = builder.person().oppositeSubjNo()
                     this.reverseFlag = TradeDict.REVERSE_FLAG_NONE
                     remark = builder.person().remark
                     this.status = status
@@ -118,17 +127,13 @@
                     this.transtime = builder.transTime
                     this.transcode = builder.transCode
                     this.sourceType = builder.sourceType
-                    amount = if (builder.shop().tradeFlag == TradeDict.TRADE_FLAG_IN) {
-                        builder.shop().amount
-                    } else {
-                        -builder.shop().amount
-                    }
+                    this.amount = builder.shop().amount
                     this.tradeflag = builder.shop().tradeFlag
                     this.shopaccno = builder.shop().shopacc.shopaccno
                     this.shopname = builder.shop().shopacc.shopname
                     this.transdesc = builder.shop().description
-                    this.oppositeAccNo = builder.shop().opposite.getAccountNo()
-                    this.oppositeAccName = builder.shop().opposite.getAccountName()
+                    this.oppositeAccNo = builder.shop().oppositeAccNo()
+                    this.oppositeAccName = builder.shop().oppositeSubjNo()
                     this.remark = builder.shop().remark
                     this.reverseFlag = TradeDict.REVERSE_FLAG_NONE
                     this.updateBala = false
@@ -150,8 +155,8 @@
                     this.tradeCode = builder.transCode
                     this.transDate = builder.transDate
                     this.transTime = builder.transTime
-                    this.oppositeAccNo = builder.subject().opposite.getAccountNo()
-                    this.oppositeAccName = builder.subject().opposite.getAccountName()
+                    this.oppositeAccNo = builder.subject().oppositeAccNo()
+                    this.oppositeAccName = builder.subject().oppositeSubjNo()
                     this.status = status
                 }.also {
                     transaction.subjectDtl = it
@@ -163,10 +168,10 @@
                 TDebitCreditDtl().apply {
                     this.refno = transaction.refno
                     this.seqno = line.seqno
-                    this.draccno = line.debit.getAccountNo()
-                    this.drsubjno = line.debit.getSubjectNo()
-                    this.craccno = line.credit.getAccountNo()
-                    this.crsubjno = line.credit.getSubjectNo()
+                    this.draccno = line.debitAccNo
+                    this.drsubjno = line.debitSubjNo
+                    this.craccno = line.creditAccNo
+                    this.crsubjno = line.creditSubjNo
                     this.amount = line.amount
                     this.summary = line.summary
                     this.settleDate = null
@@ -177,11 +182,11 @@
 
 
             if (builder.hasPerson()) {
-                val dc = getDebitOrCredit(builder.person().tradeFlag)
+                val dc = getDebitOrCredit(builder.person().tradeFlag, builder.isReverseTrans())
                 transaction.sumAmountByAccno(builder.person().person.accno,
                         Subject.SUBJNO_PERSONAL_DEPOSIT,
                         dc).also {
-                    if (transaction.personDtl.amount != it) {
+                    if (transaction.personDtl.amount != getTransAmountFromDetail(builder, it)) {
                         throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR,
                                 "输入金额错误,个人余额不符<${transaction.personDtl.amount}>")
                     }
@@ -189,10 +194,10 @@
             }
 
             if (builder.hasShop()) {
-                val dc = getDebitOrCredit(builder.shop().tradeFlag)
+                val dc = getDebitOrCredit(builder.shop().tradeFlag, builder.isReverseTrans())
                 transaction.sumAmountByAccno(builder.shop().shopacc.shopaccno,
                         Subject.SUBJNO_MACHANT_INCOME, dc).also {
-                    if (transaction.shopDtl.amount != it) {
+                    if (transaction.shopDtl.amount != getTransAmountFromDetail(builder, it)) {
                         throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR,
                                 "输入金额错误,商户余额不符<${transaction.shopDtl.amount}>")
                     }
@@ -202,7 +207,12 @@
             if (builder.hasSubject()) {
                 transaction.sumAmountByAccno(builder.subject().subject.subjno,
                         builder.subject().subject.subjno, "both").also {
-                    if (transaction.subjectDtl.amount != it) {
+                    val amount = if (builder.reverseType != TradeDict.REVERSE_FLAG_NONE) {
+                        -it
+                    } else {
+                        it
+                    }
+                    if (transaction.subjectDtl.amount != amount) {
                         throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR,
                                 "输入金额错误,科目余额不符<${transaction.subjectDtl.amount}>")
                     }
@@ -217,13 +227,6 @@
         }
     }
 
-    private fun getDebitOrCredit(tradeFlag: String): String {
-        return when (tradeFlag) {
-            TradeDict.TRADE_FLAG_IN -> "credit"
-            TradeDict.TRADE_FLAG_OUT -> "debit"
-            else -> "both"
-        }
-    }
 
     private fun updateRecordStatus(transaction: TTransactionMain, status: String) {
         if (transaction.person) {
@@ -262,7 +265,7 @@
     }
 
     /////////////////////////////////////////////////////////////////////
-    // 业务接口
+// 业务接口
     override fun init(builder: TransactionBuilder): TTransactionMain {
         return builderRecords(builder, TradeDict.DTL_STATUS_INIT)
     }
@@ -311,7 +314,7 @@
     }
 
     //////////////////////////////////////////////////////////////////
-    // 成功
+// 成功
     private fun transactionOnSuccess(transaction: TTransactionMain, remark: String, overdraft: Boolean) {
         if (transaction.person) {
             // update account balance
@@ -362,9 +365,29 @@
     }
 
     //////////////////////////////////////////////////////////////////
-    // 回退业务接口,包括撤销和退款
-    override fun refundInit(originRefno: String, builder: TransactionBuilder): TTransactionMain {
-        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+// 回退业务接口,包括撤销和退款
+    override fun refundInit(originRefno: String, refundAmount: Double, builder: TransactionBuilder): TTransactionMain {
+        val originTrans = transactionMainDao.findByRefnoForUpdate(originRefno)
+                ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS
+                        , "被退款流水不存在")
+        if (originTrans.status != TradeDict.DTL_STATUS_SUCCESS) {
+            throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
+                    "原流水不是成功状态")
+        }
+        if (originTrans.reverseFlag != TradeDict.REVERSE_FLAG_NONE
+                || originTrans.reverseFlag != TradeDict.REVERSE_FLAG_REFUND) {
+            throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR,
+                    "原流水已被退款")
+        }
+
+        doReversePrepareAndCheck(originTrans, builder)
+        builder.preCheck()
+        val transaction = doReverseProcess(originTrans, builder)
+
+        originTrans.reverseFlag = TradeDict.REVERSE_FLAG_REFUND
+        originTrans.refundAmount = refundAmount
+        transactionMainDao.save(originTrans)
+        return transaction
     }
 
     override fun cancelInit(originRefno: String, builder: TransactionBuilder): TTransactionMain {
@@ -380,9 +403,7 @@
                     "原流水已被冲正")
         }
 
-        doReversePreCheck(originTrans, builder)
-
-        builder.preCheck()
+        doReversePrepareAndCheck(originTrans, builder)
         val transaction = doReverseProcess(originTrans, builder)
 
         originTrans.reverseFlag = TradeDict.REVERSE_FLAG_CANCEL
@@ -391,10 +412,19 @@
     }
 
     private fun getOppositeTradeFlag(flag: String): String {
-        return if (flag == TradeDict.TRADE_FLAG_IN) {
-            TradeDict.TRADE_FLAG_OUT
-        } else {
-            TradeDict.TRADE_FLAG_IN
+        return when (flag) {
+            TradeDict.TRADE_FLAG_IN -> TradeDict.TRADE_FLAG_OUT
+            TradeDict.TRADE_FLAG_OUT -> TradeDict.TRADE_FLAG_IN
+            else -> "unknown"
+        }
+    }
+
+    private fun getReverseSuffix(t: String): String {
+        return when (t) {
+            TradeDict.REVERSE_FLAG_CANCEL -> "撤销"
+            TradeDict.REVERSE_FLAG_REFUND -> "退款"
+            TradeDict.REVERSE_FLAG_NONE -> ""
+            else -> ""
         }
     }
 
@@ -403,33 +433,41 @@
         if (originTrans.person) {
             builder.person().apply {
                 setAmount(-originTrans.personDtl.amount, getOppositeTradeFlag(originTrans.personDtl.tradeflag))
-                opposite = AccountProxy(builder.shop().shopacc)
+                setOpposite(AccountProxy(builder.shop().shopacc))
             }
         }
         if (originTrans.shop) {
             builder.shop().apply {
                 setAmount(-originTrans.shopDtl.amount, getOppositeTradeFlag(originTrans.shopDtl.tradeflag))
-                opposite = AccountProxy(builder.person().person)
+                setOpposite(AccountProxy(builder.person().person))
             }
         }
-        TODO("")
-//        originTrans.details.forEach {
-//            builder.addDebitCreditRecord()
-//        }
+        val summarySuffix = getReverseSuffix(builder.reverseType)
+        originTrans.details.forEach {
+            builder.addDebitCreditRecord(it.draccno, it.drsubjno, it.craccno, it.crsubjno,
+                    -it.amount, "${it.summary}$summarySuffix")
+        }
+        return builderRecords(builder, TradeDict.DTL_STATUS_INIT)
     }
 
-    private fun doReversePreCheck(originTrans: TTransactionMain, builder: TransactionBuilder) {
+    private fun doReversePrepareAndCheck(originTrans: TTransactionMain, builder: TransactionBuilder) {
         if (originTrans.person) {
             val account = accountDao.findByUserid(originTrans.personDtl.userid)
                     ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS,
                             "账户不存在")
-            builder.person(account)
+            builder.person(account).apply {
+                setAmount(-originTrans.personDtl.amount,
+                        getOppositeTradeFlag(originTrans.personDtl.tradeflag))
+            }
         }
         if (originTrans.shop) {
             val shopacc = shopaccDao.findByShopaccno(originTrans.shopDtl.shopaccno)
                     ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS,
                             "商户不存在")
-            builder.shop(shopacc)
+            builder.shop(shopacc).apply {
+                setAmount(-originTrans.shopDtl.amount,
+                        getOppositeTradeFlag(originTrans.shopDtl.tradeflag))
+            }
         }
 
         if (originTrans.subject) {
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
index 2eb1752..fff1a0e 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
@@ -36,7 +36,7 @@
      * 退款类业务
      */
     @Transactional
-    fun refundInit(originRefno: String, builder: TransactionBuilder): TTransactionMain
+    fun refundInit(originRefno: String, refundAmount: Double, builder: TransactionBuilder): TTransactionMain
 
     /**
      * 撤销业务
@@ -104,7 +104,11 @@
         return trans
     }
 
-    fun refund(originRefno: String, newRefno: String): TTransactionMain {
-        TODO("not implementation")
+    fun refund(originRefno: String, refundAmount: Double, builder: TransactionBuilder, confirm: Boolean): TTransactionMain {
+        val trans = transactionService.refundInit(originRefno, refundAmount, builder)
+        if (confirm) {
+            return success(trans.refno)
+        }
+        return trans
     }
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt b/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
index 45831a5..d47d40e 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
@@ -25,10 +25,29 @@
             return if (field.isEmpty()) parent.remark else field
         }
 
-    lateinit var opposite: AccountProxy<*>
+    private lateinit var oppAccno: String
+    private lateinit var oppSubjno: String
 
     fun hasOpposite(): Boolean {
-        return this::opposite.isInitialized
+        return this::oppAccno.isInitialized
+    }
+
+    fun oppositeAccNo(): String {
+        return this.oppAccno
+    }
+
+    fun oppositeSubjNo(): String {
+        return this.oppSubjno
+    }
+
+    fun setOpposite(accno: String, subjno: String) {
+        this.oppAccno = accno
+        this.oppSubjno = subjno
+    }
+
+    fun setOpposite(accout: AccountProxy<*>) {
+        this.oppAccno = accout.getAccountNo()
+        this.oppSubjno = accout.getSubjectNo()
     }
 
     fun and(): TransactionBuilder {
@@ -46,7 +65,7 @@
      * amount : 交易金额, 正向交易金额必须 >= 0, 冲正交易金额必须 <= 0
      */
     fun setAmount(amount: Double, inOut: String): SubTransactionBuilder<T> {
-        this.amount = amount
+        this.amount = if (inOut == TradeDict.TRADE_FLAG_IN) Math.abs(amount) else -Math.abs(amount)
         this.tradeFlag = inOut
         return this
     }
@@ -109,9 +128,15 @@
     }
 }
 
-data class DebitCreditLine(val debit: AccountProxy<*>, val credit: AccountProxy<*>,
-                           val amount: Double, val summary: String,
-                           val seqno: Int)
+class DebitCreditLine(val debitAccNo: String, val debitSubjNo: String,
+                      val creditAccNo: String, val creditSubjNo: String,
+                      val amount: Double, val summary: String, val seqno: Int) {
+    constructor(debit: AccountProxy<*>, credit: AccountProxy<*>,
+                amount: Double, summary: String, seqno: Int)
+            : this(debit.getAccountNo(), debit.getSubjectNo(),
+            credit.getAccountNo(), credit.getSubjectNo(),
+            amount, summary, seqno)
+}
 
 // 在 constructor 中加入 service 接口
 class TransactionBuilder {
@@ -178,6 +203,9 @@
     var reverseType: String = "none"
         private set
 
+    var reverseRefno: String = ""
+        private set
+
 
     // 以下属性可以在子表中不同
     var payinfo: String = ""
@@ -245,12 +273,21 @@
         return this
     }
 
+    fun addDebitCreditRecord(debitAccNo: String, debitSubjNo: String,
+                             creditAccNo: String, creditSubjNo: String,
+                             amount: Double, summary: String): TransactionBuilder {
+        debitCreditLines.add(DebitCreditLine(debitAccNo, debitSubjNo,
+                creditAccNo, creditSubjNo,
+                amount, summary, debitCreditLines.size + 1))
+        return this
+    }
+
     fun getAllDetails(): List<DebitCreditLine> {
         return debitCreditLines.toList()
     }
 
-    private fun checkAmount(amount: Double): Boolean {
-        return if (reverseType == TradeDict.REVERSE_FLAG_NONE) {
+    private fun checkAmount(amount: Double, tradeFlag: String): Boolean {
+        return if (tradeFlag == TradeDict.TRADE_FLAG_IN) {
             amount >= 0.0
         } else {
             amount <= 0.0
@@ -298,7 +335,7 @@
                     throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
                             "个人交易收支方向错误")
                 }
-                if (!checkAmount(it.amount)) {
+                if (!checkAmount(it.amount, it.tradeFlag)) {
                     throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
                             "个人交易金额不正确")
                 }
@@ -306,10 +343,10 @@
                     throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
                             "个人交易对方账户未设置")
                 }
-                if (it.payinfo.isEmpty()) {
-                    throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                            "个人交易信息未设置")
-                }
+//                if (it.payinfo.isEmpty()) {
+//                    throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+//                            "个人交易信息未设置")
+//                }
             }
         }
 
@@ -323,7 +360,7 @@
                     throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
                             "商户交易收支方向错误")
                 }
-                if (!checkAmount(it.amount)) {
+                if (!checkAmount(it.amount, it.tradeFlag)) {
                     throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
                             "商户交易金额不正确")
                 }
@@ -335,27 +372,36 @@
         }
     }
 
+
+    fun isReverseTrans(): Boolean {
+        return this.reverseType != TradeDict.REVERSE_FLAG_NONE
+    }
+
     fun init(transactionService: TransactionServiceProxy): TTransactionMain {
         return transactionService.init(this)
     }
 
     fun refund(originRefno: String, amount: Double, transactionService: TransactionServiceProxy): TTransactionMain {
         this.reverseType = TradeDict.REVERSE_FLAG_REFUND
-        return transactionService.refund(originRefno, "")
+        this.reverseRefno = originRefno
+        return transactionService.refund(originRefno, amount, this, true)
     }
 
     fun refundInit(originRefno: String, amount: Double, transactionService: TransactionServiceProxy): TTransactionMain {
         this.reverseType = TradeDict.REVERSE_FLAG_REFUND
-        return transactionService.refund(originRefno, "")
+        this.reverseRefno = originRefno
+        return transactionService.refund(originRefno, amount, this, false)
     }
 
     fun cancel(originRefno: String, transactionService: TransactionServiceProxy): TTransactionMain {
         this.reverseType = TradeDict.REVERSE_FLAG_CANCEL
+        this.reverseRefno = originRefno
         return transactionService.cancel(originRefno, this, true)
     }
 
     fun cancelInit(originRefno: String, transactionService: TransactionServiceProxy): TTransactionMain {
         this.reverseType = TradeDict.REVERSE_FLAG_CANCEL
+        this.reverseRefno = originRefno
         return transactionService.cancel(originRefno, this, false)
     }