开户、查询完整实现
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java
index 0181720..beb4a88 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/AccountDao.java
@@ -30,4 +30,7 @@
   @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "0")})
   @Query("select a from TAccount a where a.userid = ?1")
   TAccount getByUseridForUpdateNowait(String userid);
+
+  @Query("select a from TAccount a where a.userid = ?1 and a.subjno=?2")
+  TAccount findByUseridAndSubjno(String userid, String subjno);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java
index 2898f3f..03fbfcd 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java
@@ -2,11 +2,15 @@
 
 import com.supwisdom.dlpay.api.domain.TPerson;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 
 
 /**
  * Created by shuwei on 2019/4/12.
  */
 public interface PersonDao extends JpaRepository<TPerson, String> {
-    TPerson findByThirdUniqueIdenty(String thirdUniqueIdenty);
+    @Query(value = "from TPerson where idtype=?1 and idno=?2 ")
+    TPerson findByIdentity(String idtype, String idno);
+
+    TPerson findByUserid(String userid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java b/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java
index 2b8cf43..fafd0e6 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java
@@ -6,7 +6,8 @@
 
 @Entity
 @Table(name = "TB_PERSON",
-    indexes = {@Index(name = "person_name_idx", columnList = "name")})
+    indexes = {@Index(name = "person_name_idx", columnList = "name"),
+        @Index(name = "person_idno_uk", unique = true, columnList = "idtype,idno")})
 public class TPerson {
   @Id
   @GenericGenerator(name = "idGenerator", strategy = "uuid")
@@ -53,16 +54,10 @@
   @Column(name = "LASTSAVED", length = 14)
   private String lastsaved;
 
-  /**
-   * 第三方唯一标识,可为学工号,银行卡号等
-   */
-  @Column(name = "THIRD_UNIQUE_IDENTY", length = 32)
-  private String thirdUniqueIdenty;
-
   public TPerson() {
   }
 
-  public TPerson(String name, String sex, String status, String idtype, String idno, String country, String nation, String email, String tel, String mobile, String addr, String zipcode, String lastsaved, String thirdUniqueIdenty) {
+  public TPerson(String name, String sex, String status, String idtype, String idno, String country, String nation, String email, String tel, String mobile, String addr, String zipcode, String lastsaved) {
     this.name = name;
     this.sex = sex;
     this.status = status;
@@ -76,9 +71,10 @@
     this.addr = addr;
     this.zipcode = zipcode;
     this.lastsaved = lastsaved;
-    this.thirdUniqueIdenty = thirdUniqueIdenty;
   }
 
+
+
   public String getUserid() {
     return userid;
   }
@@ -190,12 +186,4 @@
   public void setLastsaved(String lastsaved) {
     this.lastsaved = lastsaved;
   }
-
-  public String getThirdUniqueIdenty() {
-    return thirdUniqueIdenty;
-  }
-
-  public void setThirdUniqueIdenty(String thirdUniqueIdenty) {
-    this.thirdUniqueIdenty = thirdUniqueIdenty;
-  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java b/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
index d825148..73a8126 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
@@ -18,6 +18,15 @@
   @JoinColumn(name = "USERID")
   private TPerson person; //绑定的系统用户
 
+  public TPersonIdentity() {
+  }
+
+  public TPersonIdentity(String thirdUserid, String thirdSyscode, TPerson person) {
+    this.thirdUserid = thirdUserid;
+    this.thirdSyscode = thirdSyscode;
+    this.person = person;
+  }
+
   public String getThirdUserid() {
     return thirdUserid;
   }
diff --git a/src/main/java/com/supwisdom/dlpay/exception/RequestParamCheckException.java b/src/main/java/com/supwisdom/dlpay/exception/RequestParamCheckException.java
new file mode 100644
index 0000000..328a08d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/exception/RequestParamCheckException.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.exception;
+
+public class RequestParamCheckException extends Exception {
+  private int errCode;
+
+  public RequestParamCheckException(int errCode, String message) {
+    super(String.format("Req-%d,%s", errCode, message));
+    this.errCode = errCode;
+  }
+
+  public int getErrCode() {
+    return errCode;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java b/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
index 23c7172..af90257 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
@@ -76,4 +76,6 @@
   /********************** 获取【系统参数】【业务参数】通用方法 **********************/
 
 
+  String getSubsystemSignKey(String syscode);
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java b/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
index c1d9971..80fad1f 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
@@ -234,4 +234,10 @@
     return null;
   }
 
+  @Override
+  public String getSubsystemSignKey(String syscode){
+    // fixme: 验证数据无误性签名秘钥
+    return "";
+  }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/HmacUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/HmacUtil.java
index 8e4e55d..7ea105c 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/HmacUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/HmacUtil.java
@@ -34,33 +34,6 @@
     return result;
   }
 
-  /**
-   * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
-   *
-   * @param params 需要排序并参与字符拼接的参数组
-   * @return 拼接后字符串
-   */
-  public static String createLinkString(Map<String, String> params) {
-
-    List<String> keys = new ArrayList<String>(params.keySet());
-    Collections.sort(keys);
-
-    String prestr = "";
-
-    for (int i = 0; i < keys.size(); i++) {
-      String key = keys.get(i);
-      String value = params.get(key);
-
-      if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符
-        prestr = prestr + key + "=" + value;
-      } else {
-        prestr = prestr + key + "=" + value + "&";
-      }
-    }
-
-    return prestr;
-  }
-
   private static String HMACSHAX(String data, String key, String alg) {
     String algorithm = "";
     if ("SHA1".equals(alg)) {
@@ -134,7 +107,7 @@
     mapValue.put("outtradeno", refno);
     mapValue.put("yktshopid", "2");
     mapValue.put("shopid", "68512084");
-    String signstr = createLinkString(HmacUtil.paraFilter(mapValue));
+    String signstr = StringUtil.createLinkString(HmacUtil.paraFilter(mapValue));
     String sign = HmacUtil.HMACSHA1(signstr, "adc4ac6822fd462780f878b86cb94688");
     System.out.println("{\"tradeaccount\":\"10000097\",\"tradename\":\"在线点餐\",\"tradeamount\":\"1\"," +
         "\"paidamount\": \"1\",\"outtradeno\":\"" + refno + "\",\"yktshopid\": \"2\",\"shopid\":\"68512084\",\"sign\": \"" + sign + "\"}");
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
index c3ff38a..9ca1800 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
@@ -1,6 +1,8 @@
 package com.supwisdom.dlpay.framework.util;
 
-import java.util.List;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 public class StringUtil {
   /**
@@ -31,4 +33,102 @@
     return str1 == null ? str2 == null : str1.equals(str2);
   }
 
+  /**
+   * 手机号验证
+   *
+   * @param str
+   * @return
+   */
+  public static boolean isMobile(String str) {
+    Pattern p = Pattern.compile("^1[0-9]{10}$"); // 验证手机号
+    Matcher m = p.matcher(str);
+    return m.matches();
+  }
+
+  /**
+   * 邮箱格式验证
+   */
+  public static boolean isEmail(String email) {
+    boolean ret = true;
+    Pattern pattern = Pattern.compile("^([a-zA-Z0-9]+[_|\\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\\.]?)*[a-zA-Z0-9]+\\.[a-zA-Z]{2,3}$");
+    final Matcher mat = pattern.matcher(email);
+    if (!mat.find()) {
+      ret = false;
+    }
+    return ret;
+  }
+
+  /**
+   * 身份证格式验证
+   *
+   * @param str
+   * @return
+   */
+  public static boolean isIdentity(String str) {
+    // 中国公民身份证格式:长度为15或18位,最后一位可以为字母
+    Pattern pattern = Pattern.compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])");
+    final Matcher m = pattern.matcher(str);
+    return m.matches();
+  }
+
+  /**
+   * 除去数组中的空值和签名参数
+   *
+   * @param sArray 签名参数组
+   * @return 去掉空值与签名参数后的新签名参数组
+   */
+  public static Map<String, String> paraFilter(Map<String, String> sArray) {
+    Map<String, String> result = new HashMap<String, String>();
+    if (sArray == null || sArray.size() <= 0) {
+      return result;
+    }
+    for (String key : sArray.keySet()) {
+      String value = sArray.get(key);
+      if (null == value || "".equals(value.trim()) || "null".equalsIgnoreCase(value.trim()) || key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type")) {
+        continue;
+      }
+      result.put(key, value);
+    }
+    return result;
+  }
+
+  /**
+   * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
+   *
+   * @param params 需要排序并参与字符拼接的参数组
+   * @return 拼接后字符串
+   */
+  public static String createLinkString(Map<String, String> params) {
+
+    List<String> keys = new ArrayList<String>(params.keySet());
+    Collections.sort(keys);
+
+    String prestr = "";
+
+    for (int i = 0; i < keys.size(); i++) {
+      String key = keys.get(i);
+      String value = params.get(key);
+
+      if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符
+        prestr = prestr + key + "=" + value;
+      } else {
+        prestr = prestr + key + "=" + value + "&";
+      }
+    }
+
+    return prestr;
+  }
+
+  public static boolean isCharAndNum(String inputStr) {
+    Pattern p = Pattern.compile("\\w+");
+    Matcher m = p.matcher(inputStr);
+    if (m.matches()) {
+      // 除字母和数字外还包含其它字符
+      return false;
+    } else {
+      return true;
+    }
+  }
+
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java
index d3e9b11..07e4aaf 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java
@@ -10,7 +10,9 @@
   public static final String SYSPARA_VALUETYPE_STRING = "string"; //字符串
 
 
-  public static final int SYSPARAID_NO1 = 1; //paraid=1
+  public static final int SYSPARAID_NO1 = 1; //系统默认最大余额限制的ID
   public static final int SYSPARAID_NO2 = 2; //paraid=2
 
+  public static final double SYSPARA_NO1_DEFAULT = 10000.0; // 系统默认最大余额限制
+
 }
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 6c97c50..13062ef 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
@@ -84,4 +84,25 @@
    * */
   public static final int LOCK_READ_TIMEOUT = 10015;
 
+
+  /**
+   * 请求参数错误
+   * */
+  public static final int REQUEST_PARAM_ERROR = 20000;
+
+  /**
+   * 请求参数错误签名错误
+   * */
+  public static final int REQUEST_SIGN_ERROR = 20001;
+
+  /**
+   * 注册用户已经存在
+   */
+  public static final int REGISTER_USER_EXIST = 20003;
+
+
+  //================= 业务处理错误 ==================//
+
+  public static final int BUSINESS_DEAL_ERROR = 30000; //业务处理错误
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java b/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java
index fefbc51..38695bc 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java
@@ -83,6 +83,7 @@
 		}
 		return null;
 	}
