diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java
index 26fe874..6ee3e99 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java
@@ -1,14 +1,10 @@
 package com.supwisdom.dlpay.api.dao;
 
 import com.supwisdom.dlpay.api.domain.TPersonIdentity;
-import com.supwisdom.dlpay.api.domain.TPersonIdentityPK;
 import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 @Repository
-public interface PersonIdentityDao extends JpaRepository<TPersonIdentity, TPersonIdentityPK> {
-  @Query(value = "from TPersonIdentity t where t.thirdUserid=:thirdUserid and t.thirdSyscode=:thirdSyscode ")
-  TPersonIdentity getPersonIdentityById(@Param("thirdUserid") String thirdUserid, @Param("thirdSyscode") String thirdSyscode);
+public interface PersonIdentityDao extends JpaRepository<TPersonIdentity, String> {
+  TPersonIdentity getByThirdUid(String thirdUid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlDao.java
index 4eb1196..72181db 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlDao.java
@@ -22,4 +22,9 @@
   @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="0")})
   @Query("select dtl from TUserdtl  dtl where dtl.refno = ?1")
   TUserdtl findByRefnoForUpdateNowait(String refno);
+
+  @Lock(LockModeType.PESSIMISTIC_WRITE)
+  @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="0")})
+  @Query("select dtl from TUserdtl dtl where dtl.outtradeno = ?1 and dtl.shopaccno=?2 ")
+  TUserdtl findByBillnoForUpdateNowait(String billno,String shopaccno);
 }
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 73a8126..1125f8e 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
@@ -4,43 +4,45 @@
 
 @Entity
 @Table(name = "TB_PERSON_IDENTITY")
-@IdClass(TPersonIdentityPK.class)
 public class TPersonIdentity {
   @Id
-  @Column(name = "THIRD_USERID", nullable = false, length = 60)
-  private String thirdUserid;
-
-  @Id
-  @Column(name = "THIRD_SYSCODE", nullable = false, length = 20)
-  private String thirdSyscode;
+  @Column(name = "THIRD_UID", nullable = false, length = 60)
+  private String thirdUid;
 
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "USERID")
   private TPerson person; //绑定的系统用户
 
+  @Column(name = "STATUS", nullable = false, length = 20)
+  private String status;
+
+  @Column(name = "LOSSFLAG",nullable = false, precision = 1)
+  private Integer lossflag=0;
+
+  @Column(name = "LOCKFLAG", nullable = false, precision = 1)
+  private Integer lockflag=0;
+
+  @Column(name = "CREATETIME", length = 14)
+  private String createtime;
+
   public TPersonIdentity() {
   }
 
