设计记账模块接口,未实现接口细节
diff --git a/src/main/java/com/supwisdom/dlpay/exception/TransactionCheckError.java b/src/main/java/com/supwisdom/dlpay/exception/TransactionCheckError.java
deleted file mode 100644
index e834318..0000000
--- a/src/main/java/com/supwisdom/dlpay/exception/TransactionCheckError.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.supwisdom.dlpay.exception;
-
-public class TransactionCheckError extends TransactionError {
-  public TransactionCheckError(int code, String message) {
-    super(code, String.format("C - %d, %s", code, message));
-  }
-}
diff --git a/src/main/java/com/supwisdom/dlpay/exception/TransactionCheckException.java b/src/main/java/com/supwisdom/dlpay/exception/TransactionCheckException.java
new file mode 100644
index 0000000..87b9ad1
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/exception/TransactionCheckException.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.exception;
+
+public class TransactionCheckException extends TransactionException {
+  public TransactionCheckException(int code, String message) {
+    super(code, String.format("C - %d, %s", code, message));
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/exception/TransactionError.java b/src/main/java/com/supwisdom/dlpay/exception/TransactionError.java
deleted file mode 100644
index fb247c5..0000000
--- a/src/main/java/com/supwisdom/dlpay/exception/TransactionError.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.supwisdom.dlpay.exception;
-
-public class TransactionError extends Error {
-  private int errCode;
-
-  public TransactionError(int code, String message) {
-    super(message);
-    errCode = code;
-  }
-
-  public int code() {
-    return this.errCode;
-  }
-}
diff --git a/src/main/java/com/supwisdom/dlpay/exception/TransactionException.java b/src/main/java/com/supwisdom/dlpay/exception/TransactionException.java
new file mode 100644
index 0000000..e84657e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/exception/TransactionException.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.exception;
+
+public class TransactionException extends Exception {
+  private int errCode;
+
+  public TransactionException(int code, String message) {
+    super(message);
+    errCode = code;
+  }
+
+  public int code() {
+    return this.errCode;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/exception/TransactionProcessError.java b/src/main/java/com/supwisdom/dlpay/exception/TransactionProcessError.java
deleted file mode 100644
index 44b9d80..0000000
--- a/src/main/java/com/supwisdom/dlpay/exception/TransactionProcessError.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.supwisdom.dlpay.exception;
-
-public class TransactionProcessError extends TransactionError {
-  public TransactionProcessError(int errCode, String message) {
-    super(errCode, String.format("E-%d : %s", errCode, message));
-  }
-}
diff --git a/src/main/java/com/supwisdom/dlpay/exception/TransactionProcessException.java b/src/main/java/com/supwisdom/dlpay/exception/TransactionProcessException.java
new file mode 100644
index 0000000..aac9273
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/exception/TransactionProcessException.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.exception;
+
+public class TransactionProcessException extends TransactionException {
+  public TransactionProcessException(int errCode, String message) {
+    super(errCode, String.format("E-%d : %s", errCode, message));
+  }
+}
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt
index b5c73a4..cb10e5f 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt
@@ -3,35 +3,75 @@
 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.AccountUtilServcie
 import com.supwisdom.dlpay.consume.service.PersonBalancePayService
-import com.supwisdom.dlpay.exception.TransactionCheckError
-import com.supwisdom.dlpay.exception.TransactionProcessError
-import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import com.supwisdom.dlpay.framework.domain.TShopacc
+import com.supwisdom.dlpay.framework.domain.TSubject
+import com.supwisdom.dlpay.framework.domain.TTranstype
 
-class PersonTransBuilder private constructor() {
+class AccountHolder<out T> private constructor(val accountId: String, val idType: Int) {
     companion object {
-        fun newBuilder() = PersonTransBuilder()
+        const val IDTYPE_ACCOUNT = 1
+        const val IDTYPE_SHOP = 2
+        const val IDTYPE_SUBJECT = 3
+        const val IDTYPE_TRANSTYPE = 4
+
+        fun person(userid: String): AccountHolder<TAccount> {
+            return AccountHolder<TAccount>(userid, IDTYPE_ACCOUNT)
+        }
+
+        fun shop(shopid: String): AccountHolder<TShopacc> {
+            return AccountHolder<TShopacc>(shopid, IDTYPE_SHOP)
+        }
+
+        fun subject(subjNo: String): AccountHolder<TSubject> {
+            return AccountHolder(subjNo, IDTYPE_SUBJECT)
+        }
+
+        fun transType(transType: Int): AccountHolder<TTranstype> {
+            return AccountHolder("$transType", IDTYPE_TRANSTYPE)
+        }
     }
 
-    inner class TransDetail(val accNo: String, val amount: Double,
-                            val summary: String, val rowno: Int)
+    internal lateinit var build: PersonTransBuilder
 
+    fun get(): T {
+        TODO("add rule")
+    }
+
+    fun withLock(nowait: Boolean): T {
+        TODO("not implement")
+    }
+}
+
+class PersonTransBuilder private constructor(accUitl: AccountUtilServcie) {
+    companion object {
+        fun newBuilder(accUitl: AccountUtilServcie) = PersonTransBuilder(accUitl)
+    }
+
+    inner class TransDetail(val debitAccNo: String, val creditAccNo: String,
+                            val amount: Double, val summary: String,
+                            val rowno: Int)
+
+    // 输入参数,调用接口时指定的参数值
     lateinit var person: TPerson
-    lateinit var account: TAccount
 
     var transDate = ""
     var transTime = ""
-    var description = ""
-    var amount: Double = 0.0
-    val details = mutableListOf<TransDetail>()
     /**
      * 是否允许透支
      */
     var overdraft = false
+    var description = ""
 
-    fun setUserAndAcc(per: TPerson, acc: TAccount) {
+    // 内部参数,不需要调用者处理
+    val details = mutableListOf<TransDetail>()
+    var amount: Double = 0.0
+    lateinit var accountUtil: AccountUtilServcie
+
+
+    fun setUserAndAcc(per: TPerson) {
         this.person = per
-        this.account = acc
     }
 
     fun enableOverdraft(b: Boolean = false): PersonTransBuilder {
@@ -51,16 +91,17 @@
     }
 
     private fun preCheckAccount() {
-        // 判断个人账户
-        if (this.account.subjno == "2001") {
-            if(amount > this.account.balance) {
-                throw TransactionCheckError(TradeErrorCode.SHORT_BALANCE_ERROR, "个人账户余额不足")
-            }
-        }
     }
 
-    fun addDetail(accNo: String, amount: Double, summary: String): PersonTransBuilder {
-        this.details.add(TransDetail(accNo, amount, summary, this.details.size + 1))
+    fun addDetail(debitAccNo: String, creditAccNo: String,
+                  amount: Double, summary: String): PersonTransBuilder {
+        this.details.add(TransDetail(debitAccNo, creditAccNo, amount,
+                summary, this.details.size + 1))
+        return this
+    }
+
+    fun <T, U> addDetail(debit: AccountHolder<T>, credit: AccountHolder<U>,
+                         amount: Double, summary: String): PersonTransBuilder {
         return this
     }
 
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
new file mode 100644
index 0000000..01a143a
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt
@@ -0,0 +1,56 @@
+package com.supwisdom.dlpay.consume.controller
+
+import com.supwisdom.dlpay.consume.AccountHolder
+import com.supwisdom.dlpay.consume.PersonTransBuilder
+import com.supwisdom.dlpay.consume.service.AccountUtilServcie
+import com.supwisdom.dlpay.consume.service.PersonBalancePayService
+import com.supwisdom.dlpay.framework.util.TradeDict
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.http.ResponseEntity
+import org.springframework.web.bind.annotation.GetMapping
+import org.springframework.web.bind.annotation.RestController
+
+@RestController
+class ConsumeController {
+    @Autowired
+    lateinit var accountUtilServcie: AccountUtilServcie
+
+    @Autowired
+    lateinit var personBalancePayService: PersonBalancePayService
+
+    @GetMapping("/account/pay")
+    fun accountPay(userid: String, amount: Int, manageFee: Int): ResponseEntity<Any> {
+        val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+                .setTransDatetime("20190411", "112311")
+                .enableOverdraft(false)
+                .addDetail(AccountHolder.person(userid),
+                        AccountHolder.shop("12323"),
+                        amount / 100.0, "")
+                .addDetail(AccountHolder.person(userid), AccountHolder.transType(301),
+                        manageFee / 100.0, "")
+                .done(personBalancePayService, true)
+        return ResponseEntity.ok(dtl)
+    }
+
+    @GetMapping("/account/payinit")
+    fun accountPayInit(userid: String, amount: Int, manageFee: Int): ResponseEntity<Any> {
+        val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+                .setTransDatetime("20190411", "112311")
+                .enableOverdraft(false)
+                .addDetail(AccountHolder.person(userid),
+                        AccountHolder.shop("12323"),
+                        amount / 100.0, "")
+                .addDetail(AccountHolder.person(userid), AccountHolder.transType(301),
+                        manageFee / 100.0, "")
+                .done(personBalancePayService, false)
+
+        return ResponseEntity.ok(dtl)
+    }
+
+    @GetMapping("/account/payfinish")
+    fun accountPayFinish(refno: String): ResponseEntity<Any> {
+        val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+                .done(refno, TradeDict.DTL_STATUS_SUCCESS, personBalancePayService)
+        return ResponseEntity.ok(dtl)
+    }
+}
\ 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
index eaec229..155f9fd 100644
--- 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
@@ -4,15 +4,38 @@
 import com.supwisdom.dlpay.consume.dao.AccountDao
 import com.supwisdom.dlpay.consume.domain.TAccount
 import com.supwisdom.dlpay.consume.domain.TPaydtl
+import com.supwisdom.dlpay.consume.service.AccountUtilServcie
 import com.supwisdom.dlpay.consume.service.PersonBalancePayService
-import com.supwisdom.dlpay.exception.TransactionProcessError
+import com.supwisdom.dlpay.exception.TransactionProcessException
 import com.supwisdom.dlpay.framework.dao.PaydtlDao
+import com.supwisdom.dlpay.framework.domain.TShopacc
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
 import javax.persistence.EntityManager
 import javax.persistence.PersistenceContext
 
+
+@Service
+class AccountUtilServcieImpl : AccountUtilServcie {
+
+    override fun readAccountForUpdate(userid: String, nowait: Boolean): TAccount {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun readAccount(userid: String): TAccount {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun readShopAccForUpdate(shopId: String, nowait: Boolean): TShopacc {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun readShopAcc(shopId: String): TShopacc {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+}
+
 @Service
 class PersonBalancePayServiceImpl : PersonBalancePayService {
     @Autowired
@@ -22,10 +45,10 @@
     lateinit var accountDao: AccountDao
 
     @PersistenceContext
-    lateinit var em : EntityManager
+    lateinit var em: EntityManager
 
     private fun lockAccount(builder: PersonTransBuilder): TAccount {
-        return accountDao.getByAccnoForUpdate(builder.account.accno)
+        TODO("")
     }
 
     override fun process(builder: PersonTransBuilder): TPaydtl {
@@ -53,7 +76,7 @@
             if (it.isPresent) {
                 return finish(it.get(), status, builder)
             }
-            throw TransactionProcessError(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易参考号<$refno>不存在")
+            throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易参考号<$refno>不存在")
         }
     }
 
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
index 8d631aa..66d3b37 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/service/pay_service.kt
@@ -1,7 +1,18 @@
 package com.supwisdom.dlpay.consume.service
 
 import com.supwisdom.dlpay.consume.PersonTransBuilder
+import com.supwisdom.dlpay.consume.domain.TAccount
 import com.supwisdom.dlpay.consume.domain.TPaydtl
+import com.supwisdom.dlpay.framework.domain.TShopacc
+
+interface AccountUtilServcie {
+
+    fun readAccountForUpdate(userid: String, nowait: Boolean): TAccount
+    fun readAccount(userid: String): TAccount
+
+    fun readShopAccForUpdate(shopId: String, nowait: Boolean): TShopacc
+    fun readShopAcc(shopId: String): TShopacc
+}
 
 interface PersonBalancePayService {