diff --git a/src/main/java/com/supwisdom/dlpay/consume/service/impl/PaytypeServiceImpl.java b/src/main/java/com/supwisdom/dlpay/consume/service/impl/PaytypeServiceImpl.java
index 5aad223..1c99381 100644
--- a/src/main/java/com/supwisdom/dlpay/consume/service/impl/PaytypeServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/consume/service/impl/PaytypeServiceImpl.java
@@ -17,23 +17,23 @@
  */
 @Service
 public class PaytypeServiceImpl implements PaytypeService {
-    @Autowired
-    private PaytypeDao paytypeDao;
-    @Autowired
-    private PaytypeConfigDao paytypeConfigDao;
+  @Autowired
+  private PaytypeDao paytypeDao;
+  @Autowired
+  private PaytypeConfigDao paytypeConfigDao;
 
-    @Override
-    public TPaytype getByPaytype(String paytype) {
-        return paytypeDao.getOne(paytype);
-    }
+  @Override
+  public TPaytype getByPaytype(String paytype) {
+    return paytypeDao.getOne(paytype);
+  }
 
-    @Override
-    public Map<String, String> getPaytypeConfigByPaytype(String pattype) {
-        List<TPaytypeConfig> list = paytypeConfigDao.getByPaytype(pattype);
-        Map<String, String> map = new HashMap<>(list.size());
-        for (TPaytypeConfig paytypeConfig : list) {
-            map.put(paytypeConfig.getConfigid(), paytypeConfig.getConfigValue());
-        }
-        return map;
+  @Override
+  public Map<String, String> getPaytypeConfigByPaytype(String pattype) {
+    List<TPaytypeConfig> list = paytypeConfigDao.getByPaytype(pattype);
+    Map<String, String> map = new HashMap<>(list.size());
+    for (TPaytypeConfig paytypeConfig : list) {
+      map.put(paytypeConfig.getConfigid(), paytypeConfig.getConfigValue());
     }
+    return map;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java
index 71940c4..b2638c1 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java
@@ -1,6 +1,5 @@
 package com.supwisdom.dlpay.framework.dao;
 
-import com.supwisdom.dlpay.framework.data.AmountBean;
 import com.supwisdom.dlpay.framework.data.MerchBean;
 import com.supwisdom.dlpay.framework.data.SubjectInfoBean;
 import com.supwisdom.dlpay.framework.domain.TSubjectbal;
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java b/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java
index ede84de..32718c2 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java
@@ -17,6 +17,15 @@
    */
   public static final String SUBJ_CHEQUE = "1003";
 
+  /**
+   * 一卡通支付款
+   */
+  public static final String SUBJ_PAY_YKT = "112240";
+
+  /**
+   * 折扣预存款
+   */
+  public static final String SUBJ_DISCOUNT_PRE_DEPOSIT = "2003";
   // 负债类科目
 
   /**
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt
index 0a93fd2..de02e7b 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt
@@ -7,6 +7,8 @@
 import com.supwisdom.dlpay.consume.service.PaytypeService
 import com.supwisdom.dlpay.consume.service.PersonBalancePayService
 import com.supwisdom.dlpay.consume.service.PersonService
+import com.supwisdom.dlpay.exception.TransactionException
+import com.supwisdom.dlpay.framework.ResponseBodyBuilder
 import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.util.PaytypeUtil
 import org.springframework.beans.factory.annotation.Autowired
@@ -69,35 +71,44 @@
                    stuempno: String, shopid: String, transdate: String, transtime: String,
                    outtradeno: String, payinfo: String, feetype: String): ResponseEntity<Any> {
         //一卡通支付款 112240
-        val person = personService.getPersonByThirdUniqueIdenty(stuempno)
-        val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-                .setTransDatetime(transdate, transtime)
-                .selectPaytype(PaytypeUtil.YKTPAY, payinfo)
-                .setOuttradeno(outtradeno)
-                .setOwner(person)
-                .setTransinfo(TradeCode.TRANSCODE_YKTPAY, "一卡通支付")
-                .chooseTradetype(Tradetype.CONSUME)
-                .also {
-                    when (feetype) {
-                        TradeDict.FEETYPE_CONSUME_MEALER -> {
-                            it.addDetail(AccountHolder.subject("112240"),
-                                    AccountHolder.shop(shopid),
-                                    amount / 100.0, "一卡通支付")
-                                    .addDetail(AccountHolder.subject("112240"),
-                                            AccountHolder.subject(Subject.SUBJ_MACHANT_INCOME),
-                                            manageFee / 100.0, "收搭伙费")
+        return try {
+            val person = personService.getPersonByThirdUniqueIdenty(stuempno)
+            val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+                    .setTransDatetime(transdate, transtime)
+                    .selectPaytype(PaytypeUtil.YKTPAY, payinfo)
+                    .setOuttradeno(outtradeno)
+                    .setOwner(person)
+                    .setTransinfo(TradeCode.TRANSCODE_YKTPAY, "一卡通支付")
+                    .chooseTradetype(Tradetype.CONSUME)
+                    .also {
+                        when (feetype) {
+                            TradeDict.FEETYPE_CONSUME_MEALER -> {
+                                it.addDetail(AccountHolder.subject(Subject.SUBJ_PAY_YKT),
+                                        AccountHolder.shop(shopid),
+                                        amount / 100.0, "一卡通支付")
+                                        .addDetail(AccountHolder.subject(Subject.SUBJ_PAY_YKT),
+                                                AccountHolder.subject(Subject.SUBJ_MACHANT_INCOME),
+                                                manageFee / 100.0, "收搭伙费")
+                            }
+                            TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
+                                it.addDetail(AccountHolder.subject(Subject.SUBJ_PAY_YKT),
+                                        AccountHolder.shop(shopid),
+                                        (amount - manageFee) / 100.0, "一卡通支付")
+                                        .addDetail(AccountHolder.subject(Subject.SUBJ_DISCOUNT_PRE_DEPOSIT),
+                                                AccountHolder.shop(shopid),
+                                                manageFee / 100.0, "优惠折扣")
+                            }
                         }
-                        TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
-                            it.addDetail(AccountHolder.subject("112240"),
-                                    AccountHolder.shop(shopid),
-                                    (amount - manageFee) / 100.0, "一卡通支付")
-                                    .addDetail(AccountHolder.subject("2003"),
-                                            AccountHolder.shop(shopid),
-                                            manageFee / 100.0, "优惠折扣")
-                        }
-                    }
-                }.done(personBalancePayService, false)
-        return ResponseEntity.ok(dtl)
+                    }.done(personBalancePayService, false)
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .success()
+                    .data("refno", dtl.refno)
+                    .build())
+        } catch (e: TransactionException) {
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .exception(99, e, "查询异常")
+                    .build())
+        }
     }
 
     @PostMapping("/ykt/payfinish")
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
new file mode 100644
index 0000000..67e22d6
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
@@ -0,0 +1,48 @@
+package com.supwisdom.dlpay.framework
+
+import com.supwisdom.dlpay.exception.TransactionCheckException
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+
+class ResponseBodyBuilder private constructor() {
+    companion object {
+        private const val INVALIDE_RETCODE = -0x7FFFFFFF
+        fun create() = ResponseBodyBuilder()
+    }
+
+    private var retCode = INVALIDE_RETCODE
+    private var retMsg = ""
+
+    private val respData = mutableMapOf<String, Any>()
+
+    fun result(code: Int, msg: String? = null): ResponseBodyBuilder {
+        this.retCode = code
+        retMsg = if (retCode == 0) {
+            msg ?: "成功"
+        } else {
+            msg ?: "失败"
+        }
+        return this
+    }
+
+    fun success(msg: String? = null): ResponseBodyBuilder {
+        result(0, msg)
+        return this
+    }
+
+    fun exception(code: Int, exception: Exception, msg: String? = null): ResponseBodyBuilder {
+        data("exception", exception.message ?: "$exception")
+        return result(code, msg)
+    }
+
+    fun data(name: String, value: Any): ResponseBodyBuilder {
+        this.respData[name] = value
+        return this
+    }
+
+    fun build(): Map<String, Any> {
+        if (retCode == INVALIDE_RETCODE) {
+            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "未设置返回码!")
+        }
+        return this.respData.plus(mapOf("retcode" to retCode, "retmsg" to retMsg))
+    }
+}
\ No newline at end of file