+
 	public static Map<String, String> parseXml(String xml) throws Exception {
 		Map<String, String> map = new HashMap<String, String>();
 		Document document = DocumentHelper.parseText(xml);
@@ -92,53 +93,5 @@
 			map.put(e.getName(), e.getText());
 		return map;
 	}
-	/**
-	 * 除去数组中的空值和签名参数
-	 *
-	 * @param sArray 签名参数组
-	 * @return 去掉空值与签名参数后的新签名参数组
-	 */
-	public static Map<String, String> paraFilter(Map<String, String> sArray) {
-		Map<String, String> result = new HashMap<String, String>();
-		if (sArray == null || sArray.size() <= 0) {
-			return result;
-		}
-		for (String key : sArray.keySet()) {
-			String value = sArray.get(key);
-			if (value == null || "".equals(value) || "sign".equalsIgnoreCase(key)
-					|| "sign_type".equalsIgnoreCase(key)) {
-				continue;
-			}
-			result.put(key, value);
-		}
 
-		return result;
-	}
-
-	/**
-	 * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
-	 *
-	 * @param params 需要排序并参与字符拼接的参数组
-	 * @return 拼接后字符串
-	 */
-	public static String createLinkString(Map<String, String> params) {
-
-		List<String> keys = new ArrayList<String>(params.keySet());
-		Collections.sort(keys);
-
-		String prestr = "";
-
-		for (int i = 0; i < keys.size(); i++) {
-			String key = keys.get(i);
-			String value = params.get(key);
-
-			if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符
-				prestr = prestr + key + "=" + value;
-			} else {
-				prestr = prestr + key + "=" + value + "&";
-			}
-		}
-
-		return prestr;
-	}
 }