-  public TPersonIdentity(String thirdUserid, String thirdSyscode, TPerson person) {
-    this.thirdUserid = thirdUserid;
-    this.thirdSyscode = thirdSyscode;
+  public TPersonIdentity(String thirdUid, TPerson person, String status, Integer lossflag, Integer lockflag, String createtime) {
+    this.thirdUid = thirdUid;
     this.person = person;
+    this.status = status;
+    this.lossflag = lossflag;
+    this.lockflag = lockflag;
+    this.createtime = createtime;
   }
 
-  public String getThirdUserid() {
-    return thirdUserid;
+  public String getThirdUid() {
+    return thirdUid;
   }
 
-  public void setThirdUserid(String thirdUserid) {
-    this.thirdUserid = thirdUserid;
-  }
-
-  public String getThirdSyscode() {
-    return thirdSyscode;
-  }
-
-  public void setThirdSyscode(String thirdSyscode) {
-    this.thirdSyscode = thirdSyscode;
+  public void setThirdUid(String thirdUid) {
+    this.thirdUid = thirdUid;
   }
 
   public TPerson getPerson() {
@@ -50,4 +52,37 @@
   public void setPerson(TPerson person) {
     this.person = person;
   }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public Integer getLossflag() {
+    return lossflag;
+  }
+
+  public void setLossflag(Integer lossflag) {
+    this.lossflag = lossflag;
+  }
+
+  public Integer getLockflag() {
+    return lockflag;
+  }
+
+  public void setLockflag(Integer lockflag) {
+    this.lockflag = lockflag;
+  }
+
+  public String getCreatetime() {
+    return createtime;
+  }
+
+  public void setCreatetime(String createtime) {
+    this.createtime = createtime;
+  }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentityPK.java b/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentityPK.java
deleted file mode 100644
index 8ce1bfb..0000000
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentityPK.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.supwisdom.dlpay.api.domain;
-
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.persistence.Id;
-import java.io.Serializable;
-
-@Embeddable
-public class TPersonIdentityPK implements Serializable {
-  @Id
-  @Column(name="THIRD_USERID", nullable = false, length = 60)
-  private String thirdUserid;
-
-  @Id
-  @Column(name="THIRD_SYSCODE", nullable = false, length = 20)
-  private String thirdSyscode;
-
-  public TPersonIdentityPK() {
-  }
-
-  public TPersonIdentityPK(String thirdUserid, String thirdSyscode) {
-    this.thirdUserid = thirdUserid;
-    this.thirdSyscode = thirdSyscode;
-  }
-
-  public String getThirdUserid() {
-    return thirdUserid;
-  }
-
-  public void setThirdUserid(String thirdUserid) {
-    this.thirdUserid = thirdUserid;
-  }
-
-  public String getThirdSyscode() {
-    return thirdSyscode;
-  }
-
-  public void setThirdSyscode(String thirdSyscode) {
-    this.thirdSyscode = thirdSyscode;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) return true;
-    if (o == null || getClass() != o.getClass()) return false;
-    TPersonIdentityPK tPersonIdentityPK = (TPersonIdentityPK) o;
-    if (thirdUserid != null ? !thirdUserid.equals(tPersonIdentityPK.getThirdUserid()) : thirdUserid != null)
-      return false;
-    if (thirdSyscode != null ? !thirdSyscode.equals(tPersonIdentityPK.getThirdSyscode()) : thirdSyscode != null)
-      return false;
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = thirdUserid != null ? thirdUserid.hashCode() : 0;
-    result = 31 * result + (thirdSyscode != null ? thirdSyscode.hashCode() : 0);
-    return result;
-  }
-}
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java b/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java
index 806c430..fc89e32 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java
@@ -52,7 +52,8 @@
   @Column(name = "OUTTRADENO", length = 60)
   private String outtradeno; //第三方流水号
 
-
+  @Column(name = "SHOPACCNO", length = 20)
+  private String shopaccno;
 
   @Column(name = "OPERID", precision = 9)
   private Integer operid; //操作员ID
@@ -187,6 +188,14 @@
     this.outtradeno = outtradeno;
   }
 
+  public String getShopaccno() {
+    return shopaccno;
+  }
+
+  public void setShopaccno(String shopaccno) {
+    this.shopaccno = shopaccno;
+  }
+
   public Integer getOperid() {
     return operid;
   }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java
index 4390368..e5ca834 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java
@@ -4,4 +4,5 @@
 import org.springframework.data.repository.CrudRepository;
 
 public interface ApiClientDao extends CrudRepository<TApiClient, String> {
+  TApiClient findByAppid(String appid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/FeetypeConfigDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/FeetypeConfigDao.java
new file mode 100644
index 0000000..b626087
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/FeetypeConfigDao.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.framework.dao;
+
+import com.supwisdom.dlpay.framework.domain.TFeetypeConfig;
+import com.supwisdom.dlpay.framework.domain.TFeetypeConfigPK;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface FeetypeConfigDao extends JpaRepository<TFeetypeConfig, TFeetypeConfigPK> {
+  @Query("select a from TFeetypeConfig a where a.feetype=?1 and a.paytype=?2 ")
+  TFeetypeConfig getById(String feetype, String paytype);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java b/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java
index 8afbaaa..4a46b28 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java
@@ -68,6 +68,11 @@
    */
   public static final String SUBJNO_PAY_YKT = "112233";
 
+  /**
+   * 应收账款 - 市民卡支付款
+   */
+  public static final String SUBJNO_PAY_CITIZEN_CARD = "112234";
+
 
   //======================= 负债类 =====================//
 
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
index c4dde6e..5c51c26 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
@@ -4,7 +4,7 @@
  * 交易码、交易类型
  * */
 public class TradeCode {
-  public static final int TRANSCODE_PAY = 6630;
+  public static final int TRANSCODE_PAY = 3000;
   public static final int TRANSCODE_YKTPAY=1000;
   public static final int TRANSCODE_WECHAT=1001;
 
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
index 6b45836..2b392b3 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
@@ -44,6 +44,9 @@
    */
   public static final String PAYTYPE_CASH = "cash";
   public static final String PAYTYPE_BALANCE = "balance";
+  public static final String PAYTYPE_ALIPAY = "alipay"; //市民卡
+  public static final String PAYTYPE_WECHAT = "wechat"; //市民卡
+  public static final String PAYTYPE_CITIZEN_CARD = "citizenCard"; //市民卡
 
 
   /**
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 7ef7051..a8139c9 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
@@ -84,6 +84,20 @@
    * */
   public static final int LOCK_READ_TIMEOUT = 10015;
 
+  /**
+   *  卡已挂失
+   * */
+  public static final int ACCOUNT_IS_LOSS = 10016;
+
+  /**
+   *  卡已锁定
+   * */
+  public static final int ACCOUNT_IS_LOCKED = 10017;
+
+  /**
+   * 费用类别未定义
+   * */
+  public static final int FEETYPE_NOT_EXISTS = 10018;
 
   /**
    * 请求参数错误
@@ -107,5 +121,8 @@
 
   public static final int BUSINESS_SHOP_EXISTS = 30001; //商户已经存在
 
+  public static final int BUSINESS_APPID_NOTFOUND = 30002; //APPID没找到
+
+  public static final int BUSINESS_PAYTYPE_NOSUPPORT = 30003; //支付方式不支持
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java b/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
index 13af83c..1bf5ac2 100644
--- a/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
@@ -21,4 +21,9 @@
 
     public static final int SHOPTYPE_GROUP = 0; //商户组
     public static final int SHOPTYPE_LEAF = 1;  //末级商户，独立核算商户
+
+    public static final String FEETYPE_DEFAULT = "none";
+    public static final String FEETYPE_MEALER = "mealer";
+    public static final String FEETYPE_DISCOUNT = "discount";
+    public static final String[] FEETYPE_DICTS = {"none", "mealer", "discount"}; //联动
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt b/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
index 2b3b6ee..d02ba57 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
@@ -11,9 +11,15 @@
 import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.util.Code
 
-/**
- * Created by shuwei on 2019/4/11.
- */
+class CallBackResp {
+    var retcode: String = "99"
+    var retmsg: String? = null
+    val data = mutableMapOf<String, String>()
+    fun add(key: String, value: String) {
+        this.data.plus(mapOf(key to value))
+    }
+}
+
 class CallService {
 
     companion object {
@@ -227,5 +233,11 @@
                 }
             }
         }
+
+        fun CallCitizenCardPay(config: Map<String, String?>, paydtl: TUserdtl): CallBackResp {
+            val resp = CallBackResp()
+            // TODO: 代扣逻辑
+            return resp
+        }
     }
 }
\ No newline at end of file
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 d1f8c99..9087149 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
@@ -8,7 +8,7 @@
 import com.supwisdom.dlpay.util.ConstantUtil
 
 open class APIRequestParam {
-    open val param_map = mutableMapOf<String, String>()
+    open val param_map = mutableMapOf<String, String?>()
 
     open fun checkSign(key: String): Boolean {
         val sign = param_map["sign"]
@@ -26,11 +26,9 @@
 }
 
 
-
 // ============================ USER ============================ //
 class OpenUserParam : APIRequestParam() {
-    var syscode: String = "" //必传
-    var uid: String = ""    //必传
+    var uid: String = ""    //第三方用户ID,必传
     var name: String = ""   //必传
     var sex: String? = null
     var idtype: String = "" //必传
@@ -44,7 +42,6 @@
     var sign_type: String? = null
 
     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 != sex && ConstantUtil.SEX_FEMALE != sex) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "性别非法[male|female]")
@@ -54,29 +51,26 @@
         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, "sign_type" to sign_type))
+        param_map.plus(mapOf("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, "sign_type" to sign_type))
         return true
     }
 }
 
 class QueryUserParam : APIRequestParam() {
-    var syscode: String = "" //必传
     var userid: String? = null  // 用户ID二选一 (两者都传取userid)
     var uid: String? = null    // 用户ID二选一
     var sign: String = "" //必传
     var sign_type: String? = null
 
     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, "sign_type" to sign_type))
