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)
     }
 
