重写一个交易过程
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
index 27e7185..45977f7 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
@@ -11,6 +11,7 @@
 import javax.persistence.LockModeType;
 
 import javax.persistence.QueryHint;
+import java.math.BigDecimal;
 import java.util.List;
 
 @Repository
@@ -38,4 +39,5 @@
   @Lock(LockModeType.PESSIMISTIC_WRITE)
   @Query("select a from TShopacc a where a.shopid=?1")
   TShopacc getShopaccWithLock(Integer shopid);
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TShopacc.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TShopacc.java
index a92690f..83aaeb0 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TShopacc.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TShopacc.java
@@ -1,35 +1,54 @@
 package com.supwisdom.dlpay.framework.domain;
 
+import com.supwisdom.dlpay.framework.util.HmacUtil;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import sun.misc.Cleaner;
+
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Table;
+import java.math.BigDecimal;
+import java.sql.Timestamp;
+import java.util.Calendar;
 
 @Entity
 @Table(name = "TB_SHOPACC")
 public class TShopacc {
   @Id
-  @Column(name="SHOPACCNO", length = 10)
+  @Column(name = "SHOPACCNO", length = 10)
   private String shopaccno;
 
-  @Column(name="SHOPID", precision = 9)
+  @Column(name = "SHOPID", precision = 9)
   private Integer shopid;
 
-  @Column(name="SHOPNAME", length = 200)
+  @Column(name = "SHOPNAME", length = 200)
   private String shopname;
 
-  @Column(name="SUBJNO", length = 10)
+  @Column(name = "SUBJNO", length = 10)
   private String subjno;
 
-  @Column(name="STATUS", length = 20)
+  @Column(name = "STATUS", length = 20)
   private String status;
 
-  @Column(name="OPENDATE", length = 8)
+  @Column(name = "OPENDATE", length = 8)
   private String opendate;
 
-  @Column(name="CLOSEDATE", length = 8)
+  @Column(name = "CLOSEDATE", length = 8)
   private String closedate;
 
+  @Column(name = "BALANCE", length = 15, precision = 2)
+  private Double balance = 0.0;
+
+  @Column(name = "VERSION")
+  private Long version = 1L;
+
+  @Column(name = "LASTUPDATE")
+  private Timestamp lastUpdate = new Timestamp(System.currentTimeMillis());
+
+  @Column(name = "MAC")
+  private String mac;
+
   public String getShopaccno() {
     return shopaccno;
   }
@@ -85,4 +104,27 @@
   public void setClosedate(String closedate) {
     this.closedate = closedate;
   }
+
+  public Double getBalance() {
+    return balance;
+  }
+
+  public Long getVersion() {
+    return this.version;
+  }
+
+  public String getMac() {
+    return mac;
+  }
+
+  public void setMac(String mac) {
+    this.mac = mac;
+  }
+
+  public void incrOrDecrBalance(Double amount) {
+    this.balance += amount;
+    this.lastUpdate = new Timestamp(System.currentTimeMillis());
+    this.version++;
+  }
+
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt b/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
new file mode 100644
index 0000000..2cb6caa
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
@@ -0,0 +1,121 @@
+package com.supwisdom.dlpay.api
+
+import com.supwisdom.dlpay.api.service.AccountUtilServcie
+import com.supwisdom.dlpay.api.service.PersonBalancePayService
+
+class PersonTranactionBuilder(val parent: TransactionBuilder) {
+    var userid: String = ""
+    var userName: String = ""
+    var payCode: String = ""
+    var amount: Double = 0.0
+    var summary: String = ""
+    var oppositeAccno: String = ""
+    var oppositeName: String = ""
+    var oppositeType: String = ""
+
+    fun and(): TransactionBuilder {
+        return parent
+    }
+}
+
+class ShopTransactionBuilder(val parent: TransactionBuilder) {
+    var shopaccno: String = ""
+    var shopname: String = ""
+    var amount: Double = 0.0
+    var summary: String = ""
+    var oppositeAccno: String = ""
+    var oppositeName: String = ""
+    var oppositeType: String = ""
+
+
+    var payCode: String = ""
+    fun and(): TransactionBuilder {
+        return parent
+    }
+}
+
+class SubjectTransactionBuilder(val parent: TransactionBuilder) {
+    var subjno: String = ""
+    var subjName: String = ""
+    var amount: Double = 0.0
+    var summary: String = ""
+
+    fun and(): TransactionBuilder {
+        return parent
+    }
+}
+
+// 在 constructor 中加入 service 接口
+class TransactionBuilder {
+    private lateinit var personBuilder: PersonTranactionBuilder
+    private lateinit var shopBuilder: ShopTransactionBuilder
+    private lateinit var subjectBuilder: SubjectTransactionBuilder
+
+    var transDate: String = ""
+    var transTime: String = ""
+    var payCode: String = ""
+    var refno: String = ""
+
+    fun person(): PersonTranactionBuilder {
+        return PersonTranactionBuilder(this).also {
+            this.personBuilder = it
+        }
+    }
+
+    fun shop(): ShopTransactionBuilder {
+        return ShopTransactionBuilder(this).also {
+            this.shopBuilder = it
+        }
+    }
+
+    fun subject(): SubjectTransactionBuilder {
+        return SubjectTransactionBuilder(this).also {
+            this.subjectBuilder = it
+        }
+    }
+
+    fun init(transactionService: PersonBalancePayService) {
+
+    }
+}
+
+class TransactionExample {
+    companion object {
+        fun example(accountUtilServcie: AccountUtilServcie,
+                    service: PersonBalancePayService,
+                    userid: String, shopid: Int, amount: Int, manageFee: Int,
+                    transDate: String, transTime: String) {
+
+            val person = accountUtilServcie.readAccount(userid)
+            val shop = accountUtilServcie.readShopAcc(shopid)
+
+            val builder = TransactionBuilder().apply {
+                this.transDate = transDate
+                this.transTime = transTime
+                this.payCode = "3001"
+            }.person().apply {
+                this.userid = userid // 可以再优化,直接用 person 对象
+                this.userName = person.accname
+                this.amount = (amount + manageFee) / 100.0 // 金额考虑减和加
+                this.summary = "POS消费"
+            }.and().shop().apply {
+                this.shopaccno = shop.shopaccno  // 可以再优化,直接用 shop 对象
+                this.shopname = shop.shopname
+                this.amount = amount / 100.0 // 金额考虑减和加
+                this.summary = "POS消费"
+            }.and()
+
+            if (manageFee > 0) {
+                builder.subject().apply {
+                    val subject = accountUtilServcie.readSubject("2001")
+                    this.subjno = subject.subjno
+                    this.subjName = subject.subjname
+                    this.amount = manageFee / 100.0 // 金额考虑减和加
+                    this.summary = "POS消费搭伙费"
+                }
+            }
+            builder.init(service)
+
+        }
+    }
+}
\ No newline at end of file