+        param_map.plus(mapOf("userid" to userid, "uid" to uid, "sign" to sign, "sign_type" to sign_type))
         return true
     }
 }
 
 class ModifyUserParam : APIRequestParam() {
-    var syscode: String = "" //必传
     var userid: String? = null  // 用户ID二选一 (两者都传取userid)
     var uid: String? = null    // 用户ID二选一
     var name: String? = null
@@ -92,7 +86,6 @@
     var sign_type: String? = null
 
     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, "用户唯一号不能为空")
         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, "证件类型非法")
@@ -103,16 +96,14 @@
         if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "邮箱格式错误")
 
 
-        param_map.plus(mapOf("syscode" to syscode, "userid" to userid, "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, "sign_type" to sign_type))
+        param_map.plus(mapOf("userid" to userid, "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, "sign_type" to sign_type))
         return true
     }
 }
 
 
-
 // ============================ SHOP ============================ //
 class OpenShopParam : APIRequestParam() {
-    var syscode: String = "" //必传
     var shopUniqueId: String = "" //必传
     var shoptype: Int = 1
     var fshopid: Int? = null
@@ -128,7 +119,6 @@
     var sign_type: String? = null
 
     fun checkParam(): Boolean {
-        if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空")
         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, "商户名称不能为空")
@@ -138,13 +128,12 @@
         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, "shopUniqueId" to shopUniqueId, "shoptype" to shoptype, "fshopid" to fshopid, "shopname" to shopname, "contactman" to contactman, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign, "sign_type" to sign_type))
+        param_map.plus(mapOf("shopUniqueId" to shopUniqueId, "shoptype" to shoptype, "fshopid" to fshopid, "shopname" to shopname, "contactman" to contactman, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign, "sign_type" to sign_type))
         return true
     }
 }
 
 class QueryShopParam : APIRequestParam() {
-    var syscode: String = "" //必传
     var shopid: Int? = null  //注册时返回的shopid
     var shopaccno: String? = null  //注册时返回的shopaccno
     var shopUniqueId: String? = null //注册传的商户唯一号
@@ -152,39 +141,69 @@
     var sign_type: String? = null
 
     fun checkParam(): Boolean {
-        if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空")
         if (StringUtil.isEmpty(shopUniqueId) && null == shopid && StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "商户唯一标志不能为空")
 
-        param_map.plus(mapOf("syscode" to syscode, "shopUniqueId" to shopUniqueId, "shopid" to shopid, "shopaccno" to shopaccno, "sign" to sign, "sign_type" to sign_type))
+        param_map.plus(mapOf("shopUniqueId" to shopUniqueId, "shopid" to shopid, "shopaccno" to shopaccno, "sign" to sign, "sign_type" to sign_type))
         return true
     }
 }
 
 
 // ============================ CONSUME ============================ //