diff --git a/src/main/java/com/supwisdom/dlpay/util/ConstUtil.java b/src/main/java/com/supwisdom/dlpay/util/ConstUtil.java
deleted file mode 100644
index 4a54efa..0000000
--- a/src/main/java/com/supwisdom/dlpay/util/ConstUtil.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.supwisdom.dlpay.util;
-
-/**
- * Created by shuwei on 2019/4/9.
- */
-public class ConstUtil {
-    public static final String STATUS_INIT = "init";
-    public static final String STATUS_SUCCESS = "success";
-    public static final String STATUS_FAIL = "fail";
-
-    public static final String ENABLE_YES = "yes";
-
-    public static final String ENABLE_NO = "no";
-
-}
diff --git a/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java b/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
new file mode 100644
index 0000000..7342e18
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.util;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+public class ConstantUtil {
+
+    public static final String ENABLE_YES = "yes";
+    public static final String ENABLE_NO = "no";
+
+    public static final String SEX_MALE = "male";
+    public static final String SEX_FEMALE = "female";
+
+    public static final String IDTYPE_IDENTITY = "1"; //身份证
+    public static final String IDTYPE_PASSPORT = "2"; //护照
+    public static final String IDTYPE_DRIVING_LICENSE = "3"; //驾照
+    public static final String IDTYPE_HKM_PASS = "4"; //港澳通行证
+    public static final String IDTYPE_STUEMPNO = "5"; //学工号
+    public static final String IDTYPE_OTHER = "9"; //其他
+    public static final String[] IDTYPE_DICTS = {"1", "2", "3", "4", "5", "9"}; //联动
+
+}
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt b/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
index e5844c4..2b3b6ee 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
@@ -41,7 +41,7 @@
             params.put("timestamp", time)
             params.put("sign_method", "HMAC");
             params.put("limitflag", "off") //是否判断消费限额,on-判断;off-不判断。默认on(判断限额)。为空或不为off都是on;
