diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/APIRequestParam.java b/src/main/java/com/supwisdom/dlpay/framework/util/APIRequestParam.java
index 78ea9d4..14fc1d7 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/APIRequestParam.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/APIRequestParam.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.framework.util;
 
-import org.apache.log4j.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.beans.Introspector;
 import java.lang.reflect.Field;
@@ -8,7 +9,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
-public class APIRequestParam {
+public abstract class APIRequestParam {
   @Sign
   private String sign;
   @Sign
@@ -16,7 +17,7 @@
   @Sign
   private String version;
 
-  private static final Logger logger = Logger.getLogger(APIRequestParam.class);
+  private static final Logger logger = LoggerFactory.getLogger(APIRequestParam.class);
 
   public String getSign() {
     return sign;
@@ -96,4 +97,6 @@
     }
     return calcSignAndCheck(paramMap,key);
   }
+
+  public abstract boolean checkParam();
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
index 336239e..6fd831b 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
@@ -131,4 +131,10 @@
 
   public static final int BUSINESS_PAYTYPE_NOSUPPORT = 30003; //支付方式不支持
 
+
+  //================= POS消费业务 ==================//
+  public static final int POS_TIMESTAMP_ERROR = 40000; //业务处理错误
+
+  public static final int POS_NOT_EXISTS = 40001; //设备不存在
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceDao.java b/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceDao.java
index 14d13db..e848ae9 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceDao.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/dao/DeviceDao.java
@@ -27,4 +27,8 @@
 
 
     TDevice findTDeviceById(Integer id);
+
+    TDevice findByDevphyid(String devphyid);
+
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java b/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
index c0f7343..6083f5f 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/util/RestaurantConstant.java
@@ -9,4 +9,7 @@
   public static final String RULETYPE_QUOTA = "quota"; //定额
   public static final String RULETYPE_REDUCTION = "reduction"; //减免
 
+
+  public static final int POS_TIME_ERROR_DIFFMINS = 10; //设备时钟误差
+
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
index f498fee..014a139 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
@@ -2,251 +2,149 @@
 
 import com.supwisdom.dlpay.exception.RequestParamCheckException
 import com.supwisdom.dlpay.framework.util.*
-import com.supwisdom.dlpay.util.ConstantUtil
+import com.supwisdom.dlpay.restaurant.util.RestaurantConstant
 
-// ============================ USER ============================ //
-class OpenUserParam : APIRequestParam() {
-    @Sign
-    var uid: String = ""    //第三方用户ID,必传
-    @Sign
-    var name: String = ""   //必传
-    @Sign
-    var sex: String? = null
-    @Sign
-    var idtype: String = "" //必传
-    @Sign
-    var idno: String = ""   //必传
-    @Sign
-    var mobile: String? = null
-    @Sign
-    var tel: String? = null
-    @Sign
-    var email: String? = null
-    @Sign
-    var address: String? = null
-    @Sign
-    var zipcode: String? = null
+class ParamUtil {
+    companion object {
+        fun checkTimestamp(timestamp: String) {
+            if (!DateUtil.checkDatetimeValid(timestamp, DateUtil.DATETIME_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数错误[设备时间戳]")
+            val nowtime = DateUtil.getNow()
+            if (DateUtil.compareDatetime(nowtime, timestamp, -1 * RestaurantConstant.POS_TIME_ERROR_DIFFMINS * 60) > 0 || DateUtil.compareDatetime(nowtime, timestamp, RestaurantConstant.POS_TIME_ERROR_DIFFMINS * 60) < 0)
+                throw RequestParamCheckException(TradeErrorCode.POS_TIMESTAMP_ERROR, "设备时钟错误[设备时钟与服务器时钟相差${RestaurantConstant.POS_TIME_ERROR_DIFFMINS}分钟!]")
+        }
+    }
+}
 
-    fun checkParam(): Boolean {
-        if (StringUtil.isEmpty(uid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "用户唯一号不能为空")
-        if (StringUtil.isEmpty(name)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "姓名不能为空")
-        if (!StringUtil.isEmpty(sex) && ConstantUtil.SEX_MALE != sex && ConstantUtil.SEX_FEMALE != sex) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "性别非法[male|female]")
-        if (StringUtil.isEmpty(idtype) || !ConstantUtil.IDTYPE_DICTS.contains(idtype)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "证件类型非法")
-        if (StringUtil.isEmpty(idno) || !StringUtil.isCharAndNum(idno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "证件号不能为空，且仅支持数字和字母")
-        if (ConstantUtil.IDTYPE_IDENTITY == idtype && !StringUtil.isIdentity(idno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "身份证格式错误")
-        if (!StringUtil.isEmpty(mobile) && !StringUtil.isMobile(mobile)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "手机号格式错误")
-        if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "邮箱格式错误")
+class PosLoginParam : APIRequestParam() {
+    @Sign
+    var devphyid: String = ""
+    @Sign
+    var devtype: String = ""
+    @Sign
+    var devparaverno: String = ""
+    @Sign
+    var cardverno: String = ""
+    @Sign
+    var devsoftverno: String = ""
+    @Sign
+    var timestamp: String = ""
+
+
+    override fun checkParam(): Boolean {
+        if (StringUtil.isEmpty(devphyid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数为空[设备物理ID]")
+        if (StringUtil.isEmpty(devtype)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数为空[设备类型]")
+        if (StringUtil.isEmpty(devparaverno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数为空[设备参数版本号]")
+        if (!NumberUtil.isDigits(cardverno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数错误[白名单版本号]")
+        if (StringUtil.isEmpty(devsoftverno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数为空[设备软件版本号]")
+        ParamUtil.checkTimestamp(timestamp)
 
         return true
     }
 }
 
-class QueryUserParam : APIRequestParam() {
+class PosHeartBeatParam : APIRequestParam() {
     @Sign
-    var userid: String? = null  // 用户ID二选一 (两者都传取userid)
+    var devphyid: String = ""
     @Sign
-    var uid: String? = null    // 用户ID二选一
+    var devparaverno: String = ""
+    @Sign
+    var cardverno: String = ""
+    @Sign
+    var devsoftverno: String = ""
 
-    fun checkParam(): Boolean {
-        if (StringUtil.isEmpty(userid) && StringUtil.isEmpty(uid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "用户唯一号不能为空")
+
+    override fun checkParam(): Boolean {
+        if (StringUtil.isEmpty(devphyid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数为空[设备物理ID]")
+        if (StringUtil.isEmpty(devparaverno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数为空[设备参数版本号]")
+        if (!NumberUtil.isDigits(cardverno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数为空[白名单版本号]")
+        if (StringUtil.isEmpty(devsoftverno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数为空[设备软件版本号]")
 
         return true
     }
 }
 
-class ModifyUserParam : APIRequestParam() {
+class UpdateDevparaParam : APIRequestParam() {
     @Sign
-    var userid: String? = null  // 用户ID二选一 (两者都传取userid)
+    var devphyid: String = ""
     @Sign
-    var uid: String? = null    // 用户ID二选一
+    var devparagroupid: Int = 0
     @Sign
-    var name: String? = null
-    @Sign
-    var sex: String? = null
-    @Sign
-    var idtype: String? = null
-    @Sign
-    var idno: String? = null
-    @Sign
-    var mobile: String? = null
-    @Sign
-    var tel: String? = null
-    @Sign
-    var email: String? = null
-    @Sign
-    var address: String? = null
-    @Sign
-    var zipcode: String? = null
+    var timestamp: String = ""
 
-    fun checkParam(): Boolean {
-        if (StringUtil.isEmpty(userid) && StringUtil.isEmpty(uid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "用户唯一号不能为空")
-        if (!StringUtil.isEmpty(sex) && ConstantUtil.SEX_MALE != sex && ConstantUtil.SEX_FEMALE != sex) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "性别非法[male|female]")
-        if (!StringUtil.isEmpty(idtype) && !ConstantUtil.IDTYPE_DICTS.contains(idtype)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "证件类型非法")
-        if (!StringUtil.isEmpty(idno) && !StringUtil.isCharAndNum(idno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "证件号不能为空，且仅支持数字和字母")
-        if (!StringUtil.isEmpty(idno) && StringUtil.isEmpty(idtype)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "证件号不能为空时，请指定证件类型")
-        if (!StringUtil.isEmpty(idno) && ConstantUtil.IDTYPE_IDENTITY == idtype && !StringUtil.isIdentity(idno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "身份证格式错误")
-        if (!StringUtil.isEmpty(mobile) && !StringUtil.isMobile(mobile)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "手机号格式错误")
-        if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "邮箱格式错误")
+    override fun checkParam(): Boolean {
+        if (StringUtil.isEmpty(devphyid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数为空[设备物理ID]")
+        if (null == devparagroupid || devparagroupid < 1) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数错误[设备参数参数组ID]")
+        ParamUtil.checkTimestamp(timestamp)
+
+        return true
+    }
+}
+
+class DownloadWhiteListParam : APIRequestParam() {
+    @Sign
+    var devphyid: String = ""
+    @Sign
+    var cardverno: String = ""
+    @Sign
+    var maxcount: Int = 0
+    @Sign
+    var timestamp: String = ""
+
+
+    override fun checkParam(): Boolean {
+        if (StringUtil.isEmpty(devphyid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数为空[设备物理ID]")
+        if (!NumberUtil.isDigits(cardverno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数为空[白名单版本号]")
+        if (null == maxcount || maxcount < 1) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数错误[名单数目]")
+        ParamUtil.checkTimestamp(timestamp)
+
+        return true
+    }
+}
+
+class QueryPosSalesParam : APIRequestParam() {
+    @Sign
+    var devphyid: String = ""
+    @Sign
+    var transdate: String = ""
+    @Sign
+    var mealflag: Boolean = false
+    @Sign
+    var timestamp: String = ""
+
+    override fun checkParam(): Boolean {
+        if (StringUtil.isEmpty(devphyid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数为空[设备物理ID]")
+        if (!DateUtil.checkDatetimeValid(transdate, DateUtil.DATE_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数错误[交易日期]")
+        if (null == mealflag) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数错误[分餐标志]")
+        ParamUtil.checkTimestamp(timestamp)
+
+        return true
+    }
+
+}
+
+class QueryPosDtlParam : APIRequestParam() {
+    @Sign
+    var devphyid: String = ""
+    @Sign
+    var transdate: String = ""
+    @Sign
+    var pageno: Int = 0
+    @Sign
+    var timestamp: String = ""
+
+    override fun checkParam(): Boolean {
+        if (StringUtil.isEmpty(devphyid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数为空[设备物理ID]")
+        if (!DateUtil.checkDatetimeValid(transdate, DateUtil.DATE_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数错误[交易日期]")
+        if (null == pageno || pageno < 1) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请求参数错误[页码]")
+        ParamUtil.checkTimestamp(timestamp)
 
         return true
     }
 }
 
 
-// ============================ SHOP ============================ //
-class OpenShopParam : APIRequestParam() {
-    @Sign
-    var shopUniqueId: String = "" //必传
-    @Sign
-    var shoptype: Int = 1
-    @Sign
-    var fshopid: Int? = null
-    @Sign
-    var shopname: String = "" //必传
-    @Sign
-    var contactman: String? = null
-    @Sign
-    var idtype: String? = null
-    @Sign
-    var idno: String? = null
-    @Sign
-    var mobile: String? = null
-    @Sign
-    var email: String? = null
-    @Sign
-    var address: String? = null
-    @Sign
-    var zipcode: String? = null
-
-    fun checkParam(): Boolean {
-        if (StringUtil.isEmpty(shopUniqueId)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "商户唯一号不能为空")
-        if (ConstantUtil.SHOPTYPE_GROUP != shoptype && ConstantUtil.SHOPTYPE_LEAF != shoptype) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请指定商户类型")
-        if (StringUtil.isEmpty(shopname)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "商户名称不能为空")
-        if (!StringUtil.isEmpty(idtype) && !ConstantUtil.IDTYPE_DICTS.contains(idtype)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "证件类型非法")
-        if (!StringUtil.isEmpty(idno) && !StringUtil.isCharAndNum(idno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "证件号不能为空，且仅支持数字和字母")
-        if (!StringUtil.isEmpty(idno) && StringUtil.isEmpty(idtype)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "证件号不能为空时，请指定证件类型")
-        if (!StringUtil.isEmpty(mobile) && !StringUtil.isMobile(mobile)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "手机号格式错误")
-        if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "邮箱格式错误")
-
-        return true
-    }
-}
-
-class QueryShopParam : APIRequestParam() {
-    @Sign
-    var shopid: Int? = null  //注册时返回的shopid
-    @Sign
-    var shopaccno: String? = null  //注册时返回的shopaccno
-    @Sign
-    var shopUniqueId: String? = null //注册传的商户唯一号
-
-    fun checkParam(): Boolean {
-        if (StringUtil.isEmpty(shopUniqueId) && null == shopid && StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "商户唯一标志不能为空")
-
-        return true
-    }
-}
 
 
-// ============================ CONSUME ============================ //
-class ConsumeFeetype {
-    var feetype: String = ""
-    var amount: Int = 0
-
-    override fun toString(): String {
-        return "{feetype='$feetype', amount=$amount}"
-    }
-}
-
-class QueryDtlResultParam : APIRequestParam() {
-    @Sign
-    var refno:String?=null //二选一
-    @Sign
-    var billno:String?=null //二选一 (billno+shopaccno） 传billno时，shopaccno必传
-    @Sign
-    var shopaccno: String?=null
-
-    fun checkParam(): Boolean {
-        if (StringUtil.isEmpty(refno) && (StringUtil.isEmpty(billno) || StringUtil.isEmpty(shopaccno))) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "流水唯一号不能为空")
-
-        return true
-    }
-}
-
-class CitizenCardPayinitParam : APIRequestParam() {
-    @Sign
-    var cardNo: String = "" //必传
-    @Sign
-    var shopaccno: String = "" //必传
-    @Sign
-    var amount: Int = 0 //必传
-
-    var feelist: List<ConsumeFeetype>? = null //TODO: 怎么拼接签名字符串？？
-    @Sign
-    var billno: String = "" //必传
-    @Sign
-    var transdate: String = "" //必传
-    @Sign
-    var transtime: String = "" //必传
-
-    fun checkParam(): Boolean {
-        if (StringUtil.isEmpty(cardNo)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "卡唯一号不能为空")
-        if (StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请指定交易商户")
-        if (amount <= 0) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易金额必须大于零")
-        if (StringUtil.isEmpty(billno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "对接系统唯一订单号不能为空")
-        if (!DateUtil.checkDatetimeValid(transdate, DateUtil.DATE_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易日期错误[yyyyMMdd]")
-        if (!DateUtil.checkDatetimeValid(transtime, DateUtil.TIME_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易时间错误[HHmmss]")
-
-        return true
-    }
-}
-
-class CitizenCardPayfinishParam : APIRequestParam() {
-    @Sign
-    var refno:String=""
-
-    fun checkParam(): Boolean {
-        if (StringUtil.isEmpty(refno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易参考号不能为空")
-
-        return true
-    }
-}
-
-class YktCardPayinitParam : APIRequestParam() {
-    @Sign
-    var uid: String? = null //未注册，可能不传
-    @Sign
-    var shopaccno: String = "" //必传
-    @Sign
-    var amount: Int = 0 //必传
-
-    var feelist: List<ConsumeFeetype>? = null //TODO: 怎么拼接签名字符串？？
-    @Sign
-    var billno: String = "" //必传
-    @Sign
-    var transdate: String = "" //必传
-    @Sign
-    var transtime: String = "" //必传
-    @Sign
-    var stuempno: String = "" //必传
-    @Sign
-    var yktshopid: String? = null
-    @Sign
-    var devphyid: String? = null
-
-    fun checkParam(): Boolean {
-
-        if (StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请指定交易商户")
-        if (amount <= 0) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易金额必须大于零")
-        if (StringUtil.isEmpty(billno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "对接系统唯一订单号不能为空")
-        if (!DateUtil.checkDatetimeValid(transdate, DateUtil.DATE_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易日期错误[yyyyMMdd]")
-        if (!DateUtil.checkDatetimeValid(transtime, DateUtil.TIME_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易时间错误[HHmmss]")
-        if (StringUtil.isEmpty(stuempno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "一卡通唯一号不能为空")
-        if(!StringUtil.isEmpty(yktshopid) && !NumberUtil.isDigits(yktshopid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "一卡通商户号非整数")
-
-        return true
-    }
-}
 
 
 
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/comsume_builder.kt b/src/main/kotlin/com/supwisdom/dlpay/api/comsume_builder.kt
deleted file mode 100644
index ff29e99..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/comsume_builder.kt
+++ /dev/null
@@ -1,368 +0,0 @@
-package com.supwisdom.dlpay.api
-
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TPerson
-import com.supwisdom.dlpay.api.domain.TUserdtl
-import com.supwisdom.dlpay.api.service.AccountUtilServcie
-import com.supwisdom.dlpay.api.service.PersonBalancePayService
-import com.supwisdom.dlpay.exception.TransactionCheckException
-import com.supwisdom.dlpay.framework.domain.TFeetypeConfig
-import com.supwisdom.dlpay.framework.domain.TShopacc
-import com.supwisdom.dlpay.framework.domain.TSubject
-import com.supwisdom.dlpay.framework.util.*
-
-class AccountHolder<T> private constructor(val accountId: String, val idType: Int) {
-    companion object {
-        const val IDTYPE_PERSON = 1
-        const val IDTYPE_SHOP = 2
-        const val IDTYPE_SUBJECT = 3
-        const val IDTYPE_FEETYPE = 4
-
-        fun person(userid: String): AccountHolder<TAccount> {
-            return AccountHolder(userid, IDTYPE_PERSON)
-        }
-
-        fun shop(shopid: String): AccountHolder<TShopacc> {
-            return AccountHolder(shopid, IDTYPE_SHOP)
-        }
-
-        fun subject(subjNo: String): AccountHolder<TSubject> {
-            return AccountHolder(subjNo, IDTYPE_SUBJECT)
-        }
-
-        fun feetype(feetype: String, paytype: String): AccountHolder<TFeetypeConfig> {
-            return AccountHolder("$feetype@$paytype", IDTYPE_FEETYPE)
-        }
-    }
-
-    internal lateinit var builder: PersonTransBuilder
-
-    internal val childrenHolder = mutableListOf<AccountHolder<*>>()
-
-
-    fun <U> with(holder: AccountHolder<U>): AccountHolder<T> {
-        holder.builder = this.builder
-        childrenHolder.add(holder)
-        return this
-    }
-
-    @Suppress("UNCHECKED_CAST", "IMPLICIT_CAST_TO_ANY")
-    fun <T> get(): T {
-        return when (idType) {
-            IDTYPE_PERSON -> builder.accountUtil.readAccountForUpdateNowait(accountId)
-            IDTYPE_SHOP -> builder.accountUtil.readShopAcc(accountId.toInt())
-            IDTYPE_SUBJECT -> builder.accountUtil.readSubject(accountId)
-            IDTYPE_FEETYPE -> builder.accountUtil.readFeetype(accountId.split("@")[0], accountId.split("@")[1])
-            else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "账户类型未知type<$idType>")
-        } as T
-    }
-
-    @Suppress("UNCHECKED_CAST", "IMPLICIT_CAST_TO_ANY")
-    fun <T> withLock(): T {
-        return when (idType) {
-            IDTYPE_PERSON -> builder.accountUtil.readAccountForUpdateNowait(accountId)
-            IDTYPE_SHOP -> builder.accountUtil.readShopAcc(accountId.toInt())
-            IDTYPE_SUBJECT -> builder.accountUtil.readSubject(accountId)
-            IDTYPE_FEETYPE -> builder.accountUtil.readFeetype(accountId.split("@")[0], accountId.split("@")[1])
-            else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "账户类型未知type<$idType>")
-        } as T
-    }
-}
-
-class PersonTransBuilder private constructor(accUitl: AccountUtilServcie) {
-    companion object {
-        fun newBuilder(accUitl: AccountUtilServcie) = PersonTransBuilder(accUitl)
-    }
-
-    inner class TransDetail(val debitAccNo: String, val debitSubjNo: String,
-                            val creditAccNo: String, val creditSubjNo: String,
-                            val amount: Double, val summary: String,
-                            val rowno: Int)
-
-    ///////////////////////////////////////////////////////////////////////////////
-    // 以下为输入参数，调用接口时指定的参数值
-    lateinit var person: TPerson
-    lateinit var tradetype: Tradetype
-    lateinit var refno: String
-    lateinit var status: String
-    lateinit var shopaccno: String
-    val extendMap = mutableMapOf<String, String>() //存调第三方需要的参数信息
-    val resultMap = mutableMapOf<String, String>() //存调第三方结果数据
-
-    var transcode = 0
-
-    var transDate = ""
-    var transTime = ""
-    /**
-     * 是否允许透支
-     */
-    var overdraft = false
-    var description = ""
-
-    /**
-     * 支付方式
-     * */
-    var paytype = ""  //枚举？
-    var payinfo = ""
-
-    /**
-     * 外部流水号
-     * */
-    var outtradeno = "" //发起支付系统的流水号（对接系统根据此流水号查询本地流水对账）
-
-    var tryLockAccount = false
-
-    ////////////////////////////////////////////////////////////////////////////////////
-    // 以下为内部参数，不需要调用者处理
-    val details = mutableListOf<TransDetail>()
-    var amount: Double = 0.0
-    var accountUtil = accUitl
-
-    /////////////////////////////////////////////
-
-    fun setOwner(per: TPerson): PersonTransBuilder {
-        this.person = per
-        return this
-    }
-
-    fun enableOverdraft(b: Boolean = false): PersonTransBuilder {
-        this.overdraft = b
-        return this
-    }
-
-    fun setTransDatetime(date: String, time: String): PersonTransBuilder {
-        this.transDate = date
-        this.transTime = time
-        return this
-    }
-
-    fun setTransinfo(transcode: Int, description: String): PersonTransBuilder {
-        this.transcode = transcode
-        this.description = description
-        return this
-    }
-
-    fun selectPaytype(paytype: String, payinfo: String): PersonTransBuilder {
-        this.paytype = paytype
-        this.payinfo = payinfo
-        return this
-    }
-
-    fun setOuttradeno(outtradeno: String): PersonTransBuilder {
-        this.outtradeno = outtradeno
-        return this
-    }
-
-    fun chooseTradetype(tradetype: Tradetype): PersonTransBuilder {
-        this.tradetype = tradetype
-        return this
-    }
-
-    fun tryLock(lock: Boolean): PersonTransBuilder {
-        this.tryLockAccount = lock
-        return this
-    }
-
-    fun setRefno(refno: String): PersonTransBuilder {
-        this.refno = refno
-        return this
-    }
-
-    fun addExtendParam(key: String, value: String): PersonTransBuilder {
-        this.extendMap.plus(mapOf(key to value))
-        return this
-    }
-
-    fun addExtendParam(param: Map<String, String>): PersonTransBuilder {
-        this.extendMap.plus(param)
-        return this
-    }
-    fun addResult(key: String, value: String): PersonTransBuilder {
-        this.resultMap.plus(mapOf(key to value))
-        return this
-    }
-
-    fun addResult(param: Map<String, String>): PersonTransBuilder {
-        this.resultMap.plus(param)
-        return this
-    }
-
-    private fun prepareData() {
-        if (transcode == 0) {
-            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "未指定交易码")
-        }
-
-        // fixme : 是否要检查 recharge , consume 之外的类型
-        when (this.tradetype) {
-            //充值必须指明用户和支付方式
-            Tradetype.RECHARGE -> {
-                if (StringUtil.isEmpty(this.paytype))
-                    throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "未指定充值方式")
-            }
-
-            //消费
-            Tradetype.CONSUME -> {
-                if (StringUtil.isEmpty(this.paytype))
-                    this.paytype = TradeDict.PAYTYPE_BALANCE   //默认余额支付
-            }
-        }
-
-        if (this.details.size < 1) {
-            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "未指定交易明细")
-        }
-
-        amount = this.details.sumByDouble { detail ->
-            detail.amount
-        }
-
-        if (!StringUtil.isEmpty(this.transDate) &&
-                !DateUtil.checkDatetimeValid(this.transDate, "yyyyMMdd")) {
-            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "交易日期格式错误[yyyyMMdd]")
-        }
-        if (!StringUtil.isEmpty(this.transTime) &&
-                !DateUtil.checkDatetimeValid(this.transTime, "HHmmss")) {
-            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "交易时间格式错误[HHmmss]")
-        }
-
-        if (StringUtil.isEmpty(this.outtradeno)) {
-            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "未传递外部流水号")
-        }
-
-
-    }
-
-    private fun preCheckAccount() {
-        when (person.status) {
-            TradeDict.STATUS_CLOSED ->
-                throw TransactionCheckException(TradeErrorCode.PERSON_STATUS_ERROR, "用户已注销")
-            TradeDict.STATUS_LOCKED ->
-                throw TransactionCheckException(TradeErrorCode.PERSON_STATUS_ERROR, "用户已冻结锁定")
-        }
-    }
-
-    @Suppress("UNCHECKED_CAST", "IMPLICIT_CAST_TO_ANY")
-    fun <U> getAccountAndSubjNo(holder: AccountHolder<U>): Pair<String, String> {
-        return if (this.tryLockAccount) {
-            when (holder.idType) {
-                AccountHolder.IDTYPE_PERSON -> holder.withLock<TAccount>().let {
-                    it.accno to it.subjno
-                }
-                AccountHolder.IDTYPE_SHOP -> holder.withLock<TShopacc>().let {
-                    if(null==this.shopaccno) this.shopaccno=it.shopaccno
-                    it.shopaccno to it.subjno
-                }
-                AccountHolder.IDTYPE_SUBJECT -> holder.withLock<TSubject>().let {
-                    it.subjno to it.subjno
-                }
-                else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "不支持的账户类型")
-            }
-        } else {
-            when (holder.idType) {
-                AccountHolder.IDTYPE_PERSON -> holder.get<TAccount>().let {
-                    it.accno to it.subjno
-                }
-                AccountHolder.IDTYPE_SHOP -> holder.get<TShopacc>().let {
-                    if(null==this.shopaccno) this.shopaccno=it.shopaccno
-                    it.shopaccno to it.subjno
-                }
-                AccountHolder.IDTYPE_SUBJECT -> holder.get<TSubject>().let {
-                    it.subjno to it.subjno
-                }
-                else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "不支持的账户类型")
-            }
-        }
-    }
-
-    fun <T, U> addDetail(debit: AccountHolder<T>, credit: AccountHolder<U>,
-                         amount: Double, summary: String): PersonTransBuilder {
-        debit.builder = this
-        credit.builder = this
-
-        var debitAccNo = ""
-        var debitSubjNo = ""
-        getAccountAndSubjNo(debit).apply {
-            debitAccNo = first
-            debitSubjNo = second
-        }
-        var creditAccNo = ""
-        var creditSubjNo = ""
-        getAccountAndSubjNo(credit).apply {
-            creditAccNo = first
-            creditSubjNo = second
-        }
-        this.details.add(TransDetail(debitAccNo, debitSubjNo, creditAccNo, creditSubjNo,
-                amount, summary, this.details.size + 1))
-        return this
-    }
-
-    fun addDetail(accountHolder: AccountHolder<TFeetypeConfig>,
-                  amount: Double): PersonTransBuilder {
-        accountHolder.builder = this
-        val transtype = accountHolder.get<TFeetypeConfig>()
-
-        var debitAccNo = ""
-        var debitSubjNo = ""
-
-        var creditAccNo = ""
-        var creditSubjNo = ""
-
-        accountHolder.childrenHolder.map {
-            getAccountAndSubjNo(it)
-        }.forEach {
-            if (it.second == transtype.drsubjno) {
-                debitAccNo = it.first
-                debitSubjNo = it.second
-            } else if (it.second == transtype.crsubjno) {
-                creditAccNo = it.first
-                creditSubjNo = it.second
-            }
-        }
-
-        if (debitAccNo.isEmpty()) {
-            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                    "交易配置<${transtype.feetype}@${transtype.paytype}> 借方账号配置错误")
-        }
-        if (creditAccNo.isEmpty()) {
-            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                    "交易配置<${transtype.feetype}@${transtype.paytype}> 贷方账号配置错误")
-        }
-        this.details.add(TransDetail(debitAccNo, debitSubjNo, creditAccNo, creditSubjNo,
-                amount, transtype.summary, this.details.size + 1))
-        return this
-    }
-
-    /**
-     * 一步交易完成
-     */
-    fun done(service: PersonBalancePayService): TUserdtl {
-        prepareData()
-        preCheckAccount()
-        return service.process(this)
-    }
-
-    fun init(service: PersonBalancePayService) : TUserdtl{
-        prepareData()
-        preCheckAccount()
-        return service.init(this)
-    }
-
-    fun wip(service: PersonBalancePayService): TUserdtl {
-        if (null == this.refno)
-            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "交易参考号<refno>未指定")
-        return service.wip(this)
-    }
-
-    fun finish(service: PersonBalancePayService, status: String): TUserdtl {
-        if (null == this.refno)
-            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "交易参考号<refno>未指定")
-        this.status = status
-        return service.finish(this)
-    }
-
-    fun success(service: PersonBalancePayService): TUserdtl{
-        if (null == this.refno)
-            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "交易参考号<refno>未指定")
-        this.status = TradeDict.DTL_STATUS_SUCCESS
-        return service.finish(this)
-    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/common_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/common_api_controller.kt
new file mode 100644
index 0000000..9709b57
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/common_api_controller.kt
@@ -0,0 +1,99 @@
+package com.supwisdom.dlpay.api.controller
+
+import com.supwisdom.dlpay.api.bean.*
+import com.supwisdom.dlpay.api.service.CommonApiService
+import com.supwisdom.dlpay.framework.ResponseBodyBuilder
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import org.apache.log4j.Logger
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.http.ResponseEntity
+import org.springframework.web.bind.annotation.*
+
+@RestController
+@RequestMapping("/api/common")
+class CommonAPIController {
+    companion object {
+        private val logger = Logger.getLogger(CommonAPIController::class.java)
+    }
+
+    @Autowired
+    lateinit var commonApiService: CommonApiService
+
+    /**
+     * ============================================================================
+     * POS签到
+     * ============================================================================
+     * */
+    @PostMapping("/poslogin")
+    fun posLogin(@RequestBody param: PosLoginParam): ResponseEntity<Any> {
+        logger.info("收到设备[${param.devphyid}]签到请求: ")
+        val device = commonApiService.getDeviceByDevphyid(param.devphyid)
+        return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "业务处理错误"))
+    }
+
+
+    /**
+     * ============================================================================
+     * POS心跳
+     * ============================================================================
+     * */
+    @PostMapping("/posheartbeat")
+    fun heartbeat(@RequestBody param: PosHeartBeatParam): ResponseEntity<Any> {
+        return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "业务处理错误"))
+    }
+
+    /**
+     * ============================================================================
+     * 更新设备参数组
+     * ============================================================================
+     * */
+    @PostMapping("/updatedevpara")
+    fun updateDevpara(@RequestBody param: UpdateDevparaParam): ResponseEntity<Any> {
+        return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "业务处理错误"))
+    }
+
+
+    /**
+     * ============================================================================
+     * 下载白名单
+     * ============================================================================
+     * */
+    @PostMapping("/downloadwhitelist")
+    fun downloadWhiteList(@RequestBody param: DownloadWhiteListParam): ResponseEntity<Any>{
+        return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "业务处理错误"))
+    }
+
+    /**
+     * ============================================================================
+     * 查询营业额
+     * ============================================================================
+     * */
+    @PostMapping("/querypossales")
+    fun queryPosSales(@RequestBody param: QueryPosSalesParam): ResponseEntity<Any>{
+        return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "业务处理错误"))
+    }
+
+    /**
+     * ============================================================================
+     * 查询流水
+     * ============================================================================
+     * */
+    @PostMapping("/queryposdtl")
+    fun queryPosDtl(@RequestBody param: QueryPosDtlParam): ResponseEntity<Any>{
+        return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "业务处理错误"))
+    }
+
+
+
+
+
+
+
+
+}
\ No newline at end of file
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
deleted file mode 100644
index 066e43c..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
+++ /dev/null
@@ -1,455 +0,0 @@
-package com.supwisdom.dlpay.api.controller
-
-import com.supwisdom.dlpay.api.AccountHolder
-import com.supwisdom.dlpay.api.CallService
-import com.supwisdom.dlpay.api.PersonTransBuilder
-import com.supwisdom.dlpay.api.bean.CitizenCardPayfinishParam
-import com.supwisdom.dlpay.api.bean.CitizenCardPayinitParam
-import com.supwisdom.dlpay.api.bean.QueryDtlResultParam
-import com.supwisdom.dlpay.api.bean.YktCardPayinitParam
-import com.supwisdom.dlpay.api.service.*
-import com.supwisdom.dlpay.exception.RequestParamCheckException
-import com.supwisdom.dlpay.exception.TransactionException
-import com.supwisdom.dlpay.exception.TransactionProcessException
-import com.supwisdom.dlpay.framework.ResponseBodyBuilder
-import com.supwisdom.dlpay.framework.service.CommonService
-import com.supwisdom.dlpay.framework.service.SystemUtilService
-import com.supwisdom.dlpay.framework.util.*
-import com.supwisdom.dlpay.util.ConstantUtil
-import com.supwisdom.dlpay.util.PaytypeUtil
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.http.ResponseEntity
-import org.springframework.web.bind.annotation.*
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
-
-@RestController
-@RequestMapping("/api/consume")
-class ConsumeController {
-    @Autowired
-    lateinit var accountUtilServcie: AccountUtilServcie
-    @Autowired
-    lateinit var personBalancePayService: PersonBalancePayService
-    @Autowired
-    lateinit var paytypeService: PaytypeService
-    @Autowired
-    lateinit var userService: UserService
-    @Autowired
-    lateinit var systemUtilService: SystemUtilService
-    @Autowired
-    lateinit var consumePayService: ConsumePayService
-    @Autowired
-    lateinit var commonService: CommonService
-
-    /**
-     * 流水结果查询统一接口
-     * */
-    fun queryDtlResult(@RequestBody param: QueryDtlResultParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        return try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            val dtl = if (StringUtil.isEmpty(param.refno)) {
-                personBalancePayService.getUserdtlForUpdateNowait(param.refno!!)
-            } else {
-                personBalancePayService.getUserdtlByBillnoForUpdateNowait(param.billno!!, param.shopaccno!!)
-            }
-            val person = dtl.userid?.let { userService.findPersonByUserid(dtl.userid) }
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .data("refno", dtl.refno)
-                    .data("amount", dtl.amount)
-                    .data("paytype", dtl.paytype)
-                    .data("payinfo", dtl.payinfo)
-                    .also {
-                        if (null != person) {
-                            it.data("name", person.name)
-                        }
-                    }
-                    .success("查询成功"))
-
-        } catch (ex: RequestParamCheckException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "查询错误"))
-        }
-
-    }
-
-    /**
-     * ============================================================================
-     *                           账户【余额支付】
-     * ============================================================================
-     * */
-    @PostMapping("/balance/pay")
-    fun balancePay(@RequestBody param: CitizenCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        return try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
-            if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_BALANCE)) {
-                val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .chooseTradetype(Tradetype.CONSUME) //消费
-                        .setOwner(person) //记名
-                        .setTransinfo(TradeCode.TRANSCODE_BALANCE_PAY, "账户余额支付")
-                        .setTransDatetime(param.transdate, param.transtime) //交易时间
-                        .selectPaytype(TradeDict.PAYTYPE_BALANCE, param.cardNo)
-                        .addDetail(AccountHolder.person(person.userid),
-                                AccountHolder.shop(param.shopaccno),
-                                param.amount / 100.0, "账户余额消费")
-                        .also { builder ->
-                            param.feelist?.forEach {
-                                when(it.feetype){
-                                    TradeDict.FEETYPE_CONSUME_MEALER -> {
-                                        if (it.amount <= 0) {
-                                            throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "费用类别<${it.feetype}>的金额不能为负")
-                                        }
-                                        builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_BALANCE)
-                                                .with(AccountHolder.shop(param.shopaccno))
-                                                .with(AccountHolder.person(person.userid))
-                                                , it.amount / 100.0)
-                                    }
-                                    TradeDict.FEETYPE_CONSUME_DISCOUNT->{
-                                        TODO("折扣逻辑暂缺")
-                                    }
-                                    else -> throw TransactionProcessException(TradeErrorCode.FEETYPE_NOT_NOSUPPORT, "费用类别<${it.feetype}>不支持")
-                                }
-
-                            }
-                        }
-                        .done(personBalancePayService)
-
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("refno", dtl.refno)
-                        .data("amount", dtl.amount)
-                        .success("交易成功"))
-            }
-
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<账户余额>"))
-
-        } catch (ex: RequestParamCheckException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-
-
-    /**
-     * ============================================================================
-     *                           市民卡【交易初始化】
-     * ============================================================================
-     * */
-    @PostMapping("/citizencard/payinit")
-    fun citizencardPayinit(@RequestBody param: CitizenCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        return try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
-            if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_CITIZEN_CARD)) {
-                val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .chooseTradetype(Tradetype.CONSUME) //消费
-                        .setOwner(person) //记名
-                        .setTransinfo(TradeCode.TRANSCODE_CITIZENCARD_PAY, "市民卡代扣消费")
-                        .setTransDatetime(param.transdate, param.transtime) //交易时间
-                        .selectPaytype(TradeDict.PAYTYPE_CITIZEN_CARD, param.cardNo)
-                        .addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_CITIZEN_CARD),
-                                AccountHolder.shop(param.shopaccno),
-                                param.amount / 100.0, "市民卡代扣消费")
-                        .also { builder ->
-                            param.feelist?.forEach {
-                                //fixme: 科目 -> 商户 与个人无关
-                                builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_CITIZEN_CARD)
-                                        .with(AccountHolder.shop(param.shopaccno))
-                                        .with(AccountHolder.subject(Subject.SUBJNO_PAY_CITIZEN_CARD))
-                                        , it.amount / 100.0)
-                            }
-                        }
-                        .init(personBalancePayService)
-
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("refno", dtl.refno)
-                        .data("amount", dtl.amount)
-                        .success("交易初始化成功"))
-            }
-
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<市民卡代扣>"))
-
-        } catch (ex: RequestParamCheckException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-    /**
-     * ============================================================================
-     *                           市民卡【交易确认】
-     * ============================================================================
-     * */
-    @PostMapping("/citizencard/payfinish")
-    fun citizencardPayinit(@RequestBody param: CitizenCardPayfinishParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        return try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-                    .setRefno(param.refno)
-                    .wip(personBalancePayService)
-            val code = CallService.CallCitizenCardPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, dtl.shopaccno), dtl)
-            if (code.retcode == "0") {
-                dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .setRefno(param.refno)
-                        .addResult(code.data)
-                        .success(personBalancePayService) //流水置成功
-
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("refno", dtl.refno)
-                        .data("billno", dtl.outtradeno)
-                        .success())
-            } else {
-                PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .setRefno(param.refno)
-                        .addResult("errmsg", code.retmsg!!)
-                        .finish(personBalancePayService, TradeDict.DTL_STATUS_FAIL) //流水置成功
-
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
-            }
-
-        } catch (ex: RequestParamCheckException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-
-
-    /**
-     * ============================================================================
-     *                           一卡通支付【交易初始化】
-     * ============================================================================
-     * */
-    @PostMapping("/ykt/payinit")
-    fun yktPayInit(@RequestBody param: YktCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        return try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            val person = param.uid?.let { userService.findByThirdUniqueIdenty(it) } ?: null //没注册，可能匿名?
-            if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_YKT_CARD, person==null)) {
-                val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .chooseTradetype(Tradetype.CONSUME) //消费
-                        .also {
-                            if (null != person) it.setOwner(person)
-                        }
-                        .setTransinfo(TradeCode.TRANSCODE_YKTCARD_PAY, "一卡通支付")
-                        .setTransDatetime(param.transdate, param.transtime) //交易时间
-                        .selectPaytype(TradeDict.PAYTYPE_YKT_CARD, param.stuempno)
-                        .addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT),
-                                AccountHolder.shop(param.shopaccno),
-                                param.amount / 100.0, "一卡通支付")
-                        .also { builder ->
-                            param.feelist?.forEach {
-                                //fixme: 科目 -> 商户 与个人无关
-                                builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_YKT_CARD)
-                                        .with(AccountHolder.shop(param.shopaccno))
-                                        .with(AccountHolder.subject(Subject.SUBJNO_PAY_YKT))
-                                        , it.amount / 100.0)
-                            }
-                        }
-                        .addExtendParam("stuempno", param.stuempno)
-                        .addExtendParam("yktshopid", param.yktshopid ?: "")
-                        .addExtendParam("devphyid", param.devphyid ?: "")
-                        //.addExtendParam(param.extendmap)  //fixme: 保存调一卡通附加参数 (是否直接传附加参数map)
-                        .init(personBalancePayService)
-
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("refno", dtl.refno)
-                        .data("amount", dtl.amount)
-                        .success("交易初始化成功"))
-
-            }
-
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<一卡通支付>"))
-        } catch (ex: RequestParamCheckException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-
-    /**
-     * ============================================================================
-     *                           一卡通支付【交易确认】
-     * ============================================================================
-     * */
-    @PostMapping("/ykt/payfinish")
-    fun yktPayFinish(@RequestBody param:CitizenCardPayfinishParam,request: HttpServletRequest,response: HttpServletResponse): ResponseEntity<Any> {
-        return try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-                    .setRefno(param.refno)
-                    .wip(personBalancePayService)
-            val extendMap = consumePayService.getUserdtlExtendParamMap(dtl.refno)
-            val code = CallService.callYktPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_YKT_CARD, dtl.shopaccno, dtl.userid==null),
-                    dtl, DateUtil.getNow(), extendMap["stuempno"]!!, extendMap["yktshopid"]!!, extendMap["devphyid"])
-            if (code.retcode == "0") {
-                dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .setRefno(param.refno)
-                        .addResult(code.data)
-                        .success(personBalancePayService) //流水置成功
-
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("refno", dtl.refno)
-                        .data("billno", dtl.outtradeno)
-                        .success())
-            } else {
-                PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .setRefno(param.refno)
-                        .addResult("errmsg", code.retmsg!!)
-                        .finish(personBalancePayService, TradeDict.DTL_STATUS_FAIL) //流水置成功
-
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
-            }
-
-        }catch (ex: RequestParamCheckException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-// ============================================== //
-//
-//    @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)
-//    }
-
-
-
-//
-//    /**
-//     * 微信支付
-//     * wechattype
-//     * qrcode-扫微信二维码支付
-//     * app-原生app微信支付
-//     * mp-微信公众号支付
-//     * h5-微信h5支付
-//     *
-//     * */
-//    @PostMapping("/wechat/payinit")
-//    fun wechatPayInit(userid: String, amount: Int, manageFee: Int,
-//                      stuempno: String, shopid: String, transdate: String, transtime: String,
-//                      outtradeno: String, payinfo: String, feetype: String,
-//                      wechattype: String, realip: String?, qrcode: String?, openid: String?): ResponseEntity<Any> {
-//        return try {
-//            val paytype = paytypeService.getByPaytype(PaytypeUtil.WECHAT)
-//            if (paytype == null || ConstantUtil.ENABLE_YES != paytype.enable) {
-//                ResponseEntity.ok(ResponseBodyBuilder.create()
-//                        .fail(1, "支付方式未开启"))
-//            }
-//            val person = userService.findByThirdUniqueIdenty(stuempno)
-//            val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-//                    .setTransDatetime(transdate, transtime)
-//                    .selectPaytype(PaytypeUtil.WECHAT, payinfo)
-//                    .setOuttradeno(outtradeno)
-//                    .also {
-//                        if (null != person) it.setOwner(person)
-//                    }
-//                    .tryLock(true)
-//                    .setTransinfo(TradeCode.TRANSCODE_WECHAT, "微信支付")
-//                    .chooseTradetype(Tradetype.CONSUME)
-//                    .also {
-//                        when (feetype) {
-//                            TradeDict.FEETYPE_CONSUME_MEALER -> {
-//                                it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT),
-//                                        AccountHolder.shop(shopid),
-//                                        amount / 100.0, "微信支付")
-//                                        .addDetail(AccountHolder.transType(TranstypeCode.TT_CONSUUME_MANAGE_FEE)
-//                                                .with(AccountHolder.shop(shopid)),
-//                                                manageFee / 100.0)
-//                            }
-//                            TradeDict.FEETYPE_CONSUME_DISCOUNT -> {
-//                                it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT),
-//                                        AccountHolder.shop(shopid),
-//                                        (amount - manageFee) / 100.0, "微信支付")
-//                                        .addDetail(AccountHolder.subject(Subject.SUBJNO_CONSUME_DISCOUNT),
-//                                                AccountHolder.shop(shopid),
-//                                                manageFee / 100.0, "优惠折扣")
-//                            }
-//                            else -> {
-//                                it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT),
-//                                        AccountHolder.shop(shopid),
-//                                        amount / 100.0, "微信支付")
-//                            }
-//                        }
-//                    }.done(personBalancePayService, false)
-//            val code = CallService.callWechatPay(paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.WECHAT),
-//                    dtl, DateUtil.getNow(), wechattype, realip, qrcode, openid)
-//            if (code.retcode == "0") {
-//                ResponseEntity.ok(ResponseBodyBuilder.create()
-//                        .data("refno", dtl.refno)
-//                        .success())
-//            } else {
-//                ResponseEntity.ok(ResponseBodyBuilder.create()
-//                        .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易请求失败-${code.retcode}"))
-//            }
-//        } catch (e: TransactionException) {
-//            ResponseEntity.ok(ResponseBodyBuilder.create()
-//                    .transException(e, "交易初始化异常"))
-//        }
-//    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt
deleted file mode 100644
index fe3d1a6..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt
+++ /dev/null
@@ -1,103 +0,0 @@
-package com.supwisdom.dlpay.api.controller
-
-import com.supwisdom.dlpay.api.PersonTransBuilder
-import com.supwisdom.dlpay.api.service.AccountUtilServcie
-import com.supwisdom.dlpay.api.service.PaytypeService
-import com.supwisdom.dlpay.api.service.PersonBalancePayService
-import com.supwisdom.dlpay.framework.util.MD5
-import com.supwisdom.dlpay.framework.util.StringUtil
-import com.supwisdom.dlpay.framework.util.TradeDict
-import com.supwisdom.dlpay.framework.util.XmlUtils
-import com.supwisdom.dlpay.util.PaytypeUtil
-import org.dom4j.io.SAXReader
-import org.slf4j.LoggerFactory
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.util.StringUtils
-import org.springframework.web.bind.annotation.PathVariable
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.ResponseBody
-import org.springframework.web.bind.annotation.RestController
-import java.util.HashMap
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
-
-/**
- * Created by shuwei on 2019/4/22.
- */
-@RestController
-@RequestMapping("/api/notify")
-class NotifyController {
-    private val logger = LoggerFactory.getLogger(NotifyController::class.java)
-    @Autowired
-    lateinit var personBalancePayService: PersonBalancePayService
-    @Autowired
-    lateinit var paytypeService: PaytypeService
-    @Autowired
-    lateinit var accountUtilServcie: AccountUtilServcie
-
-    @RequestMapping(value = "/wechat")
-    @ResponseBody
-    fun index(@PathVariable schema: String, request: HttpServletRequest,
-              response: HttpServletResponse): String {
-        try {
-            // 解析结果存储在HashMap
-            var map: MutableMap<String, String> = HashMap()
-            val inputStream = request.inputStream
-            // 读取输入流
-            val reader = SAXReader()
-            val document = reader.read(inputStream)
-            // 得到xml根元素
-            val root = document.rootElement
-            // 得到根元素的所有子节点
-            val elementList = root.elements()
-            // 遍历所有子节点
-         /*   for (e in elementList) {
-                map[e.name] = e.text
-                logger.error("*************" + e.name + "=" + e.text + "************************")
-            }*/
-            // 释放资源
-            inputStream.close()
-
-            val sign = map["sign"]
-            if (StringUtils.isEmpty(sign)) {
-                logger.error("签名错误")
-                return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名错误]]></return_msg></xml>"
-            }
-            map = StringUtil.paraFilter(map)
-            //TODO 校验签名
-            var signStr = StringUtil.createLinkString(map)
-            val config = paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.WECHAT)
-            if (config["appkey"].isNullOrEmpty()) {
-                logger.error("签名错误")
-                return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名错误]]></return_msg></xml>"
-            }
-            val key = config["appkey"]
-            signStr += "&key=$key"
-            val signRet = MD5.encodeByMD5(signStr)
-            logger.error("*******signStr=$signStr")
-            if (!signRet.equals(sign, ignoreCase = true)) {
-                return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>"
-            }
-            logger.error("*******signRet=$signRet,sign=$sign*****************")
-            val return_code = map["return_code"]
-            val result_code = map["result_code"]
-            val out_trade_no = map["out_trade_no"]
-            if (StringUtils.isEmpty(out_trade_no)) {
-                return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[订单信息错误]]></return_msg></xml>"
-            }
-            if (!StringUtils.isEmpty(return_code) && "SUCCESS" == return_code
-                    && !StringUtils.isEmpty(result_code) && "SUCCESS" == result_code) {
-                //map.get("transaction_id") 第三方流水号
-                PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .setRefno(out_trade_no!!)
-                        .addResult(map)
-                        .success(personBalancePayService)
-            }
-            return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"
-        } catch (e: Exception) {
-            e.printStackTrace()
-            logger.error("------------step7----------------" + e.message)
-            return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[解析失败]]></return_msg></xml>"
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt
deleted file mode 100644
index 5f92a0c..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.supwisdom.dlpay.api.controller
-
-import com.supwisdom.dlpay.api.bean.OpenShopParam
-import com.supwisdom.dlpay.api.bean.QueryShopParam
-import com.supwisdom.dlpay.framework.ResponseBodyBuilder
-import com.supwisdom.dlpay.api.service.ShopService
-import com.supwisdom.dlpay.exception.RequestParamCheckException
-import com.supwisdom.dlpay.exception.TransactionException
-import com.supwisdom.dlpay.framework.service.CommonService
-import com.supwisdom.dlpay.framework.util.TradeErrorCode
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.http.ResponseEntity
-import org.springframework.web.bind.annotation.*
-import java.net.URLDecoder
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
-
-@RestController
-@RequestMapping("/api/shop")
-class ShopAPIController {
-    @Autowired
-    private lateinit var shopService: ShopService
-    @Autowired
-    private lateinit var commonService: CommonService
-
-    @PostMapping("/open")
-    fun openAccount(@RequestBody param: OpenShopParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        return try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-            shopService.findByThirdUniqueId(param.shopUniqueId)?.let {
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.BUSINESS_SHOP_EXISTS, "该商户唯一号[${param.shopUniqueId}]已经存在"))
-            }
-
-            param.shopname = param.shopname?.let { URLDecoder.decode(param.shopname, Charsets.UTF_8.toString()) } //解码
-            param.contactman = param.contactman?.let { URLDecoder.decode(param.contactman, Charsets.UTF_8.toString()) } //解码
-            param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) } //解码
-            shopService.registerShop(param)?.let {
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("shopid", it.shopid)
-                        .data("shopaccno", it.shopaccno ?: "")
-                        .success("注册成功"))
-            }
-
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "商户注册失败"))
-        } catch (ex: RequestParamCheckException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-    @GetMapping("/query")
-    fun queryShop(@RequestBody param: QueryShopParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        return try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            shopService.findByShopBySearch(param.shopid, param.shopaccno, param.shopUniqueId)?.let {
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("shop", it)
-                        .success())
-            }
-
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.SHOP_NOT_EXISTS, "商户不存在"))
-        } catch (ex: RequestParamCheckException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
deleted file mode 100644
index 5b838e4..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
+++ /dev/null
@@ -1,146 +0,0 @@
-package com.supwisdom.dlpay.api.controller
-
-import com.supwisdom.dlpay.api.bean.ModifyUserParam
-import com.supwisdom.dlpay.api.bean.OpenUserParam
-import com.supwisdom.dlpay.api.bean.QueryUserParam
-import com.supwisdom.dlpay.api.service.UserService
-import com.supwisdom.dlpay.exception.RequestParamCheckException
-import com.supwisdom.dlpay.exception.TransactionException
-import com.supwisdom.dlpay.framework.ResponseBodyBuilder
-import com.supwisdom.dlpay.framework.service.CommonService
-import com.supwisdom.dlpay.framework.util.TradeErrorCode
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.http.ResponseEntity
-import org.springframework.web.bind.annotation.PostMapping
-import org.springframework.web.bind.annotation.RequestBody
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RestController
-import java.net.URLDecoder
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
-
-@RestController
-@RequestMapping("/api/user")
-class UserAPIController {
-    @Autowired
-    private lateinit var useService: UserService
-    @Autowired
-    private lateinit var commonService: CommonService
-
-    @PostMapping("/open")
-    fun openAccount(@RequestBody param: OpenUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        return try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-            useService.findByThirdUniqueIdenty(param.uid).let {
-                if (null != it) {
-                    ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .fail(TradeErrorCode.REGISTER_USER_EXIST, "改用户唯一号已经注册"))
-                }
-
-                param.name = URLDecoder.decode(param.name, Charsets.UTF_8.toString()) //解码
-                param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) }  //解码
-                useService.registerUser(param).let {
-                    if (null != it) {
-                        ResponseEntity.ok(ResponseBodyBuilder.create()
-                                .data("userid", it.userid)
-                                .data("uid", param.uid)
-                                .success())
-                    }
-
-                    ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "用户注册失败"))
-                }
-            }
-        } catch (ex: RequestParamCheckException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-    @PostMapping("/query")
-    fun queryAccount(@RequestBody param: QueryUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        return try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-
-            useService.findByUseridOrThirdUniqueIdenty(param.userid, param.uid).let {
-                if (null != it) {
-                    val account = useService.findAccountByUserid(it.userid, null)
-                    val pointacc = useService.findPointsAccountByUserid(it.userid)
-                    ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .data("userid", it.userid)
-                            .data("name", it.name)
-                            .data("idtype", it.idtype)
-                            .data("idno", it.idno)
-                            .data("mobile", it.mobile)
-                            .data("email", it.email)
-                            .data("status", it.status)
-                            .data("balance", account.let {
-                                if (null == it) {
-                                    0.0
-                                } else {
-                                    it.availbal
-                                }
-                            }) //账户余额
-                            .data("points", pointacc.let {
-                                if (null == it) {
-                                    0
-                                } else {
-                                    it.points
-                                }
-                            }) //积分
-                            .success())
-                }
-
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在"))
-            }
-        } catch (ex: RequestParamCheckException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-    @PostMapping("/modify")
-    fun modifyAccount(@RequestBody param: ModifyUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
-        return try {
-            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
-            }
-            useService.findByUseridOrThirdUniqueIdenty(param.userid, param.uid)?.let {
-                param.name = param.name?.let { URLDecoder.decode(param.name, Charsets.UTF_8.toString()) } //解码
-                param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) } //解码
-                if (useService.modifyUserInfo(it, param)) {
-                    ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .success("修改成功"))
-                } else {
-                    ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "账户信息修改失败"))
-                }
-            }
-
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在"))
-        } catch (ex: RequestParamCheckException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .requestException(ex, "请求参数错误"))
-        } catch (et: TransactionException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(et, "业务处理错误"))
-        }
-    }
-
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/common_api_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/common_api_service.kt
new file mode 100644
index 0000000..3da2af8
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/common_api_service.kt
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.api.service
+
+import com.supwisdom.dlpay.restaurant.domain.TDevice
+
+interface CommonApiService {
+
+    fun getDeviceByDevphyid(devphyid: String): TDevice
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
deleted file mode 100644
index 54d8475..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.supwisdom.dlpay.api.service
-
-import org.springframework.transaction.annotation.Propagation
-import org.springframework.transaction.annotation.Transactional
-
-interface ConsumePayService{
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun checkShopPaytype(shopaccno: String, paytype: String, anonymousflag: Boolean? = false): Boolean
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun getPaytypeConfig(paytype: String, shopaccno: String, anonymousflag: Boolean? = false, ignoreStatus: Boolean? = false): Map<String, String?>
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun getUserdtlExtendParamMap(refno: String): Map<String, String>
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/Consume_pay_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/Consume_pay_service_impl.kt
deleted file mode 100644
index 3c40253..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/Consume_pay_service_impl.kt
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.supwisdom.dlpay.api.service.impl
-
-import com.supwisdom.dlpay.api.dao.PaytypeDao
-import com.supwisdom.dlpay.api.dao.ShopPaytypeConfigDao
-import com.supwisdom.dlpay.api.dao.ShopPaytypeDao
-import com.supwisdom.dlpay.api.dao.UserdtlBusinessDao
-import com.supwisdom.dlpay.api.domain.TUserdtlBusiness
-import com.supwisdom.dlpay.api.service.ConsumePayService
-import com.supwisdom.dlpay.exception.TransactionProcessException
-import com.supwisdom.dlpay.framework.util.TradeErrorCode
-import com.supwisdom.dlpay.util.ConstantUtil
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.stereotype.Service
-
-@Service
-class ConsumePayServiceImpl: ConsumePayService{
-    @Autowired
-    lateinit var paytypeDao: PaytypeDao
-    @Autowired
-    lateinit var shopPaytypeDao: ShopPaytypeDao
-    @Autowired
-    lateinit var shopPaytypeConfigDao: ShopPaytypeConfigDao
-    @Autowired
-    lateinit var userdtlBusinessDao: UserdtlBusinessDao
-
-    override fun checkShopPaytype(shopaccno: String, paytype: String, anonymousflag: Boolean?): Boolean{
-        paytypeDao.getByPaytype(paytype).let {
-            if (null == it) {
-                throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统不支持支付方式[$paytype]")
-            } else {
-                if (ConstantUtil.ENABLE_YES != it.enable || ConstantUtil.ENABLE_YES != it.consumeEnable) {
-                    throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统未启用支付方式[$paytype]消费")
-                }
-                if (true == anonymousflag && ConstantUtil.ENABLE_YES != it.anonymousEnable) {
-                    throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统支付方式[$paytype]未启用匿名消费")
-                }
-            }
-        }
-        shopPaytypeDao.getById(paytype, shopaccno).let {
-            if (null == it) {
-                throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]未启用支付方式[$paytype]")
-            } else {
-                if (ConstantUtil.ENABLE_YES != it.consumeEnable) {
-                    throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]未启用支付方式[$paytype]")
-                }
-                if (true == anonymousflag && ConstantUtil.ENABLE_YES != it.anonymousEnable) {
-                    throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$paytype]未启用匿名消费")
-                }
-            }
-        }
-        return true
-    }
-
-    override fun getPaytypeConfig(paytype: String, shopaccno: String, anonymousflag: Boolean?, ignoreStatus: Boolean?): Map<String, String?> {
-        paytypeDao.getByPaytype(paytype).let {
-            if (null == it) {
-                throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统不支持支付方式[$paytype]")
-            } else {
-                //对账取配置时不关心状态，不能报错
-                if (true != ignoreStatus && (ConstantUtil.ENABLE_YES != it.enable || ConstantUtil.ENABLE_YES != it.consumeEnable)) {
-                    throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统未启用支付方式[$paytype]消费")
-                }
-                if (true != ignoreStatus && true == anonymousflag && ConstantUtil.ENABLE_YES != it.anonymousEnable) {
-                    throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统支付方式[$paytype]未启用匿名消费")
-                }
-            }
-        }
-
-        shopPaytypeDao.getById(paytype, shopaccno).let {
-            if (null == it) {
-                throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]未启用支付方式[$paytype]")
-            } else {
-                //对账取配置时不关心状态，不能报错
-                if (true != ignoreStatus && ConstantUtil.ENABLE_YES != it.consumeEnable) {
-                    throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]未启用支付方式[$paytype]")
-                }
-                if (true != ignoreStatus && true == anonymousflag && ConstantUtil.ENABLE_YES != it.anonymousEnable) {
-                    throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$paytype]未启用匿名消费")
-                }
-            }
-        }
-
-        shopPaytypeConfigDao.getShopPaytypeConfigs(paytype, shopaccno)?.let {
-            if (it.size < 1) {
-                throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$paytype]未配置参数")
-            } else {
-                val result = mutableMapOf<String, String?>()
-                it.forEach { result.plus(mapOf(it.configid to it.configValue)) }
-                return result
-            }
-        } ?: throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$paytype]未配置参数")
-    }
-
-    override fun getUserdtlExtendParamMap(refno: String): Map<String, String> {
-        return userdtlBusinessDao.getByRefno(refno)?.let {
-            it.contentMap
-        } ?: mutableMapOf<String, String>()
-    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/common_api_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/common_api_service_impl.kt
new file mode 100644
index 0000000..1e4d557
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/common_api_service_impl.kt
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.api.service.impl
+
+import com.supwisdom.dlpay.api.service.CommonApiService
+import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import com.supwisdom.dlpay.restaurant.dao.DeviceDao
+import com.supwisdom.dlpay.restaurant.domain.TDevice
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+
+@Service
+class CommonApiServiceImpl : CommonApiService {
+    @Autowired
+    lateinit var deviceDao: DeviceDao
+
+    override fun getDeviceByDevphyid(devphyid: String): TDevice {
+        return deviceDao.findByDevphyid(devphyid)
+                ?: throw TransactionProcessException(TradeErrorCode.POS_NOT_EXISTS, "设备[$devphyid]不存在")
+    }
+
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt
deleted file mode 100644
index a322f11..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt
+++ /dev/null
@@ -1,335 +0,0 @@
-package com.supwisdom.dlpay.api.service.impl
-
-import com.supwisdom.dlpay.api.PersonTransBuilder
-import com.supwisdom.dlpay.api.dao.AccountDao
-import com.supwisdom.dlpay.api.dao.DebitCreditDtlDao
-import com.supwisdom.dlpay.api.dao.UserdtlBusinessDao
-import com.supwisdom.dlpay.api.dao.UserdtlDao
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TDebitCreditDtl
-import com.supwisdom.dlpay.api.domain.TUserdtl
-import com.supwisdom.dlpay.api.domain.TUserdtlBusiness
-import com.supwisdom.dlpay.api.service.AccountUtilServcie
-import com.supwisdom.dlpay.api.service.PersonBalancePayService
-import com.supwisdom.dlpay.exception.TransactionException
-import com.supwisdom.dlpay.exception.TransactionProcessException
-import com.supwisdom.dlpay.framework.dao.*
-import com.supwisdom.dlpay.framework.domain.TFeetypeConfig
-import com.supwisdom.dlpay.framework.domain.TShopacc
-import com.supwisdom.dlpay.framework.domain.TSubject
-import com.supwisdom.dlpay.framework.service.SystemUtilService
-import com.supwisdom.dlpay.framework.util.*
-import org.hibernate.exception.LockTimeoutException
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.dao.CannotAcquireLockException
-import org.springframework.stereotype.Service
-import javax.persistence.EntityManager
-import javax.persistence.PersistenceContext
-
-
-@Service
-class AccountUtilServcieImpl : AccountUtilServcie {
-
-    @Autowired
-    lateinit var accountDao: AccountDao
-
-    @Autowired
-    lateinit var shopaccDao: ShopaccDao
-
-    @Autowired
-    lateinit var subjectDao: SubjectDao
-
-    @Autowired
-    lateinit var feetypeConfigDao: FeetypeConfigDao
-
-    override fun readAccountForUpdateNowait(userid: String): TAccount {
-        return try {
-            accountDao.getByUseridForUpdateNowait(userid)
-                    ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户<$userid>不存在")
-        } catch (ex: Exception) {
-            when (ex) {
-                is CannotAcquireLockException, is LockTimeoutException -> throw TransactionException(TradeErrorCode.ACCOUNT_TRADE_BUSY, "账户<$userid>交易繁忙，请稍后再试")
-                else -> throw ex
-            }
-        }
-    }
-
-    override fun readAccount(userid: String): TAccount {
-        return accountDao.findByUserid(userid)
-                ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户<$userid>不存在")
-    }
-
-    override fun readShopAcc(shopId: Int): TShopacc {
-        return shopaccDao.findByShopid(shopId)
-                ?: throw TransactionProcessException(TradeErrorCode.SHOP_NOT_EXISTS, "商户<$shopId>不存在")
-    }
-
-    override fun readSubject(subjno: String): TSubject {
-        return subjectDao.findBySubjno(subjno)
-                ?: throw TransactionProcessException(TradeErrorCode.SUBJECT_NOT_EXISTS, "科目<$subjno>不存在")
-    }
-
-    override fun readFeetype(feetype: String, paytype: String): TFeetypeConfig {
-        return feetypeConfigDao.getById(feetype, paytype)
-                ?: throw TransactionProcessException(TradeErrorCode.FEETYPE_NOT_EXISTS, "在支付方式<$paytype>下不存在费用类别<$feetype>")
-    }
-}
-
-@Service
-class PersonBalancePayServiceImpl : PersonBalancePayService {
-    @Autowired
-    lateinit var userdtlDao: UserdtlDao
-    @Autowired
-    lateinit var debitCreditDtlDao: DebitCreditDtlDao
-
-    @Autowired
-    lateinit var accountDao: AccountDao
-
-    @Autowired
-    lateinit var userdtlBusinessDao: UserdtlBusinessDao
-
-    @PersistenceContext
-    lateinit var em: EntityManager
-
-    @Autowired
-    lateinit var systemUtilService: SystemUtilService
-
-
-    private fun getlockAccount(accno: String): TAccount {
-        return accountDao.getByAccnoForUpdate(accno)
-                ?: throw throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账号<$accno>不存在")
-    }
-
-    private fun getlockAccountNowait(accno: String): TAccount {
-        return try {
-            accountDao.getByAccnoForUpdateNowait(accno)
-                    ?: throw throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账号<$accno>不存在")
-        } catch (ex: Exception) {
-            when (ex) {
-                is CannotAcquireLockException, is LockTimeoutException -> throw TransactionException(TradeErrorCode.ACCOUNT_TRADE_BUSY, "账号<$accno>交易繁忙，请稍后再试")
-                else -> throw ex
-            }
-        }
-    }
-
-    private fun getLockUserdtlNowait(refno: String): TUserdtl {
-        return try {
-            userdtlDao.findByRefnoForUpdateNowait(refno)
-                    ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易参考号<$refno>不存在")
-        } catch (ex: Exception) {
-            when (ex) {
-                is CannotAcquireLockException, is LockTimeoutException -> throw TransactionException(TradeErrorCode.LOCK_READ_TIMEOUT, "交易参考号<$refno>流水被锁定，请稍后再试")
-                else -> throw ex
-            }
-        }
-    }
-
-    private fun getLockUserdtl(refno: String): TUserdtl {
-        return userdtlDao.findByRefnoForUpdate(refno)
-                ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易参考号<$refno>不存在")
-    }
-
-    private fun doDealAccount(accno: String, amount: Double, overdraft: Boolean): TAccount {
-        val account = getlockAccount(accno)
-        if (account.tacCheck())
-            throw TransactionProcessException(TradeErrorCode.ACCOUNT_TAC_ERROR, "账户<$accno>tac校验异常")
-
-        account.addAmount(amount) //入账
-        if (account.checkOverflow())
-            throw TransactionProcessException(TradeErrorCode.OVERFLOW_BALANCE_ERROR, "账户<$accno>已超最大余额限制")
-
-        if (!overdraft && account.checkOverdraft())
-            throw TransactionProcessException(TradeErrorCode.SHORT_BALANCE_ERROR, "账户<$accno>余额不足")
-
-        return accountDao.save(account) //入库更新
-    }
-
-    private fun doDealShopacc(shopaccno: String, amount: Double) {
-        return
-    }
-
-    override fun process(builder: PersonTransBuilder): TUserdtl {
-        return finish(init(builder), TradeDict.DTL_STATUS_SUCCESS, builder.resultMap)
-    }
-
-    override fun init(builder: PersonTransBuilder): TUserdtl {
-        //判断第三方流水号重复  标准：shopaccno + outtradeno 唯一？
-        var userdtl = userdtlDao.findByOuttradenoAndShopaccno(builder.outtradeno, builder.shopaccno) //加锁？
-        if (null != userdtl) {
-            if (TradeDict.DTL_STATUS_INIT != userdtl.status) {
-                throw TransactionProcessException(TradeErrorCode.OUTTRADENO_ALREADY_EXISTS, "外部流水号重复") //非初始化状态，直接报错
-            }
-            //fixme: 判断是同一笔交易重发（标准？？）  是->已初始化直接返回；否 -> 报错：外部流水号重复
-            if(builder.amount == userdtl.amount && builder.paytype == userdtl.paytype && builder.transDate == userdtl.transdate && builder.transTime==userdtl.transtime){
-                return userdtl // 交易日期，时间重发时是否会变？？
-            }else{
-                throw TransactionProcessException(TradeErrorCode.OUTTRADENO_ALREADY_EXISTS, "外部流水号重复")
-            }
-        }
-
-        userdtl = TUserdtl() // 新建流水
-        userdtl.refno = systemUtilService.refno
-        userdtl.accdate = systemUtilService.accdate
-        userdtl.userid = builder.person.userid
-        if (StringUtil.isEmpty(builder.transDate)) {
-            userdtl.transdate = systemUtilService.sysdatetime.hostdate
-        } else {
-            userdtl.transdate = builder.transDate
-        }
-        if (StringUtil.isEmpty(builder.transTime)) {
-            userdtl.transdate = systemUtilService.sysdatetime.hosttime
-        } else {
-            userdtl.transtime = builder.transTime
-        }
-        userdtl.paytype = builder.paytype
-        userdtl.payinfo = builder.payinfo
-        userdtl.transcode = builder.transcode
-        if (StringUtil.isEmpty(builder.description)) {
-            userdtl.transdesc = systemUtilService.getTranscodeName(builder.transcode, null)
-        } else {
-            userdtl.transdesc = builder.description
-        }
-        userdtl.outtradeno = builder.outtradeno
-        userdtl.shopaccno = builder.shopaccno
-//        userdtl.operid =
-        when (builder.tradetype) {
-            Tradetype.RECHARGE -> userdtl.tradeflag = 1
-            Tradetype.CONSUME -> userdtl.tradeflag = 2
-        }
-        userdtl.createtime = systemUtilService.sysdatetime.hostdatetime
-
-        userdtl.amount = builder.amount
-        userdtl.status = TradeDict.DTL_STATUS_INIT
-        userdtlDao.save(userdtl)
-
-        builder.details.forEach {
-            TDebitCreditDtl().apply {
-                refno = userdtl.refno
-                seqno = it.rowno
-                drsubjno = it.debitSubjNo
-                draccno = it.debitAccNo
-                crsubjno = it.creditSubjNo
-                craccno = it.creditAccNo
-                amount = it.amount
-                summary = it.summary
-                debitCreditDtlDao.save(this)
-            }
-        }
-
-        if(builder.extendMap.isNotEmpty()){
-            userdtlBusinessDao.save(TUserdtlBusiness(userdtl.refno, builder.extendMap)) //保存参数
-        }
-
-        return userdtl
-    }
-
-    override fun finish(paydtl: TUserdtl, status: String, businessData: Map<String, String>?): TUserdtl {
-        return finish(paydtl.refno, status, businessData)
-    }
-
-    private fun fail(userdtl: TUserdtl, businessData: Map<String, String>?) {
-        //失败
-        if (TradeDict.DTL_STATUS_SUCCESS == userdtl.status)
-            throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水已经交易成功")
-        userdtl.status = TradeDict.DTL_STATUS_FAIL
-        userdtl.endtime = systemUtilService.sysdatetime.hostdatetime
-        userdtl.remark = businessData?.get("errmsg")
-        userdtlDao.save(userdtl)
-    }
-
-    private fun success(userdtl: TUserdtl, businessData: Map<String, String>?) {
-        if (TradeDict.DTL_STATUS_SUCCESS == userdtl.status) {
-            return
-        }
-        //TODO 校验已经成功的流水，不重复入账
-        debitCreditDtlDao.findByRefno(userdtl.refno).forEach { detail ->
-            //个人账户入账
-            if (Subject.SUBJNO_PERSONAL_DEPOSIT == detail.drsubjno) {
-                doDealAccount(detail.draccno, -1 * detail.amount, false) //借方消费
-            }
-            if (Subject.SUBJNO_PERSONAL_DEPOSIT == detail.crsubjno) {
-                doDealAccount(detail.craccno, detail.amount, false) //贷方充值
-            }
-
-            //商户入账
-            if (Subject.SUBJNO_MACHANT_INCOME == detail.drsubjno) {
-                doDealShopacc(detail.draccno, -1 * detail.amount)
-            }
-            if (Subject.SUBJNO_MACHANT_INCOME == detail.crsubjno) {
-                doDealShopacc(detail.craccno, detail.amount)
-            }
-        }
-
-        userdtl.status = TradeDict.DTL_STATUS_SUCCESS
-        userdtl.accdate = systemUtilService.accdate //入账成功时更新
-        userdtl.endtime = systemUtilService.sysdatetime.hostdatetime
-        //TODO 存储一些业务参数
-        userdtlDao.save(userdtl)
-    }
-
-    override fun finish(refno: String, status: String, businessData: Map<String, String>?): TUserdtl {
-        val userdtl = getLockUserdtl(refno)
-        return when (status) {
-            TradeDict.DTL_STATUS_FAIL -> {
-                fail(userdtl, businessData)
-                userdtl
-            }
-            TradeDict.DTL_STATUS_SUCCESS -> {
-                //成功
-                success(userdtl, businessData)
-                userdtl
-            }
-            else -> throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_ERROR, "未指定明确的交易结束状态")
-        }
-    }
-
-    override fun wip(paydtl: TUserdtl): TUserdtl {
-        return wip(paydtl.refno)
-    }
-
-    override fun wip(refno: String): TUserdtl {
-        val userdtl = getLockUserdtlNowait(refno)
-        if (TradeDict.DTL_STATUS_WIP == userdtl.status) {
-            return userdtl
-        }
-
-        if (TradeDict.DTL_STATUS_INIT != userdtl.status) {
-            throw TransactionProcessException(TradeErrorCode.TRANSDTL_STATUS_NOT_INIT,
-                    "交易参考号<$refno>非初始化流水")
-        }
-        userdtl.status = TradeDict.DTL_STATUS_WIP  //待支付
-        return userdtlDao.save(userdtl)
-    }
-
-    override fun wip(builder: PersonTransBuilder): TUserdtl {
-        return wip(builder.refno)
-    }
-
-    override fun finish(builder: PersonTransBuilder): TUserdtl{
-        return finish(builder.refno, builder.status, builder.resultMap)
-    }
-
-    override fun getUserdtlForUpdateNowait(refno: String): TUserdtl{
-        return try {
-            userdtlDao.findByRefnoForUpdateNowait(refno)
-                    ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "交易参考号<$refno>流水不存在")
-        } catch (ex: Exception) {
-            when (ex) {
-                is CannotAcquireLockException, is LockTimeoutException -> throw TransactionException(TradeErrorCode.ACCOUNT_TRADE_BUSY, "流水<$refno>被锁定，请稍后再试")
-                else -> throw ex
-            }
-        }
-    }
-
-    override fun getUserdtlByBillnoForUpdateNowait(billno: String, shopaccno: String): TUserdtl {
-        return try {
-            userdtlDao.findByBillnoForUpdateNowait(billno, shopaccno)
-                    ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "商户流水号<$billno>流水不存在")
-        } catch (ex: Exception) {
-            when (ex) {
-                is CannotAcquireLockException, is LockTimeoutException -> throw TransactionException(TradeErrorCode.ACCOUNT_TRADE_BUSY, "商户流水号<$billno>流水被锁定，请稍后再试")
-                else -> throw ex
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/shop_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/shop_service_impl.kt
deleted file mode 100644
index 07c6c40..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/shop_service_impl.kt
+++ /dev/null
@@ -1,94 +0,0 @@
-package com.supwisdom.dlpay.api.service.impl
-
-import com.supwisdom.dlpay.api.bean.OpenShopParam
-import com.supwisdom.dlpay.framework.dao.ShopDao
-import com.supwisdom.dlpay.framework.dao.ShopaccDao
-import com.supwisdom.dlpay.framework.domain.TShop
-import com.supwisdom.dlpay.framework.domain.TShopacc
-import com.supwisdom.dlpay.framework.service.SystemUtilService
-import com.supwisdom.dlpay.framework.util.Subject
-import com.supwisdom.dlpay.api.service.ShopService
-import com.supwisdom.dlpay.exception.TransactionProcessException
-import com.supwisdom.dlpay.framework.util.StringUtil
-import com.supwisdom.dlpay.framework.util.TradeDict
-import com.supwisdom.dlpay.framework.util.TradeErrorCode
-import com.supwisdom.dlpay.util.ConstantUtil
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.stereotype.Service
-
-/**
- * Created by shuwei on 2019/4/15.
- */
-@Service
-class ShopServiceImpl : ShopService {
-    @Autowired
-    private lateinit var shopDao: ShopDao
-    @Autowired
-    private lateinit var shopaccDao: ShopaccDao
-    @Autowired
-    private lateinit var systemUtilService: SystemUtilService
-
-    override fun findByThirdUniqueId(uniqueId: String): TShop? {
-       return shopDao.getByThirdUniqueIdenty(uniqueId)
-    }
-
-    override fun registerShop(param: OpenShopParam): TShop {
-        val systemdatetime = systemUtilService.sysdatetime
-        var shop = shopDao.getByThirdUniqueIdentyForUpdate(param.shopUniqueId)
-        if (null != shop) {
-            throw TransactionProcessException(TradeErrorCode.BUSINESS_SHOP_EXISTS, "该商户唯一号[${param.shopUniqueId}]已经存在")
-        }
-        if (null != param.fshopid) {
-            shopDao.getTShopByShopid(param.fshopid).let {
-                if (null == it) {
-                    throw TransactionProcessException(TradeErrorCode.SHOP_NOT_EXISTS, "上级商户不存在已经存在")
-                }
-            }
-        }
-        shop = shopDao.save(TShop().apply {
-            fshopid = param.fshopid
-            shopname = param.shopname
-            shoptype = param.shoptype
-            status = TradeDict.STATUS_NORMAL
-            contactman = param.contactman
-            idtype = param.idtype
-            idno = param.idno
-            mobile = param.mobile
-            email = param.email
-            addr = param.address
-            zipcode = param.zipcode
-            opendate = systemdatetime.hostdate
-            thirdUniqueIdenty = param.shopUniqueId
-        })
-        if (ConstantUtil.SHOPTYPE_GROUP != shop.shoptype) {
-            //非商户组要创建账号
-            val shopaccno = String.format("2%09d", shop.shopid)
-            shopaccDao.save(TShopacc().apply {
-                this.shopaccno = shopaccno
-                this.shopid = shop.shopid
-                this.shopname = shop.shopname
-                this.subjno = Subject.SUBJNO_MACHANT_INCOME
-                this.status = TradeDict.STATUS_NORMAL
-                this.opendate = shop.opendate
-            })
-            shop.shopaccno = shopaccno
-            shopDao.save(shop) //更新账号
-        }
-        return shop
-    }
-
-    override fun findByShopId(shopid: Int): TShop {
-        return shopDao.getTShopByShopid(shopid)
-                ?: throw TransactionProcessException(TradeErrorCode.SHOP_NOT_EXISTS, "商户[ID=$shopid]不存在")
-    }
-
-    override fun findByShopBySearch(shopid: Int?, shopaccno: String?, shopUniqueId: String?): TShop? {
-        return if (null != shopid) {
-            shopDao.getTShopByShopid(shopid)
-        } else if (!StringUtil.isEmpty(shopaccno)) {
-            shopDao.getTShopByShopaccno(shopaccno)
-        } else {
-            shopDao.getByThirdUniqueIdenty(shopUniqueId)
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
deleted file mode 100644
index fa30ada..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
+++ /dev/null
@@ -1,170 +0,0 @@
-package com.supwisdom.dlpay.api.service.impl
-
-import com.supwisdom.dlpay.api.bean.ModifyUserParam
-import com.supwisdom.dlpay.api.bean.OpenUserParam
-import com.supwisdom.dlpay.api.dao.AccountDao
-import com.supwisdom.dlpay.api.dao.PersonDao
-import com.supwisdom.dlpay.api.dao.PersonIdentityDao
-import com.supwisdom.dlpay.api.dao.PointsAccountDao
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TPerson
-import com.supwisdom.dlpay.api.domain.TPersonIdentity
-import com.supwisdom.dlpay.api.domain.TPointsAccount
-import com.supwisdom.dlpay.framework.service.SystemUtilService
-import com.supwisdom.dlpay.api.service.UserService
-import com.supwisdom.dlpay.exception.TransactionProcessException
-import com.supwisdom.dlpay.framework.util.*
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.stereotype.Service
-
-/**
- * Created by shuwei on 2019/4/15.
- */
-@Service
-class UserServiceImpl : UserService {
-    @Autowired
-    private lateinit var personDao: PersonDao
-    @Autowired
-    private lateinit var accountDao: AccountDao
-    @Autowired
-    private lateinit var personIdentityDao: PersonIdentityDao
-    @Autowired
-    private lateinit var pointsAccountDao: PointsAccountDao
-    @Autowired
-    private lateinit var systemUtilService: SystemUtilService
-
-    override fun registerUser(param: OpenUserParam): TPerson {
-        var person = personDao.findByIdentity(param.idtype, param.idno)
-        if (null != person && param.name != person.name)
-            throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "证件指定用户与请求的用户名不匹配")
-
-        val systemdatetime = systemUtilService.sysdatetime
-        if (null == person) {
-            person = personDao.save(TPerson().apply {
-                name = param.name
-                sex = param.sex
-                status = TradeDict.STATUS_NORMAL
-                idtype = param.idtype
-                idno = param.idno
-                email = param.email
-                tel = param.tel
-                mobile = param.mobile
-                addr = param.address
-                zipcode = param.zipcode
-                lastsaved = systemdatetime.hostdatetime
-            })
-        }
-
-        if (accountDao.findByUseridAndSubjno(person.userid, Subject.SUBJNO_PERSONAL_DEPOSIT) == null) {
-            //开户
-            TAccount().apply {
-                accname = person.name
-                subjno = Subject.SUBJNO_PERSONAL_DEPOSIT
-                userid = person.userid
-                status = person.status
-                balance = 0.0
-                availbal = 0.0
-                frozebal = 0.0
-                lowfreeFlag = false
-                lowfreeLimit = lowfreeLimit
-                daylimit = daylimit
-                maxbal = systemUtilService.getSysparaValueAsDouble(SysparaUtil.SYSPARAID_NO1, SysparaUtil.SYSPARA_NO1_DEFAULT)
-                lasttransdate = systemdatetime.hostdate
-                lastdayTransamt = 0.0
-                lastdayDpsamt = 0.0
-                opendate = systemdatetime.hostdate
-                tac = this.generateTac()
-                accountDao.save(this)
-            }
-        }
-        personIdentityDao.save(TPersonIdentity().apply {
-            thirdUid = param.uid
-            this.person = person
-            status = person.status
-            lossflag = 0
-            lockflag = 0
-            createtime = systemdatetime.hostdatetime
-        }) //保存绑定关系
-
-        return person
-    }
-
-    override fun findByThirdUniqueIdenty(thirdUniqueIdenty: String): TPerson? {
-        return personIdentityDao.getByThirdUid(thirdUniqueIdenty)?.let { it.person }
-    }
-
-    override fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?): TPerson? {
-        return if (!StringUtil.isEmpty(userid)) {
-            personDao.findByUserid(userid)
-        } else {
-            personIdentityDao.getByThirdUid(thirdUniqueIdenty)?.let { it.person }
-        }
-    }
-
-    override fun modifyUserInfo(person: TPerson, param: ModifyUserParam): Boolean {
-        if (!StringUtil.isEmpty(param.name) && param.name != person.name) {
-            person.name = param.name
-            accountDao.findByUseridAndSubjno(person.userid, Subject.SUBJNO_PERSONAL_DEPOSIT)?.let {
-                it.accname = param.name
-                accountDao.save(it)
-            }
-        }
-        if (!StringUtil.isEmpty(param.sex)) person.sex = param.sex
-        if (!StringUtil.isEmpty(param.idno)) {
-            person.idtype = param.idtype
-            person.idno = param.idno
-        }
-        if (!StringUtil.isEmpty(param.mobile)) person.mobile = param.mobile
-        if (!StringUtil.isEmpty(param.tel)) person.tel = param.tel
-        if (!StringUtil.isEmpty(param.email)) person.email = param.email
-        if (!StringUtil.isEmpty(param.address)) person.addr = param.address
-        if (!StringUtil.isEmpty(param.zipcode)) person.zipcode = param.zipcode
-        personDao.save(person)
-        return true
-    }
-
-    override fun findPersonByUserid(userid: String): TPerson? {
-        return personDao.findByUserid(userid)
-    }
-
-    override fun findAccountByUserid(userid: String, subjno: String?): TAccount? {
-        return if (!StringUtil.isEmpty(subjno)) {
-            accountDao.findByUseridAndSubjno(userid, subjno)
-        } else {
-            accountDao.findByUseridAndSubjno(userid, Subject.SUBJNO_PERSONAL_DEPOSIT)
-        }
-    }
-
-    override fun findPointsAccountByUserid(userid: String): TPointsAccount? {
-        return pointsAccountDao.findByUserid(userid)
-    }
-
-    override fun findPersonIdentity(thirdUniqueIdenty: String): TPersonIdentity? {
-        return personIdentityDao.getByThirdUid(thirdUniqueIdenty)
-    }
-
-    override fun findPersonByIdentityCheckStatus(thirdUniqueIdenty: String): TPerson {
-        personIdentityDao.getByThirdUid(thirdUniqueIdenty).let {
-            if (null != it) {
-                if (TradeDict.STATUS_NORMAL != it.status) {
-                    throw TransactionProcessException(TradeErrorCode.PERSON_STATUS_ERROR, "账户状态异常")
-                }
-                if (1 == it.lossflag) {
-                    throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOSS, "账户已挂失")
-                }
-                if (1 == it.lockflag) {
-                    throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOCKED, "账户已冻结")
-                }
-
-                if (null != it.person) {
-                    return it.person
-                } else {
-                    throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在")
-                }
-            }
-
-            throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在")
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt
deleted file mode 100644
index 568d9bb..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.supwisdom.dlpay.api.service
-
-import com.supwisdom.dlpay.api.PersonTransBuilder
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TUserdtl
-import com.supwisdom.dlpay.framework.domain.TFeetypeConfig
-import com.supwisdom.dlpay.framework.domain.TShopacc
-import com.supwisdom.dlpay.framework.domain.TSubject
-import com.supwisdom.dlpay.framework.domain.TTranstype
-import org.springframework.transaction.annotation.Propagation
-import org.springframework.transaction.annotation.Transactional
-
-interface AccountUtilServcie {
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun readAccountForUpdateNowait(userid: String): TAccount
-
-
-    fun readAccount(userid: String): TAccount
-
-    fun readShopAcc(shopId: Int): TShopacc
-
-    fun readSubject(subjno: String): TSubject
-
-    fun readFeetype(feetype: String, paytype: String): TFeetypeConfig
-}
-
-interface PersonBalancePayService {
-
-    /**
-     * 一步完成交易
-     */
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun process(builder: PersonTransBuilder): TUserdtl
-
-    /**
-     * 两步交易，交易初始化方法，检查交易参数，记录交易流水
-     */
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun init(builder: PersonTransBuilder): TUserdtl
-
-    /**
-     * 两步交易，完成交易过程，包括更新交易状态（成功、失败），更新借贷双方余额
-     */
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun finish(paydtl: TUserdtl, status: String, businessData: Map<String, String>?): TUserdtl
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun finish(refno: String, status: String, businessData: Map<String, String>?): TUserdtl
-
-    /**
-     * 两步交易，交易过程中判断交易状态，并更新交易状态为 wip
-     * 如果交易记录被锁，立刻抛出异常
-     * @throws TransactionProcessException
-     */
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun wip(paydtl: TUserdtl): TUserdtl
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun wip(refno: String): TUserdtl
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun wip(builder: PersonTransBuilder): TUserdtl
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun finish(builder: PersonTransBuilder): TUserdtl
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun getUserdtlForUpdateNowait(refno: String): TUserdtl
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun getUserdtlByBillnoForUpdateNowait(billno: String, shopaccno: String): TUserdtl
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/shop_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/shop_service.kt
deleted file mode 100644
index 697bc11..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/shop_service.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.supwisdom.dlpay.api.service
-
-import com.supwisdom.dlpay.api.bean.OpenShopParam
-import com.supwisdom.dlpay.framework.domain.TShop
-import org.springframework.transaction.annotation.Propagation
-import org.springframework.transaction.annotation.Transactional
-
-/**
- * Created by shuwei on 2019/4/15.
- */
-interface ShopService {
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun registerShop(param: OpenShopParam): TShop
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findByThirdUniqueId(uniqueId: String): TShop?
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findByShopId(shopid: Int): TShop
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findByShopBySearch(shopid: Int?, shopaccno: String?, shopUniqueId: String?): TShop?
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
deleted file mode 100644
index c4d9b20..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.supwisdom.dlpay.api.service
-
-import com.supwisdom.dlpay.api.bean.ModifyUserParam
-import com.supwisdom.dlpay.api.bean.OpenUserParam
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TPerson
-import com.supwisdom.dlpay.api.domain.TPersonIdentity
-import com.supwisdom.dlpay.api.domain.TPointsAccount
-import org.springframework.transaction.annotation.Propagation
-import org.springframework.transaction.annotation.Transactional
-
-/**
- * Created by shuwei on 2019/4/15.
- */
-interface UserService {
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
-    fun registerUser(param: OpenUserParam): TPerson
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findByThirdUniqueIdenty(thirdUniqueIdenty: String): TPerson?
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?): TPerson?
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun modifyUserInfo(person:TPerson,param: ModifyUserParam):Boolean
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findPersonByUserid(userid: String): TPerson?
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findAccountByUserid(userid: String, subjno:String?): TAccount?
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findPointsAccountByUserid(userid: String): TPointsAccount?
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findPersonIdentity(thirdUniqueIdenty: String):TPersonIdentity?
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findPersonByIdentityCheckStatus(thirdUniqueIdenty: String): TPerson
-
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/app/bean/app_request_param.kt b/src/main/kotlin/com/supwisdom/dlpay/app/bean/app_request_param.kt
deleted file mode 100644
index d857281..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/app/bean/app_request_param.kt
+++ /dev/null
@@ -1,2 +0,0 @@
-package com.supwisdom.dlpay.app.bean
-
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
index 0293457..df4aef2 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
@@ -74,7 +74,7 @@
         if (retCode == INVALIDE_RETCODE) {
             throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "未设置返回码!")
         } else if (retCode != 0) {
-            LOGGER.error("【 ==== ERROR ==== 】: " + Gson().toJson(this.respData))
+            LOGGER.error(" ==== ERROR ==== 【retcode=[$retCode],retmsg=[$retMsg]】: data=" + Gson().toJson(this.respData))
         }else{
             LOGGER.info("retcode=[0],retmsg=[$retMsg] return success!!! \n" + Gson().toJson(this.respData))
         }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt
index 99161e3..c958d06 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt
@@ -1,6 +1,5 @@
 package com.supwisdom.dlpay.framework.service
 
-import com.supwisdom.dlpay.api.bean.ConsumeFeetype
 import javax.servlet.http.HttpServletRequest
 
 interface CommonService{
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
index 17e6ca9..e5eed93 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
@@ -1,10 +1,6 @@
 package com.supwisdom.dlpay.framework.service.impl
 
-import com.google.gson.Gson
-import com.google.gson.reflect.TypeToken
 import com.jcabi.manifests.Manifests
-import com.supwisdom.dlpay.api.bean.ConsumeFeetype
-import com.supwisdom.dlpay.exception.RequestParamCheckException
 import com.supwisdom.dlpay.exception.TransactionProcessException
 import com.supwisdom.dlpay.framework.core.JwtConfig
 import com.supwisdom.dlpay.framework.core.JwtTokenUtil