-class BankcardPayinitParam :  APIRequestParam() {
-    var syscode: String = "" //必传
-    var cardNo: String = "" //必传
-    var amount: Int = 0 //必传
-    var shopaccno: String = "" //必传
-    var paytype: String ="" //必传
-    var billno: String ="" //必传
-    var transdate: String="" //必传
-    var transtime: String="" //必传
+class ConsumeFeetype {
+    var feetype: String = ""
+    var amount: Int = 0
+}
+
+class QueryDtlResultParam : APIRequestParam() {
+    var refno:String?=null //二选一
+    var billno:String?=null //二选一 (billno+shopaccno） 传billno时，shopaccno必传
+    var shopaccno: String?=null
     var sign: String = "" //必传
     var sign_type: String? = null
 
     fun checkParam(): Boolean {
-        if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空")
-        if (StringUtil.isEmpty(cardNo)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "卡唯一号不能为空")
-        if (amount <= 0) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易金额必须大于零")
-        if(StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请指定交易商户")
-        if(StringUtil.isEmpty(paytype)) 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(refno) && (StringUtil.isEmpty(billno) || StringUtil.isEmpty(shopaccno))) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "流水唯一号不能为空")
 
-        param_map.plus(mapOf("syscode" to syscode, "cardNo" to cardNo, "amount" to amount, "shopaccno" to shopaccno,"paytype" to paytype,"billno" to billno,"transdate" to transdate,"transtime" to transtime, "sign" to sign, "sign_type" to sign_type))
+        param_map.plus(mapOf("refno" to refno, "billno" to billno, "shopaccno" to shopaccno,  "sign" to sign, "sign_type" to sign_type))
+        return true
+    }
+}
+
+class CitizenCardPayinitParam : APIRequestParam() {
+    var cardNo: String = "" //必传
+    var shopaccno: String = "" //必传
+    var amount: Int = 0 //必传
+    var feelist: List<ConsumeFeetype>? = null// 的json字符串
+    var billno: String = "" //必传
+    var transdate: String = "" //必传
+    var transtime: String = "" //必传
+    var extend_data: String? = null //扩展参数，原样返回
+    var sign: String = "" //必传
+    var sign_type: String? = null
+
+    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]")
+
+        param_map.plus(mapOf("cardNo" to cardNo, "amount" to amount, "feelist" to feelist, "shopaccno" to shopaccno, "billno" to billno, "transdate" to transdate, "transtime" to transtime, "sign" to sign, "sign_type" to sign_type))
+        return true
+    }
+}
+
+class CitizenCardPayfinishParam : APIRequestParam() {
+    var refno:String=""
+    var sign: String = "" //必传
+    var sign_type: String? = null
+
+    fun checkParam(): Boolean {
+        if (StringUtil.isEmpty(refno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易参考号不能为空")
+
+        param_map.plus(mapOf("refno" to refno, "sign" to sign, "sign_type" to sign_type))
         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
index 4ba03d4..94e5a08 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/comsume_builder.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/comsume_builder.kt
@@ -6,9 +6,9 @@
 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.domain.TTranstype
 import com.supwisdom.dlpay.framework.util.*
 
 class AccountHolder<T> private constructor(val accountId: String, val idType: Int) {
@@ -16,7 +16,7 @@
         const val IDTYPE_PERSON = 1
         const val IDTYPE_SHOP = 2
         const val IDTYPE_SUBJECT = 3
-        const val IDTYPE_TRANSTYPE = 4
+        const val IDTYPE_FEETYPE = 4
 
         fun person(userid: String): AccountHolder<TAccount> {
             return AccountHolder(userid, IDTYPE_PERSON)
@@ -30,8 +30,8 @@
             return AccountHolder(subjNo, IDTYPE_SUBJECT)
         }
 
-        fun transType(transType: Int): AccountHolder<TTranstype> {
-            return AccountHolder("$transType", IDTYPE_TRANSTYPE)
+        fun feetype(feetype: String, paytype: String): AccountHolder<TFeetypeConfig> {
+            return AccountHolder("$feetype@$paytype", IDTYPE_FEETYPE)
         }
     }
 
@@ -52,7 +52,7 @@
             IDTYPE_PERSON -> builder.accountUtil.readAccountForUpdateNowait(accountId)
             IDTYPE_SHOP -> builder.accountUtil.readShopAcc(accountId.toInt())
             IDTYPE_SUBJECT -> builder.accountUtil.readSubject(accountId)
-            IDTYPE_TRANSTYPE -> builder.accountUtil.readTranstype(accountId.toInt())
+            IDTYPE_FEETYPE -> builder.accountUtil.readFeetype(accountId.split("@")[0], accountId.split("@")[1])
             else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "账户类型未知type<$idType>")
         } as T
     }
@@ -63,7 +63,7 @@
             IDTYPE_PERSON -> builder.accountUtil.readAccountForUpdateNowait(accountId)
             IDTYPE_SHOP -> builder.accountUtil.readShopAcc(accountId.toInt())
             IDTYPE_SUBJECT -> builder.accountUtil.readSubject(accountId)
-            IDTYPE_TRANSTYPE -> builder.accountUtil.readTranstype(accountId.toInt())
+            IDTYPE_FEETYPE -> builder.accountUtil.readFeetype(accountId.split("@")[0], accountId.split("@")[1])
             else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "账户类型未知type<$idType>")
         } as T
     }
@@ -83,6 +83,9 @@
     // 以下为输入参数，调用接口时指定的参数值
     lateinit var person: TPerson
     lateinit var tradetype: Tradetype
+    lateinit var refno: String
+    lateinit var status: String
+    val resultMap = mutableMapOf<String, String>() //存调第三方结果数据
 
     var transcode = 0
 
@@ -158,8 +161,18 @@
         return this
     }
 
-    fun setTradeno(outtradeno: String): PersonTransBuilder {
-        this.outtradeno = outtradeno
+    fun setRefno(refno: String): PersonTransBuilder {
+        this.refno = refno
+        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
     }
 
@@ -276,10 +289,10 @@
         return this
     }
 
-    fun addDetail(accountHolder: AccountHolder<TTranstype>,
+    fun addDetail(accountHolder: AccountHolder<TFeetypeConfig>,
                   amount: Double): PersonTransBuilder {
         accountHolder.builder = this
-        val transtype = accountHolder.get<TTranstype>()
+        val transtype = accountHolder.get<TFeetypeConfig>()
 
         var debitAccNo = ""
         var debitSubjNo = ""
@@ -301,11 +314,11 @@
 
         if (debitAccNo.isEmpty()) {
             throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                    "交易配置<${transtype.transtype}> 借方账号配置错误")
+                    "交易配置<${transtype.feetype}@${transtype.paytype}> 借方账号配置错误")
         }
         if (creditAccNo.isEmpty()) {
             throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR,
-                    "交易配置<${transtype.transtype}> 贷方账号配置错误")
+                    "交易配置<${transtype.feetype}@${transtype.paytype}> 贷方账号配置错误")
         }
         this.details.add(TransDetail(debitAccNo, debitSubjNo, creditAccNo, creditSubjNo,
                 amount, transtype.summary, this.details.size + 1))
