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)
     }
