定义接口
diff --git a/src/main/java/com/supwisdom/dlpay/exception/TransactionDataError.java b/src/main/java/com/supwisdom/dlpay/exception/TransactionDataError.java
new file mode 100644
index 0000000..747f613
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/exception/TransactionDataError.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.exception;
+
+public class TransactionDataError extends Error {
+  public TransactionDataError(int errCode, String message) {
+    super(String.format("E-%d : %s", errCode, message));
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/PaydtlDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/PaydtlDao.java
new file mode 100644
index 0000000..84affc8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/PaydtlDao.java
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.consume.domain.TPaydtl;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface PaydtlDao extends JpaRepository<TPaydtl, String> {
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
new file mode 100644
index 0000000..1cc2119
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
@@ -0,0 +1,35 @@
+package com.supwisdom.dlpay.framework.util;
+
+public class TradeErrorCode {
+
+  public static final int OK = 0;
+
+  /**
+   * 10000 开始表示交易数据错误
+   */
+  public static final int INPUT_DATA_ERROR = 100000;
+  /**
+   * 账户余额不足
+   */
+  public static final int SHORT_BALANCE_ERROR = 100001;
+
+  /**
+   * 个人账户状态异常
+   */
+  public static final int PERSON_STATUS_ERROR = 100002;
+
+  /**
+   * 交易记录不存在
+   */
+  public static final int TRANSACTION_NOT_EXISTS = 100003;
+
+  /**
+   * 交易状态已完成
+   */
+  public static final int TRANSACTION_IS_FINISHED = 100004;
+
+  /**
+   * 交易已冲正
+   */
+  public static final int TRANSACTION_HAS_CANCELED = 100005;
+}
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt
new file mode 100644
index 0000000..517a6d6
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt
@@ -0,0 +1,57 @@
+package com.supwisdom.dlpay.consume
+
+import com.supwisdom.dlpay.consume.domain.TAccount
+import com.supwisdom.dlpay.consume.domain.TPaydtl
+import com.supwisdom.dlpay.consume.domain.TPerson
+import com.supwisdom.dlpay.consume.service.PersonBalancePayService
+
+class PersonBalancePayBuilder private constructor() {
+    companion object {
+        fun newBuilder() = PersonBalancePayBuilder()
+    }
+
+    lateinit var person: TPerson
+    lateinit var account: TAccount
+
+    var transDate = ""
+    var transTime = ""
+    var description = ""
+    val details = mutableListOf<PayDtlBuilder.PayDetail>()
+
+    fun setUserAndAcc(per: TPerson, acc: TAccount) {
+        this.person = per
+        this.account = acc
+    }
+
+    private fun prepareData() {
+
+    }
+
+    private fun preCheckAccount() {
+
+    }
+
+    /**
+     * 单步交易,一次完成交易记账过程
+     * @param service
+     * @param isFinished - true : 完成交易过程,扣除账户余额; false - 完成检查
+     */
+    fun done(service: PersonBalancePayService, isFinished: Boolean): TPaydtl {
+        prepareData()
+        preCheckAccount()
+        return service.process(this)
+    }
+
+    /**
+     * 两步交易,在 paydtl 基础完成确认过程
+     * @param paydtl
+     * @param status - 完成交易状态,见 TradeDict.DTL_STATUS_FAIL
+     */
+    fun done(paydtl: TPaydtl, status: String, service: PersonBalancePayService): TPaydtl {
+        TODO("finish")
+    }
+
+    fun done(refno: String, status: String, service: PersonBalancePayService): TPaydtl {
+        TODO("add process")
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt
new file mode 100644
index 0000000..217ed47
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt
@@ -0,0 +1,45 @@
+package com.supwisdom.dlpay.consume.service.impl
+
+import com.supwisdom.dlpay.consume.PersonBalancePayBuilder
+import com.supwisdom.dlpay.consume.domain.TPaydtl
+import com.supwisdom.dlpay.consume.service.PersonBalancePayService
+import com.supwisdom.dlpay.exception.TransactionDataError
+import com.supwisdom.dlpay.framework.dao.PaydtlDao
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+
+@Service
+class PersonBalancePayServiceImpl : PersonBalancePayService {
+    @Autowired
+    lateinit var paydtlDao: PaydtlDao
+
+    override fun init(builder: PersonBalancePayBuilder): TPaydtl {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun wip(paydtl: TPaydtl, builder: PersonBalancePayBuilder): TPaydtl {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun wip(refno: String, builder: PersonBalancePayBuilder): TPaydtl {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun finish(paydtl: TPaydtl, status: String, builder: PersonBalancePayBuilder): TPaydtl {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun finish(refno: String, status: String, builder: PersonBalancePayBuilder): TPaydtl {
+        paydtlDao.findById(refno).let {
+            if (it.isPresent) {
+                return finish(it.get(), status, builder)
+            }
+            throw TransactionDataError(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易参考号<$refno>不存在")
+        }
+    }
+
+    override fun process(builder: PersonBalancePayBuilder): TPaydtl {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt
new file mode 100644
index 0000000..2d559ea
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt
@@ -0,0 +1,31 @@
+package com.supwisdom.dlpay.consume.service
+
+import com.supwisdom.dlpay.consume.PersonBalancePayBuilder
+import com.supwisdom.dlpay.consume.domain.TPaydtl
+
+interface PersonBalancePayService {
+
+    /**
+     * 一步完成交易
+     */
+    fun process(builder: PersonBalancePayBuilder): TPaydtl
+
+    /**
+     * 两步交易,交易初始化方法,检查交易参数,记录交易流水
+     */
+    fun init(builder: PersonBalancePayBuilder): TPaydtl
+
+    /**
+     * 两步交易,交易过程中判断交易状态,并更新交易状态为 wip
+     */
+    fun wip(paydtl: TPaydtl, builder: PersonBalancePayBuilder): TPaydtl
+
+    fun wip(refno: String, builder: PersonBalancePayBuilder): TPaydtl
+
+    /**
+     * 两步交易,完成交易过程,包括更新交易状态(成功、失败),更新借贷双方余额
+     */
+    fun finish(paydtl: TPaydtl, status: String, builder: PersonBalancePayBuilder): TPaydtl
+
+    fun finish(refno: String, status: String, builder: PersonBalancePayBuilder): TPaydtl
+}
\ No newline at end of file