@@ -313,32 +326,37 @@
     }
 
     /**
-     * 单步交易，一次完成交易记账过程
-     * @param service
-     * @param isFinished - true : 完成交易过程,扣除账户余额; false - 完成检查
+     * 一步交易完成
      */
-    fun done(service: PersonBalancePayService, isFinished: Boolean): TUserdtl {
+    fun done(service: PersonBalancePayService): TUserdtl {
         prepareData()
         preCheckAccount()
-        return when (isFinished) {
-            true -> service.process(this)
-            false -> service.init(this)
-        }
+        return service.process(this)
     }
 
-    /**
-     * 两步交易，在 paydtl 基础完成确认过程
-     * @param paydtl
-     * @param status - 完成交易状态，见 TradeDict.DTL_STATUS_FAIL
-     */
-    fun done(paydtl: TUserdtl, status: String, service: PersonBalancePayService): TUserdtl {
-        return service.finish(paydtl, status, null)
+    fun init(service: PersonBalancePayService) : TUserdtl{
+        prepareData()
+        preCheckAccount()
+        return service.init(this)
     }
 
-    fun done(refno: String, status: String, service: PersonBalancePayService): TUserdtl {
-        return service.finish(refno, status, null)
+    fun wip(service: PersonBalancePayService): TUserdtl {
+        if (null == this.refno)
+            throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "交易参考号<refno>未指定")
+        return service.wip(this)
     }
-    fun done(refno: String, status: String, businessData: Map<String, String>?,service: PersonBalancePayService): TUserdtl {
-        return service.finish(refno, status, businessData)
+
+    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/consume_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
index 3717a2b..debf0e5 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
@@ -3,11 +3,14 @@
 import com.supwisdom.dlpay.api.AccountHolder
 import com.supwisdom.dlpay.api.CallService
 import com.supwisdom.dlpay.api.PersonTransBuilder
-import com.supwisdom.dlpay.api.bean.BankcardPayinitParam
+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.service.*
 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.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.util.ConstantUtil
@@ -15,6 +18,8 @@
 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")
@@ -31,228 +36,352 @@
     lateinit var systemUtilService: SystemUtilService
     @Autowired
     lateinit var consumePayService: ConsumePayService
+    @Autowired
+    lateinit var commonService: CommonService
 
-    @PostMapping("/bankcard/payinit")
-    fun bankcardPayinit(@RequestBody request: BankcardPayinitParam): ResponseEntity<Any> {
-        return try{
-            if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) {
+    /**
+     * 流水结果查询统一接口
+     * */
+    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, "参数签名错误"))
             }
-            if (!consumePayService.checkShopPaytype(request.shopaccno, request.paytype)) {
+
+            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("/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.INPUT_DATA_ERROR, "支付方式不支持"))
+                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
             }
 
-
-
-
-
+            val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
+            val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+                    .chooseTradetype(Tradetype.CONSUME) //消费
+                    .setOwner(person) //记名
+                    .setTransinfo(TradeCode.TRANSCODE_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 {
+                            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","")
+                    .data("refno", dtl.refno)
+                    .data("amount", dtl.amount)
                     .success("交易初始化成功"))
-        }catch (ex: RequestParamCheckException) {
+
+        } catch (ex: RequestParamCheckException) {
             ResponseEntity.ok(ResponseBodyBuilder.create()
                     .requestException(ex, "请求参数错误"))
         } catch (et: TransactionException) {
             ResponseEntity.ok(ResponseBodyBuilder.create()
                     .transException(et, "业务处理错误"))
         }
-
-    }
-
-
-
-
-// ============================================== //
-
-    @PostMapping("/account/pay")
-    fun accountPay(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, true)
-        return ResponseEntity.ok(dtl)
-    }
-
-    @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)
-    }
-
-    @PostMapping("/ykt/payinit")
-    fun yktPayInit(userid: String, amount: Int, manageFee: Int,
-                   stuempno: String, shopid: String, transdate: String, transtime: String,
-                   outtradeno: String, payinfo: String, feetype: String): ResponseEntity<Any> {
-        //一卡通支付款 112240
-        return try {
-            val paytype = paytypeService.getByPaytype(PaytypeUtil.YKTPAY)
-            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.YKTPAY, payinfo)
-                    .setOuttradeno(outtradeno)
-                    .also {
-                        if (null != person) it.setOwner(person)
-                    }
-                    .tryLock(true)
-                    .setTransinfo(TradeCode.TRANSCODE_YKTPAY, "一卡通支付")
-                    .chooseTradetype(Tradetype.CONSUME)
-                    .also {
-                        when (feetype) {
-                            TradeDict.FEETYPE_CONSUME_MEALER -> {
-                                it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT),
-                                        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_YKT),
-                                        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_YKT),
-                                        AccountHolder.shop(shopid),
-                                        amount / 100.0, "一卡通支付")
-                            }
-                        }
-                    }.done(personBalancePayService, false)
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .data("refno", dtl.refno)
-                    .success())
-        } catch (e: TransactionException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(e, "交易初始化异常"))
-        }
-    }
-
-    @PostMapping("/ykt/payfinish")
-    fun yktPayFinish(refno: String, yktshopid: String, devphyid: String?): ResponseEntity<Any> {
-        return try {
-            val dtl = personBalancePayService.wip(refno)
-            val person = userService.findPersonByUserid(dtl.userid)
-            val code = CallService.callYktPay(paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.YKTPAY),
-                    dtl, DateUtil.getNow(), "", yktshopid, devphyid)
-            if (code.retcode == "0") {
-                PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .done(dtl.refno, TradeDict.DTL_STATUS_SUCCESS, personBalancePayService)
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("refno", dtl.refno)
-                        .success())
-            } else {
-                PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .done(dtl.refno, TradeDict.DTL_STATUS_FAIL, personBalancePayService)
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易请求失败-${code.retcode}"))
-            }
-        } catch (e: TransactionException) {
-            ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(e, "交易确认失败"))
-        }
     }
 
     /**
-     * 微信支付
-     * 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> {
+    @PostMapping("/citizencard/payfinish")
+    fun citizencardPayinit(@RequestBody param: CitizenCardPayfinishParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
         return try {
-            val paytype = paytypeService.getByPaytype(PaytypeUtil.WECHAT)
-            if (paytype == null || ConstantUtil.ENABLE_YES != paytype.enable) {
+            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
                 ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(1, "支付方式未开启"))
+                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
             }
-            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)
+
+            var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+                    .setRefno(param.refno)
+                    .wip(personBalancePayService)
+            val code = CallService.CallCitizenCardPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, "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.TRANSACTION_NOT_EXISTS, "交易请求失败-${code.retcode}"))
+                        .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
             }
-        } catch (e: TransactionException) {
+
+        } catch (ex: RequestParamCheckException) {
             ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .transException(e, "交易初始化异常"))
+                    .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)
+            val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+                    .chooseTradetype(Tradetype.CONSUME) //消费
+                    .setOwner(person) //记名
+                    .setTransinfo(TradeCode.TRANSCODE_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 {
+                            builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_BALANCE)
+                                    .with(AccountHolder.shop(param.shopaccno))
+                                    .with(AccountHolder.person(person.userid))
+                                    , it.amount / 100.0)
+                        }
+                    }
+                    .done(personBalancePayService)
+
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .data("refno", dtl.refno)
+                    .data("amount", dtl.amount)
+                    .success("交易成功"))
+
+        } 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)
+//    }
+//
+//    @PostMapping("/ykt/payinit")
+//    fun yktPayInit(userid: String, amount: Int, manageFee: Int,
+//                   stuempno: String, shopid: String, transdate: String, transtime: String,
+//                   outtradeno: String, payinfo: String, feetype: String): ResponseEntity<Any> {
+//        //一卡通支付款 112240
+//        return try {
+//            val paytype = paytypeService.getByPaytype(PaytypeUtil.YKTPAY)
+//            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.YKTPAY, payinfo)
+//                    .setOuttradeno(outtradeno)
+//                    .also {
+//                        if (null != person) it.setOwner(person)
+//                    }
+//                    .tryLock(true)
+//                    .setTransinfo(TradeCode.TRANSCODE_YKTPAY, "一卡通支付")
+//                    .chooseTradetype(Tradetype.CONSUME)
+//                    .also {
+//                        when (feetype) {
+//                            TradeDict.FEETYPE_CONSUME_MEALER -> {
+//                                it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT),
+//                                        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_YKT),
+//                                        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_YKT),
+//                                        AccountHolder.shop(shopid),
+//                                        amount / 100.0, "一卡通支付")
+//                            }
+//                        }
+//                    }.done(personBalancePayService, false)
+//            ResponseEntity.ok(ResponseBodyBuilder.create()
+//                    .data("refno", dtl.refno)
+//                    .success())
+//        } catch (e: TransactionException) {
+//            ResponseEntity.ok(ResponseBodyBuilder.create()
+//                    .transException(e, "交易初始化异常"))
+//        }
+//    }
+//
+//    @PostMapping("/ykt/payfinish")
+//    fun yktPayFinish(refno: String, yktshopid: String, devphyid: String?): ResponseEntity<Any> {
+//        return try {
+//            val dtl = personBalancePayService.wip(refno)
+//            val person = userService.findPersonByUserid(dtl.userid)
+//            val code = CallService.callYktPay(paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.YKTPAY),
+//                    dtl, DateUtil.getNow(), "", yktshopid, devphyid)
+//            if (code.retcode == "0") {
+//                PersonTransBuilder.newBuilder(accountUtilServcie)
+//                        .done(dtl.refno, TradeDict.DTL_STATUS_SUCCESS, personBalancePayService)
+//                ResponseEntity.ok(ResponseBodyBuilder.create()
+//                        .data("refno", dtl.refno)
+//                        .success())
+//            } else {
+//                PersonTransBuilder.newBuilder(accountUtilServcie)
+//                        .done(dtl.refno, TradeDict.DTL_STATUS_FAIL, personBalancePayService)
+//                ResponseEntity.ok(ResponseBodyBuilder.create()
+//                        .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易请求失败-${code.retcode}"))
+//            }
+//        } catch (e: TransactionException) {
+//            ResponseEntity.ok(ResponseBodyBuilder.create()
+//                    .transException(e, "交易确认失败"))
+//        }
+//    }
+//
+//    /**
+//     * 微信支付
+//     * 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
index 408cc3d..cc262cb 100644
--- 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
@@ -89,7 +89,9 @@
                     && !StringUtils.isEmpty(result_code) && "SUCCESS" == result_code) {
                 //map.get("transaction_id") 第三方流水号
                 PersonTransBuilder.newBuilder(accountUtilServcie)
-                        .done(out_trade_no!!, TradeDict.DTL_STATUS_SUCCESS, map, personBalancePayService)
+                        .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) {
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
index a8f4bfc..5f92a0c 100644
--- 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
@@ -6,12 +6,14 @@
 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.SystemUtilService
+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")
@@ -19,27 +21,27 @@
     @Autowired
     private lateinit var shopService: ShopService
     @Autowired
-    private lateinit var systemUtilService: SystemUtilService
+    private lateinit var commonService: CommonService
 
     @PostMapping("/open")
-    fun openAccount(@RequestBody request: OpenShopParam): ResponseEntity<Any> {
+    fun openAccount(@RequestBody param: OpenShopParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
         return try {
-            if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) {
+            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
                 ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
             }
-            shopService.findByThirdUniqueId(request.shopUniqueId)?.let {
+            shopService.findByThirdUniqueId(param.shopUniqueId)?.let {
                 ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.BUSINESS_SHOP_EXISTS, "该商户唯一号[${request.shopUniqueId}]已经存在"))
+                        .fail(TradeErrorCode.BUSINESS_SHOP_EXISTS, "该商户唯一号[${param.shopUniqueId}]已经存在"))
             }
 
-            request.shopname = request.shopname?.let { URLDecoder.decode(request.shopname, Charsets.UTF_8.toString()) } //解码
-            request.contactman = request.contactman?.let { URLDecoder.decode(request.contactman, Charsets.UTF_8.toString()) } //解码
-            request.address = request.address?.let { URLDecoder.decode(request.address, Charsets.UTF_8.toString()) } //解码
-            shopService.registerShop(request)?.let {
+            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?:"")
+                        .data("shopaccno", it.shopaccno ?: "")
                         .success("注册成功"))
             }
 
@@ -55,16 +57,16 @@
     }
 
     @GetMapping("/query")
-    fun queryShop(@RequestBody request: QueryShopParam): ResponseEntity<Any> {
+    fun queryShop(@RequestBody param: QueryShopParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
         return try {
-            if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) {
+            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
                 ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
             }
 
-            shopService.findByShopBySearch(request.shopid,request.shopaccno,request.shopUniqueId)?.let {
+            shopService.findByShopBySearch(param.shopid, param.shopaccno, param.shopUniqueId)?.let {
                 ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("shopid", it)
+                        .data("shop", it)
                         .success())
             }
 
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 ac86e3a..5b838e4 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
@@ -7,7 +7,7 @@
 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.service.CommonService
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
@@ -16,6 +16,8 @@
 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")
@@ -23,28 +25,28 @@
     @Autowired
     private lateinit var useService: UserService
     @Autowired
-    private lateinit var systemUtilService: SystemUtilService
+    private lateinit var commonService: CommonService
 
     @PostMapping("/open")
-    fun openAccount(@RequestBody request: OpenUserParam): ResponseEntity<Any> {
+    fun openAccount(@RequestBody param: OpenUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
         return try {
-            if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) {
+            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
                 ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
             }
-            useService.findByThirdUniqueIdenty(request.uid, request.syscode).let {
+            useService.findByThirdUniqueIdenty(param.uid).let {
                 if (null != it) {
                     ResponseEntity.ok(ResponseBodyBuilder.create()
                             .fail(TradeErrorCode.REGISTER_USER_EXIST, "改用户唯一号已经注册"))
                 }
 
-                request.name = URLDecoder.decode(request.name, Charsets.UTF_8.toString()) //解码
-                request.address = request.address?.let { URLDecoder.decode(request.address, Charsets.UTF_8.toString()) }  //解码
-                useService.registerUser(request).let {
+                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", request.uid)
+                                .data("uid", param.uid)
                                 .success())
                     }
 
@@ -62,14 +64,14 @@
     }
 
     @PostMapping("/query")
-    fun queryAccount(@RequestBody request: QueryUserParam): ResponseEntity<Any> {
+    fun queryAccount(@RequestBody param: QueryUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
         return try {
-            if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) {
+            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
                 ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
             }
 
-            useService.findByUseridOrThirdUniqueIdenty(request.userid, request.uid, request.syscode).let {
+            useService.findByUseridOrThirdUniqueIdenty(param.userid, param.uid).let {
                 if (null != it) {
                     val account = useService.findAccountByUserid(it.userid, null)
                     val pointacc = useService.findPointsAccountByUserid(it.userid)
@@ -111,16 +113,16 @@
     }
 
     @PostMapping("/modify")
-    fun modifyAccount(@RequestBody request: ModifyUserParam): ResponseEntity<Any> {
+    fun modifyAccount(@RequestBody param: ModifyUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
         return try {
-            if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) {
+            if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
                 ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
             }
-            useService.findByUseridOrThirdUniqueIdenty(request.userid, request.uid, request.syscode)?.let {
-                request.name = request.name?.let { URLDecoder.decode(request.name, Charsets.UTF_8.toString()) } //解码
-                request.address = request.address?.let { URLDecoder.decode(request.address, Charsets.UTF_8.toString()) } //解码
-                if (useService.modifyUserInfo(it, request)) {
+            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 {
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
index c043553..7ef63a5 100644
--- 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
@@ -11,9 +11,11 @@
 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.FeetypeConfigDao
 import com.supwisdom.dlpay.framework.dao.ShopaccDao
 import com.supwisdom.dlpay.framework.dao.SubjectDao
 import com.supwisdom.dlpay.framework.dao.TranstypeDao
+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
@@ -40,7 +42,7 @@
     lateinit var subjectDao: SubjectDao
 
     @Autowired
-    lateinit var transtypeDao: TranstypeDao
+    lateinit var feetypeConfigDao: FeetypeConfigDao
 
 
     override fun readAccountForUpdateNowait(userid: String): TAccount {
@@ -70,9 +72,9 @@
                 ?: throw TransactionProcessException(TradeErrorCode.SUBJECT_NOT_EXISTS, "科目<$subjno>不存在")
     }
 
-    override fun readTranstype(transtype: Int): TTranstype {
-        return transtypeDao.findByTranstype(transtype)
-                ?: throw TransactionProcessException(TradeErrorCode.SUBJECT_NOT_EXISTS, "交易类型<$transtype>未配置")
+    override fun readFeetype(feetype: String, paytype: String): TFeetypeConfig {
+        return feetypeConfigDao.getById(feetype, paytype)
+                ?: throw TransactionProcessException(TradeErrorCode.FEETYPE_NOT_EXISTS, "在支付方式<$paytype>下不存在费用类别<$feetype>")
     }
 }
 
@@ -152,7 +154,7 @@
     }
 
     override fun process(builder: PersonTransBuilder): TUserdtl {
-        return finish(init(builder), TradeDict.DTL_STATUS_SUCCESS, null)
+        return finish(init(builder), TradeDict.DTL_STATUS_SUCCESS, builder.resultMap)
     }
 
     override fun init(builder: PersonTransBuilder): TUserdtl {
@@ -286,4 +288,36 @@
         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/user_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
index 510fd35..fa30ada 100644
--- 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
@@ -16,7 +16,6 @@
 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.
@@ -79,23 +78,26 @@
             }
         }
         personIdentityDao.save(TPersonIdentity().apply {
-            thirdUserid = param.uid
-            thirdSyscode = param.syscode
+            thirdUid = param.uid
             this.person = person
+            status = person.status
+            lossflag = 0
+            lockflag = 0
+            createtime = systemdatetime.hostdatetime
         }) //保存绑定关系
 
         return person
     }
 
-    override fun findByThirdUniqueIdenty(thirdUniqueIdenty: String, syscode: String): TPerson? {
-        return personIdentityDao.getPersonIdentityById(thirdUniqueIdenty, syscode)?.let { it.person }
+    override fun findByThirdUniqueIdenty(thirdUniqueIdenty: String): TPerson? {
+        return personIdentityDao.getByThirdUid(thirdUniqueIdenty)?.let { it.person }
     }
 
-    override fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?, syscode: String): TPerson? {
+    override fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?): TPerson? {
         return if (!StringUtil.isEmpty(userid)) {
             personDao.findByUserid(userid)
         } else {
-            personIdentityDao.getPersonIdentityById(thirdUniqueIdenty, syscode)?.let { it.person }
+            personIdentityDao.getByThirdUid(thirdUniqueIdenty)?.let { it.person }
         }
     }
 
@@ -137,4 +139,32 @@
         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
index b789d39..568d9bb 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt
@@ -3,6 +3,7 @@
 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
@@ -21,7 +22,7 @@
 
     fun readSubject(subjno: String): TSubject
 
-    fun readTranstype(transtype: Int): TTranstype
+    fun readFeetype(feetype: String, paytype: String): TFeetypeConfig
 }
 
 interface PersonBalancePayService {
@@ -58,4 +59,15 @@
     @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/user_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
index 9f2d3fd..c4d9b20 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
@@ -4,6 +4,7 @@
 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
@@ -16,10 +17,10 @@
     fun registerUser(param: OpenUserParam): TPerson
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findByThirdUniqueIdenty(thirdUniqueIdenty: String, syscode: String): TPerson?
+    fun findByThirdUniqueIdenty(thirdUniqueIdenty: String): TPerson?
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?, syscode: String): TPerson?
+    fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?): TPerson?
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
     fun modifyUserInfo(person:TPerson,param: ModifyUserParam):Boolean
@@ -33,4 +34,10 @@
     @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/framework/service/framework_service.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt
index b072cc2..99161e3 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,5 +1,13 @@
 package com.supwisdom.dlpay.framework.service
 
+import com.supwisdom.dlpay.api.bean.ConsumeFeetype
+import javax.servlet.http.HttpServletRequest
+
 interface CommonService{
     fun getSystemVersion(): String
+
+    fun getRequestAppid(request: HttpServletRequest): String
+
+    fun getAppidSecretByRequest(request: HttpServletRequest): String
+
 }
\ No newline at end of file
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 7429de9..56f2586 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,11 +1,37 @@
 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
+import com.supwisdom.dlpay.framework.dao.ApiClientDao
 import com.supwisdom.dlpay.framework.service.CommonService
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
+import javax.servlet.http.HttpServletRequest
 
 @Service
 class CommonServiceImpl : CommonService {
+    @Autowired
+    lateinit var jwtConfig: JwtConfig
+    @Autowired
+    lateinit var apiClientDao: ApiClientDao
+
+    private var jwtUtil: JwtTokenUtil? = null
+
+    private fun getUtil(): JwtTokenUtil {
+        if (jwtUtil == null) {
+            jwtUtil = JwtTokenUtil((jwtConfig))
+        }
+        return jwtUtil as JwtTokenUtil
+    }
+
     override fun getSystemVersion(): String {
         try {
             return Manifests.read("Payapi-Version") ?: "version 1.0"
@@ -14,4 +40,27 @@
             return "unknown"
         }
     }
+
+    override fun getRequestAppid(request: HttpServletRequest): String {
+        request.getHeader(jwtConfig.header).let {
+            if (null != it && it.startsWith(jwtConfig.tokenHeader)) {
+                val claims = getUtil().verifyToken(it.substring(jwtConfig.tokenHeader.length))
+                val uid = claims["uid"]?.toString()
+                if (!StringUtil.isEmpty(uid)) {
+                    return uid as String
+                }
+            }
+
+            throw TransactionProcessException(TradeErrorCode.BUSINESS_APPID_NOTFOUND, "APPID未找到") //报错
+        }
+    }
+
+    override fun getAppidSecretByRequest(request: HttpServletRequest): String {
+        return apiClientDao.findByAppid(getRequestAppid(request)).let {
+            if (null != it)
+                it.secret
+            else
+                throw TransactionProcessException(TradeErrorCode.BUSINESS_APPID_NOTFOUND, "APPID记录未找到") //报错
+        }
+    }
 }
\ No newline at end of file