-            var signstr = HmacUtil.createLinkString(HmacUtil.paraFilter(params))
+            var signstr = StringUtil.createLinkString(HmacUtil.paraFilter(params))
             val sign = HmacUtil.HMACSHA1(signstr, appkey)
             signstr = "$signstr&sign=$sign&sourcetype=food"
             val c = Client.create()
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
new file mode 100644
index 0000000..9fd9e5d
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
@@ -0,0 +1,69 @@
+package com.supwisdom.dlpay.api.bean
+
+import com.supwisdom.dlpay.exception.RequestParamCheckException
+import com.supwisdom.dlpay.framework.util.MD5
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import com.supwisdom.dlpay.util.ConstantUtil
+
+open class APIRequestParam {
+    open val param_map = mutableMapOf<String, String>()
+
+    open fun checkSign(key: String): Boolean {
+        val sign = param_map["sign"]
+        if (StringUtil.isEmpty(sign)) return false //未签名
+
+        //判断签名
+        val signdata = StringUtil.createLinkString(StringUtil.paraFilter(param_map))
+        val md5Sign = MD5.encodeByMD5(signdata + key) //默认MD5
+        if (sign.equals(md5Sign, true)) {
+            return true
+        }
+        return false
+    }
+}
+
+class OpenUserParam : APIRequestParam() {
+    var syscode: String = "" //必传
+    var uid: String = ""    //必传
+    var name: String = ""   //必传
+    var sex: String? = ""
+    var idtype: String = "" //必传
+    var idno: String = ""   //必传
+    var mobile: String? = ""
+    var tel: String? = ""
+    var email: String? = ""
+    var address: String? = ""
+    var zipcode: String? = ""
+    var sign: String = "" //必传
+
+    fun checkParam(): Boolean {
+        if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空")
+        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.equals(sex, true) && !ConstantUtil.SEX_FEMALE.equals(sex, true)) 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, "邮箱格式错误")
+
+        param_map.plus(mapOf("syscode" to syscode, "uid" to uid, "name" to name, "sex" to sex, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "tel" to tel, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign))
+        return true
+    }
+}
+
+class QueryUserParam : APIRequestParam() {
+    var syscode: String = "" //必传
+    var userid: String? = ""  // 用户ID二选一 (两者都传取userid)
+    var uid: String? = ""    // 用户ID二选一
+    var sign: String = "" //必传
+
+    fun checkParam(): Boolean {
+        if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空")
+        if (StringUtil.isEmpty(userid) && StringUtil.isEmpty(uid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "用户唯一号不能为空")
+
+        param_map.plus(mapOf("syscode" to syscode, "userid" to userid, "uid" to uid, "sign" to sign))
+        return true
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
similarity index 97%
rename from src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_service.kt
rename to src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
index f83569b..66cdb7d 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
@@ -10,7 +10,7 @@
 import com.supwisdom.dlpay.exception.TransactionException
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
 import com.supwisdom.dlpay.framework.util.*
-import com.supwisdom.dlpay.util.ConstUtil
+import com.supwisdom.dlpay.util.ConstantUtil
 import com.supwisdom.dlpay.util.PaytypeUtil
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
@@ -76,7 +76,7 @@
         //一卡通支付款 112240
         return try {
             val paytype = paytypeService.getByPaytype(PaytypeUtil.YKTPAY)
-            if (paytype == null || ConstUtil.ENABLE_YES != paytype.enable) {
+            if (paytype == null || ConstantUtil.ENABLE_YES != paytype.enable) {
                 ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(1, "支付方式未开启"))
             }
@@ -129,7 +129,7 @@
             val dtl = personBalancePayService.wip(refno)
             val person = personService.getPersonByUserid(dtl.userid)
             val code = CallService.callYktPay(paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.YKTPAY),
-                    dtl, DateUtil.getNow(), person.thirdUniqueIdenty, yktshopid, devphyid)
+                    dtl, DateUtil.getNow(), "", yktshopid, devphyid)
             if (code.retcode == "0") {
                 PersonTransBuilder.newBuilder(accountUtilServcie)
                         .done(dtl.refno, TradeDict.DTL_STATUS_SUCCESS, personBalancePayService)
@@ -164,7 +164,7 @@
                       wechattype: String, realip: String?, qrcode: String?, openid: String?): ResponseEntity<Any> {
         return try {
             val paytype = paytypeService.getByPaytype(PaytypeUtil.WECHAT)
-            if (paytype == null || ConstUtil.ENABLE_YES != paytype.enable) {
+            if (paytype == null || ConstantUtil.ENABLE_YES != paytype.enable) {
                 ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(1, "支付方式未开启"))
             }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_controller.kt
index d0fabc1..408cc3d 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_controller.kt
@@ -5,6 +5,7 @@
 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
@@ -62,9 +63,9 @@
                 logger.error("签名错误")
                 return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名错误]]></return_msg></xml>"
             }
-            map = XmlUtils.paraFilter(map)
+            map = StringUtil.paraFilter(map)
             //TODO 校验签名
-            var signStr = XmlUtils.createLinkString(map)
+            var signStr = StringUtil.createLinkString(map)
             val config = paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.WECHAT)
             if (config["appkey"].isNullOrEmpty()) {
                 logger.error("签名错误")
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
index 998597c..69f081e 100644
--- 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
@@ -1,11 +1,101 @@
 package com.supwisdom.dlpay.api.controller
 
+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.SystemUtilService
+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
 
 @RestController
 @RequestMapping("/api/user")
 class UserAPIController {
+    @Autowired
+    private lateinit var useService: UserService
+    @Autowired
+    private lateinit var systemUtilService: SystemUtilService
+
+    @PostMapping("/open")
+    fun openAccount(@RequestBody request: OpenUserParam): ResponseEntity<Any> {
+        return try {
+            if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) {
+                ResponseEntity.ok(ResponseBodyBuilder.create()
+                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
+            }
+            useService.findByThirdUniqueIdenty(request.uid, request.syscode).let {
+                if (null != it) {
+                    ResponseEntity.ok(ResponseBodyBuilder.create()
+                            .fail(TradeErrorCode.REGISTER_USER_EXIST, "改用户唯一号已经注册"))
+                }
+
+                useService.registerUser(request).let {
+                    if (null != it) {
+                        ResponseEntity.ok(ResponseBodyBuilder.create()
+                                .data("userid", it.userid)
+                                .data("uid", request.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 request: QueryUserParam): ResponseEntity<Any> {
+        return try {
+            if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) {
+                ResponseEntity.ok(ResponseBodyBuilder.create()
+                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
+            }
+
+            useService.findByUseridOrThirdUniqueIdenty(request.userid, request.uid, request.syscode).let {
+                if (null != it) {
+                    val account = useService.findAccountByUserid(it.userid, null)
+                    ResponseEntity.ok(ResponseBodyBuilder.create()
+                            .data("userid", it.userid)
+                            .data("name", it.name)
+                            .data("idtype", it.idtype)
+                            .data("idno", it.idno)
+                            .data("status", it.status)
+                            .data("balance", account.let {
+                                if (null == it) {
+                                    0.0
+                                } else {
+                                    it.availbal
+                                }
+                            })
+                            .data("points", 0) //积分
+                            .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, "业务处理错误"))
+        }
+    }
 
 
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/person_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/person_service_impl.kt
index 5ba6a54..6d05a8d 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/person_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/person_service_impl.kt
@@ -15,7 +15,7 @@
     lateinit var personDao: PersonDao
 
     override fun getPersonByThirdUniqueIdenty(thirdUniqueIdenty: String): TPerson {
-        return personDao.findByThirdUniqueIdenty(thirdUniqueIdenty)
+        return personDao.findByUserid(thirdUniqueIdenty)
     }
 
     override fun getPersonByUserid(userid: String): TPerson {
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
new file mode 100644
index 0000000..77c687f
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
@@ -0,0 +1,110 @@
+package com.supwisdom.dlpay.api.service.impl
+
+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.domain.TAccount
+import com.supwisdom.dlpay.api.domain.TPerson
+import com.supwisdom.dlpay.api.domain.TPersonIdentity
+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
+import java.net.URLDecoder
+
+/**
+ * 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 systemUtilService: SystemUtilService
+
+    override fun registerUser(param: OpenUserParam): TPerson {
+        val username = URLDecoder.decode(param.name, Charsets.UTF_8.toString())
+        var person = personDao.findByIdentity(param.idtype, param.idno)
+        if (null != person && username != person.name)
+            throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "证件指定用户与请求的用户名不匹配")
+
+        val systemdatetime = systemUtilService.sysdatetime
+        if (null == person) {
+            person = personDao.save(TPerson().apply {
+                name = username
+                sex = param.sex ?: null
+                status = TradeDict.STATUS_NORMAL
+                idtype = param.idtype
+                idno = param.idno
+                email = param.email ?: null
+                tel = param.tel ?: null
+                mobile = param.mobile ?: null
+                addr = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) }
+                zipcode = param.zipcode ?: null
+                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 {
+            thirdUserid = param.uid
+            thirdSyscode = param.syscode
+            person = person
+        }) //保存绑定关系
+
+        return person
+    }
+
+    override fun findByThirdUniqueIdenty(thirdUniqueIdenty: String, syscode: String): TPerson? {
+        return personIdentityDao.getPersonIdentityById(thirdUniqueIdenty, syscode)?.let { it.person }
+    }
+
+    override fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?, syscode: String): TPerson? {
+        return if (!StringUtil.isEmpty(userid)) {
+            personDao.findByUserid(userid)
+        } else {
+            personIdentityDao.getPersonIdentityById(thirdUniqueIdenty, syscode)?.let { it.person }
+        }
+    }
+
+    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)
+        }
+    }
+
+}
\ 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
new file mode 100644
index 0000000..f01258d
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
@@ -0,0 +1,29 @@
+package com.supwisdom.dlpay.api.service
+
+import com.supwisdom.dlpay.api.bean.OpenUserParam
+import com.supwisdom.dlpay.api.domain.TAccount
+import com.supwisdom.dlpay.api.domain.TPerson
+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, syscode: String): TPerson?
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+    fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?, syscode: String): TPerson?
+
+
+    @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?
+
+}
\ 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
new file mode 100644
index 0000000..d857281
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/app/bean/app_request_param.kt
@@ -0,0 +1,2 @@
+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 e5ed5fe..894ad77 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
@@ -1,13 +1,18 @@
 package com.supwisdom.dlpay.framework
 
+import com.google.gson.Gson
+import com.supwisdom.dlpay.exception.RequestParamCheckException
 import com.supwisdom.dlpay.exception.TransactionCheckException
 import com.supwisdom.dlpay.exception.TransactionException
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import org.apache.log4j.Logger
+
 
 class ResponseBodyBuilder private constructor() {
     companion object {
         private const val INVALIDE_RETCODE = -0x7FFFFFFF
         private val RESERVED_KEY = setOf("retcode", "retmsg", "exception")
+        private val LOGGER = Logger.getLogger(ResponseBodyBuilder::class.java)
         fun create() = ResponseBodyBuilder()
     }
 
@@ -51,6 +56,12 @@
         return build()
     }
 
+    fun requestException(exception: RequestParamCheckException, msg: String): Map<String, Any> {
+        data("exception", exception.message!!)
+        result(exception.errCode, "$msg - [${exception.message}]")
+        return build()
+    }
+
     fun data(name: String, value: Any): ResponseBodyBuilder {
         if (name in RESERVED_KEY) {
             throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "返回值 <$name> 为保留值,不能使用")
@@ -62,6 +73,8 @@
     private fun build(): Map<String, Any> {
         if (retCode == INVALIDE_RETCODE) {
             throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "未设置返回码!")
+        } else if (retCode != 0) {
+            LOGGER.error(Gson().toJson(this.respData))
         }
         return this.respData.plus(mapOf("retcode" to retCode, "retmsg" to retMsg))
     }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/shop/bean/shop_param.kt b/src/main/kotlin/com/supwisdom/dlpay/shop/bean/shop_param.kt
index 4b8388a..749dd3a 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/shop/bean/shop_param.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/shop/bean/shop_param.kt
@@ -10,12 +10,4 @@
     var mobile: String = ""
     var contactman: String = ""
     var uniqueId: String? = ""
-}
-
-class UserParam {
-    var uniqueId: String? = ""
-    var userid: String? = ""
-    var name: String = ""
-    var addr: String? = ""
-    var mobile: String? = ""
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/user/controller/user_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/user/controller/user_controller.kt
deleted file mode 100644
index 47cb717..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/user/controller/user_controller.kt
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.supwisdom.dlpay.user.controller
-
-import com.supwisdom.dlpay.api.domain.TPerson
-import com.supwisdom.dlpay.framework.ResponseBodyBuilder
-import com.supwisdom.dlpay.framework.util.TradeDict
-import com.supwisdom.dlpay.shop.bean.UserParam
-import com.supwisdom.dlpay.user.service.UserService
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.http.ResponseEntity
-import org.springframework.web.bind.annotation.*
-
-/**
- * Created by shuwei on 2019/4/15.
- */
-@RestController
-@RequestMapping("/api/user")
-class UserController {
-    @Autowired
-    private lateinit var useService: UserService
-
-    @PostMapping("/open")
-    fun openAccount(@RequestBody request: UserParam): ResponseEntity<Any> {
-        if (!request.uniqueId.isNullOrEmpty()) {
-            val person = useService.findByThirdUniqueIdenty(request.uniqueId!!)
-            if (person != null) {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(1, "[uniqueId]该值已存在"))
-            }
-        }
-        if (request.name.isEmpty()) {
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .fail(1, "[name]不能为空"))
-        }
-        val person = TPerson()
-        person.addr = request.addr
-        person.name = request.name
-        person.mobile = request.mobile
-        person.status = TradeDict.STATUS_NORMAL
-        person.thirdUniqueIdenty = request.uniqueId
-        useService.save(person)
-        return ResponseEntity.ok(ResponseBodyBuilder.create()
-                .data("userid", person.userid)
-                .success())
-    }
-
-    @PostMapping("/get")
-    fun queryShop(@RequestBody request: UserParam): ResponseEntity<Any> {
-        if (!request.uniqueId.isNullOrEmpty()) {
-            val person = useService.findByThirdUniqueIdenty(request.uniqueId!!)
-            if (person != null) {
-                val account = useService.findAccountByUserid(person.userid)
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("person", person)
-                        .data("account", account!!)
-                        .success())
-            }
-        } else if (!request.userid.isNullOrEmpty()) {
-            val person = useService.findPersonByUserid(request.userid!!)
-            if (person != null) {
-                val account = useService.findAccountByUserid(person.userid)
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("person", person)
-                        .data("account", account!!)
-                        .success())
-            }
-        }
-        return ResponseEntity.ok(ResponseBodyBuilder.create()
-                .fail(1, "数据不存在"))
-    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/user/service/impl/user_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/user/service/impl/user_service_impl.kt
deleted file mode 100644
index cb57ca1..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/user/service/impl/user_service_impl.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.supwisdom.dlpay.user.service.impl
-
-import com.supwisdom.dlpay.api.dao.AccountDao
-import com.supwisdom.dlpay.api.dao.PersonDao
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TPerson
-import com.supwisdom.dlpay.framework.service.SystemUtilService
-import com.supwisdom.dlpay.framework.util.Subject
-import com.supwisdom.dlpay.user.service.UserService
-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 systemUtilService: SystemUtilService
-
-    override fun save(person: TPerson): TPerson {
-        //TODO check tac
-        personDao.save(person)
-        if (accountDao.findByUserid(person.userid) == null) {
-            val systemdatetime = systemUtilService.sysdatetime
-            TAccount().apply {
-                accname = person.name
-                opendate = systemdatetime.hostdate
-                userid = person.userid
-                status = person.status
-                subjno = Subject.SUBJNO_PERSONAL_DEPOSIT
-                balance = 0.0
-                availbal = 0.0
-                frozebal = 0.0
-                lowfreeFlag = false
-                accountDao.save(this)
-            }
-        }
-        return person
-    }
-
-    override fun findByThirdUniqueIdenty(thirdUniqueIdenty: String): TPerson? {
-        return personDao.findByThirdUniqueIdenty(thirdUniqueIdenty)
-    }
-
-    override fun findPersonByUserid(userid: String): TPerson? {
-        return personDao.getOne(userid)
-    }
-
-    override fun findAccountByUserid(userid: String): TAccount? {
-        return accountDao.findByUserid(userid)
-    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/user/service/user_service.kt b/src/main/kotlin/com/supwisdom/dlpay/user/service/user_service.kt
deleted file mode 100644
index 6bac9c9..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/user/service/user_service.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.supwisdom.dlpay.user.service
-
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TPerson
-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 save(person: TPerson): 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 findPersonByUserid(userid: String): TPerson?
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findAccountByUserid(userid: String): TAccount?
-}
\ No newline at end of file
diff --git a/src/test/kotlin/com/supwisdom/dlpay/controller/UserControllerTest.kt b/src/test/kotlin/com/supwisdom/dlpay/controller/UserControllerTest.kt
index 4147974..44724a3 100644
--- a/src/test/kotlin/com/supwisdom/dlpay/controller/UserControllerTest.kt
+++ b/src/test/kotlin/com/supwisdom/dlpay/controller/UserControllerTest.kt
@@ -2,9 +2,10 @@
 
 import com.google.gson.Gson
 import com.supwisdom.dlpay.MvcBaseTest
+import com.supwisdom.dlpay.api.bean.OpenUserParam
+import com.supwisdom.dlpay.api.bean.QueryUserParam
 import com.supwisdom.dlpay.api.domain.TAccount
 import com.supwisdom.dlpay.api.domain.TPerson
-import com.supwisdom.dlpay.shop.bean.UserParam
 import org.junit.Assert
 import org.junit.Test
 import org.springframework.http.MediaType
@@ -24,11 +25,12 @@
 
     @Test
     fun open() {
-        val userParam = UserParam()
-        userParam.uniqueId = ""//random req
+        val userParam = OpenUserParam()
+        userParam.syscode = "ykt"
+        userParam.uid = ""//random req
         userParam.name = "测试名称"
 
-        val ret = mvc.perform(MockMvcRequestBuilders.post("/user/open").content(gson.toJson(userParam))
+        val ret = mvc.perform(MockMvcRequestBuilders.post("/api/user/open").content(gson.toJson(userParam))
                 .contentType(MediaType.APPLICATION_JSON))
                 .andExpect(MockMvcResultMatchers.status().isOk)
                 .andDo(MockMvcResultHandlers.print())
@@ -44,11 +46,12 @@
 
     @Test
     fun get() {
-        val userParam = UserParam()
-        userParam.uniqueId = "testuseruniqueId"//测试用
-        userParam.name = "测试名称:testuseruniqueId"
+
+        val userParam = QueryUserParam()
+        userParam.syscode = "ykt"
+        userParam.uid = "testuseruniqueId"//测试用
         val gson = Gson()
-        val ret = mvc.perform(MockMvcRequestBuilders.post("/user/open").content(gson.toJson(userParam))
+        val ret = mvc.perform(MockMvcRequestBuilders.post("/api/user/open").content(gson.toJson(userParam))
                 .contentType(MediaType.APPLICATION_JSON))
                 .andExpect(MockMvcResultMatchers.status().isOk)
                 .andDo(MockMvcResultHandlers.print())
@@ -60,7 +63,7 @@
         Assert.assertNotNull(retBeanOpen.userid)
         userParam.userid = retBeanOpen.userid
 
-        val retGet = mvc.perform(MockMvcRequestBuilders.get("/user/get").content(gson.toJson(userParam))
+        val retGet = mvc.perform(MockMvcRequestBuilders.get("/api/user/query").content(gson.toJson(userParam))
                 .contentType(MediaType.APPLICATION_JSON))
                 .andExpect(MockMvcResultMatchers.status().isOk)
                 .andDo(MockMvcResultHandlers.print())