重构优化代码,增加交易主表记录操作员(个人,商户或者系统操作员)
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 78983ae..a4969cb 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java
@@ -38,6 +38,12 @@
   @Column(name = "outid", length = 60)
   private String outId;
 
+  @Column(name = "OPERID", precision = 9)
+  private String operid; //操作员ID
+
+  @Column(name = "OPERTYPE", length = 10)
+  private String opertype; // person - 个人, shop - 商户, operator - 操作员
+
   @Column(name = "create_time")
   private Timestamp createTime;
 
@@ -184,6 +190,22 @@
     this.endTime = endTime;
   }
 
+  public String getOperid() {
+    return operid;
+  }
+
+  public void setOperid(String operid) {
+    this.operid = operid;
+  }
+
+  public String getOpertype() {
+    return opertype;
+  }
+
+  public void setOpertype(String opertype) {
+    this.opertype = opertype;
+  }
+
   public Double sumAmountByAccno(String accno, String subjno,
                                  int balanceFlag, String debitOrCredit) {
     Double debitSum = 0.0;
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
index c786dea..d551c98 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
@@ -36,6 +36,22 @@
   public static final String DTL_STATUS_NONE = "none";
 
 
+  /**
+   * 操作员类型
+   * person - 个人
+   * shop - 商户
+   * operator - 操作员
+   */
+
+  public static final String OPERTYPE_PERSON = "person";
+  public static final String OPERTYPE_SHOP = "shop";
+  public static final String OPERTYPE_OPER = "operator";
+
+  /**
+   * 收支
+   * out - 支出
+   * in - 收入
+   */
   public static final String TRADE_FLAG_OUT = "out";
   public static final String TRADE_FLAG_IN = "in";
   /**
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 eb124dd..461f6dd 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
@@ -156,6 +156,7 @@
                     payinfo = "账户余额消费"
                     outId = shopacc.shopaccno
                     outtradeno = param.billno
+                    operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
                 }.person(account).apply {
                     description = "账户余额消费"
                     amount = param.amount / 100.0
@@ -230,6 +231,7 @@
                     description = "市民卡代扣消费"
                     outId = shopacc.shopaccno
                     outtradeno = param.billno
+                    operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
                 }.person(account).apply {
                     amount = param.amount / 100.0
                     opposite = AccountProxy(shopacc)
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 f581708..1948116 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
@@ -22,8 +22,8 @@
 class TransactionServiceImpl : TransactionService {
 
     companion object {
-        val PERSON_BALANCE_FLAG = 2
-        val SHOP_BALANCE_FLAG = 2
+        const val PERSON_BALANCE_FLAG = 2
+        const val SHOP_BALANCE_FLAG = 2
     }
 
     @Autowired
@@ -42,78 +42,7 @@
     lateinit var systemUtilService: SystemUtilService
 
     private fun preCheck(builder: TransactionBuilder) {
-        if (builder.outId.isNotEmpty() && builder.outtradeno.isEmpty()) {
-            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                    "第三方账号未指定第三方流水号")
-        }
-
-        if (builder.transDate.length != 8 || builder.transTime.length != 6) {
-            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                    "交易发生日期错误")
-        }
-
-        if (builder.transCode <= 0) {
-            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                    "交易码错误")
-        }
-
-        if (builder.hasPerson()) {
-            builder.person().also {
-                if (!it.hasOpposite()) {
-                    throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                            "个人交易对方账户未设置")
-                }
-                if (it.payinfo.isEmpty() || it.paytype.isEmpty()) {
-                    throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                            "个人交易信息未设置")
-                }
-                when (it.tradeFlag()) {
-                    TradeDict.TRADE_FLAG_IN -> {
-                        throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                                "不支持的交易")
-                    }
-                    TradeDict.TRADE_FLAG_OUT -> {
-                        if (builder.reverseFlag != TradeDict.REVERSE_FLAG_NONE && it.amount > 0) {
-                            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                                    "消费冲正交易,余额不能大于0")
-                        } else if (builder.reverseFlag == TradeDict.REVERSE_FLAG_NONE && it.amount < 0) {
-                            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                                    "消费交易,余额不能小于0")
-                        }
-                    }
-                    else -> {
-                        throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                                "个人交易方向未设置")
-                    }
-                }
-
-            }
-        }
-
-        if (builder.hasShop()) {
-            builder.shop().also {
-                if (!it.hasOpposite()) {
-                    throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                            "商户交易对方账户未设置")
-                }
-                when (it.tradeFlag()) {
-                    TradeDict.TRADE_FLAG_IN -> {
-                        if (it.amount < 0) {
-                            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                                    "商户收入交易金额不能小于0")
-                        }
-                    }
-                    TradeDict.TRADE_FLAG_OUT -> {
-                        if (it.amount > 0) {
-                            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                                    "商户支出交易金额不能小于0")
-                        }
-                    }
-                    else -> throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                            "商户交易方向未设置")
-                }
-            }
-        }
+        builder.preCheck()
     }
 
     private fun builderRecords(builder: TransactionBuilder, status: String): TTransactionMain {
@@ -126,6 +55,8 @@
                 outTradeNo = builder.outtradeno
                 outId = builder.outId
                 createTime = Timestamp(systemUtilService.sysdatetime.sysdate.time)
+                operid = builder.operId
+                opertype = builder.operType
             }
 
             if (builder.hasPerson()) {
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 7dd9f80..5d379fe 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
@@ -136,6 +136,15 @@
     var description: String = ""
     var remark: String = ""
 
+    var operId: String = ""
+    var operType: String = ""
+
+    fun operator(id: String, type: String): TransactionBuilder {
+        this.operId = id
+        this.operType = type
+        return this
+    }
+
     fun person(): PersonTranactionBuilder {
         return this.personBuilder
     }
@@ -201,6 +210,87 @@
         return debitCreditLines.toList()
     }
 
+    fun preCheck() {
+        if (outId.isNotEmpty() && outtradeno.isEmpty()) {
+            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                    "第三方账号未指定第三方流水号")
+        }
+
+        if (transDate.length != 8 || transTime.length != 6) {
+            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                    "交易发生日期错误")
+        }
+
+        if (transCode <= 0) {
+            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                    "交易码错误")
+        }
+
+        if ((operId.isNotEmpty() || operType.isNotEmpty())
+                && operType !in setOf(TradeDict.OPERTYPE_OPER, TradeDict.OPERTYPE_PERSON, TradeDict.OPERTYPE_SHOP)) {
+            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                    "操作员类型错误")
+        }
+
+        if (hasPerson()) {
+            person().also {
+                if (!it.hasOpposite()) {
+                    throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                            "个人交易对方账户未设置")
+                }
+                if (it.payinfo.isEmpty() || it.paytype.isEmpty()) {
+                    throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                            "个人交易信息未设置")
+                }
+                when (it.tradeFlag()) {
+                    TradeDict.TRADE_FLAG_IN -> {
+                        throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                                "不支持的交易")
+                    }
+                    TradeDict.TRADE_FLAG_OUT -> {
+                        if (reverseFlag != TradeDict.REVERSE_FLAG_NONE && it.amount > 0) {
+                            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                                    "消费冲正交易,余额不能大于0")
+                        } else if (reverseFlag == TradeDict.REVERSE_FLAG_NONE && it.amount < 0) {
+                            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                                    "消费交易,余额不能小于0")
+                        }
+                    }
+                    else -> {
+                        throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                                "个人交易方向未设置")
+                    }
+                }
+
+            }
+        }
+
+        if (hasShop()) {
+            shop().also {
+                if (!it.hasOpposite()) {
+                    throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                            "商户交易对方账户未设置")
+                }
+                when (it.tradeFlag()) {
+                    TradeDict.TRADE_FLAG_IN -> {
+                        if (it.amount < 0) {
+                            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                                    "商户收入交易金额不能小于0")
+                        }
+                    }
+                    TradeDict.TRADE_FLAG_OUT -> {
+                        if (it.amount > 0) {
+                            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                                    "商户支出交易金额不能小于0")
+                        }
+                    }
+                    else -> throw  TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
+                            "商户交易方向未设置")
+                }
+            }
+        }
+    }
+
     fun init(transactionService: TransactionService): TTransactionMain {
         return transactionService.init(this)
     }