diff --git a/build.gradle b/build.gradle
index 789c2d5..471af3a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -3,6 +3,7 @@
     id 'org.jetbrains.kotlin.jvm'
     id 'org.jetbrains.kotlin.plugin.jpa'
     id 'org.jetbrains.kotlin.plugin.spring'
+    id "com.palantir.git-version" version "0.12.0-rc2"
     id 'com.palantir.docker' version '0.22.1'
 }
 
@@ -14,6 +15,14 @@
 waterManagerVersion = gitVersion()
 repositories {
     mavenCentral()
+
+    maven {
+        url "http://ykt-nx.supwisdom.com/repository/ecard-repo/"
+        credentials {
+            username 'ecard'
+            password 'Ecard4SUP'
+        }
+    }
 }
 
 def startClass = 'com.supwisdom.dlpay.WaterManagerApplicationKt'
@@ -52,6 +61,10 @@
     implementation 'org.springframework.boot:spring-boot-starter-security'
 //    implementation 'org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.0.1.RELEASE'
     implementation 'org.springframework.boot:spring-boot-autoconfigure'
+    implementation 'org.springframework.security:spring-security-oauth2-jose'
+    implementation 'org.springframework.security:spring-security-oauth2-client'
+    implementation 'org.springframework.security:spring-security-oauth2-jose'
+    implementation 'org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.1.5.RELEASE'
 //    implementation 'org.springframework.security.oauth:spring-security-oauth2'
     implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
     implementation 'org.springframework.session:spring-session-data-redis'
@@ -60,7 +73,7 @@
     implementation 'org.jetbrains.kotlin:kotlin-reflect'
     implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
 
-
+    implementation 'com.github.penggle:kaptcha:2.3.2'
     implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
     implementation 'org.postgresql:postgresql:42.2.5'
     implementation 'com.fasterxml.jackson.module:jackson-module-kotlin'
@@ -75,9 +88,12 @@
     implementation group: 'commons-codec', name: 'commons-codec', version: '1.6'
     implementation files('libs/ojdbc6.jar')
 
-
+    annotationProcessor 'org.projectlombok:lombok:1.18.8'
+    compileOnly 'org.projectlombok:lombok:1.18.8'
     annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
-
+    
+    compile 'com.supwisdom:payapi-sdk:e4bf762'
+    
 //    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
     testImplementation 'org.springframework.boot:spring-boot-starter-test'
     testImplementation 'io.rest-assured:rest-assured:3.3.0'
diff --git a/src/main/java/com/supwisdom/dlpay/framework/KaptchaConfig.java b/src/main/java/com/supwisdom/dlpay/framework/KaptchaConfig.java
new file mode 100644
index 0000000..c69dc38
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/KaptchaConfig.java
@@ -0,0 +1,29 @@
+package com.supwisdom.dlpay.framework;
+
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import com.google.code.kaptcha.util.Config;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Properties;
+
+@Configuration
+public class KaptchaConfig {
+  @Bean
+  public DefaultKaptcha getDefaultKaptcha(){
+    DefaultKaptcha captchaProducer = new DefaultKaptcha();
+    Properties properties = new Properties();
+    properties.setProperty("kaptcha.border", "yes");
+    properties.setProperty("kaptcha.border.color", "105,179,90");
+    properties.setProperty("kaptcha.textproducer.font.color", "blue");
+    properties.setProperty("kaptcha.image.width", "110");
+    properties.setProperty("kaptcha.image.height", "40");
+    properties.setProperty("kaptcha.textproducer.font.size", "30");
+    properties.setProperty("kaptcha.session.key", "code");
+    properties.setProperty("kaptcha.textproducer.char.length", "4");
+    properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
+    Config config = new Config(properties);
+    captchaProducer.setConfig(config);
+    return captchaProducer;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/core/JwtTokenUtil.java b/src/main/java/com/supwisdom/dlpay/framework/core/JwtTokenUtil.java
index 481df61..8ef087f 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/core/JwtTokenUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/core/JwtTokenUtil.java
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay.framework.core;
 
+import com.supwisdom.dlpay.framework.util.Constants;
 import org.jose4j.jwa.AlgorithmConstraints;
 import org.jose4j.jwk.JsonWebKey;
 import org.jose4j.jws.AlgorithmIdentifiers;
@@ -13,7 +14,6 @@
 import org.springframework.security.core.userdetails.UserDetails;
 
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 public class JwtTokenUtil {
@@ -40,11 +40,14 @@
     if (params.get("subject") != null) {
       claims.setSubject(params.get("subject").toString()); // the subject/principal is whom the token is about
     }
-    if (params.get("authorities") != null) {
-      claims.setClaim("authorities", params.get("authorities"));
+    if (params.get(Constants.JWT_CLAIM_AUTHORITIES) != null) {
+      claims.setClaim(Constants.JWT_CLAIM_AUTHORITIES, params.get(Constants.JWT_CLAIM_AUTHORITIES));
     }
-    if(params.get("uid") != null) {
-      claims.setClaim("uid", params.get("uid"));
+    if (params.get(Constants.JWT_CLAIM_UID) != null) {
+      claims.setClaim(Constants.JWT_CLAIM_UID, params.get(Constants.JWT_CLAIM_UID));
+    }
+    if (params.get(Constants.JWT_CLAIM_TENANTID) != null) {
+      claims.setClaim(Constants.JWT_CLAIM_TENANTID, params.get(Constants.JWT_CLAIM_TENANTID));
     }
     /*
     claims.setClaim("email", "mail@example.com"); // additional claims/attributes about the subject can be added
@@ -81,7 +84,7 @@
         .setVerificationKey(key.getKey()) // verify the signature with the public key
         .setSkipDefaultAudienceValidation()
         .setJwsAlgorithmConstraints( // only allow the expected signature algorithm(s) in the given context
-            new AlgorithmConstraints(org.jose4j.jwa.AlgorithmConstraints.ConstraintType.WHITELIST, // which is only RS256 here
+            new AlgorithmConstraints(AlgorithmConstraints.ConstraintType.WHITELIST, // which is only RS256 here
                 AlgorithmIdentifiers.HMAC_SHA256))
         .build(); // create the JwtConsumer instance
 
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/DictionaryDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/DictionaryDao.java
index 05e15ea..e31166d 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/DictionaryDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/DictionaryDao.java
@@ -9,5 +9,5 @@
 
 @Repository
 public interface DictionaryDao extends JpaRepository<TDictionary, TDictionaryPK> {
-  List<TDictionary> findAllByDicttype(int dicttype);
+  List<TDictionary> findAllByDicttype(String dicttype);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java
index 27b511f..545af83 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/OperatorDao.java
@@ -1,11 +1,8 @@
 package com.supwisdom.dlpay.framework.dao;
 
 import com.supwisdom.dlpay.framework.domain.TOperator;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
 @Repository
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/PeriodDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/PeriodDao.java
deleted file mode 100644
index aa05bd7..0000000
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/PeriodDao.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.supwisdom.dlpay.framework.dao;
-
-import com.supwisdom.dlpay.framework.domain.TPeriod;
-import com.supwisdom.dlpay.framework.domain.TPeriodPK;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Lock;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.stereotype.Repository;
-
-import javax.persistence.LockModeType;
-
-@Repository
-public interface PeriodDao extends JpaRepository<TPeriod, TPeriodPK> {
-  @Query(value = "from TPeriod t where t.periodYear=:periodyear and t.periodMonth=:periodmonth ")
-  TPeriod getPeriod(@Param("periodyear") Integer periodyear, @Param("periodmonth") Integer periodmonth);
-
-  @Lock(LockModeType.PESSIMISTIC_WRITE)
-  @Query(value = "from TPeriod t where t.periodYear=:periodyear and t.periodMonth=:periodmonth ")
-  TPeriod getTPeriodWithLock(@Param("periodyear") Integer periodyear, @Param("periodmonth") Integer periodmonth);
-}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/RoleFunctionDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/RoleFunctionDao.java
index d1f2d37..15df54c 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/RoleFunctionDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/RoleFunctionDao.java
@@ -2,7 +2,6 @@
 
 import com.supwisdom.dlpay.framework.data.NodeData;
 import com.supwisdom.dlpay.framework.domain.TRoleFunction;
-import com.supwisdom.dlpay.system.bean.ZTreeNode;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
@@ -18,11 +17,12 @@
 
     List<TRoleFunction> findByRoleId(String roleId);
 
-    @Query(value = " select f.id||'' as id ,f.parentid||'' as pid,f.name,case when rf.id is null then 0 else 1 end as checked,case when f.parentid=-1 then 1 else 0 end as open from tb_function f " +
+    @Query(value = "select tt.id,tt.pid,tt.name,tt.checked,tt.open from  " +
+            " ( select f.id||'' as id ,f.parentid||'' as pid,f.name,case when rf.id is null then 0 else 1 end as checked,case when f.parentid=-1 then 1 else 0 end as open from tb_function f " +
             " left join tb_role_function rf on rf.functionid = f.id and rf.roleid=?1  " +
             " union all " +
             " select r.id||'_res' as id,r.function_id||'' as pid,r.name,case when p.id is null then 0 else 1 end as checked,0 as open from tb_resource  r " +
-            " left join tb_permission p on p.resid = r.id and p.roleid=?1 " , nativeQuery = true)
+            " left join tb_permission p on p.resid = r.id and p.roleid=?1 ) tt order by tt.id " , nativeQuery = true)
     List<NodeData> findByRoleIdNative(String roleId);
 
     void deleteByRoleId(String roleId);
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java
deleted file mode 100644
index ec8fadc..0000000
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.supwisdom.dlpay.framework.dao;
-
-import com.supwisdom.dlpay.framework.domain.TSettlectl;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Lock;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.stereotype.Repository;
-
-import javax.persistence.LockModeType;
-
-@Repository
-public interface SettleCtlDao extends JpaRepository<TSettlectl, Integer> {
-  @Lock(value = LockModeType.PESSIMISTIC_WRITE)
-  TSettlectl findByBooksetno(Integer booksetno);
-
-  @Lock(value = LockModeType.PESSIMISTIC_WRITE)
-  @Query(value = "from TSettlectl where booksetno=:booksetno ")
-  TSettlectl findByBooksetnoWithLock(@Param("booksetno") Integer booksetno);
-
-  @Modifying(clearAutomatically = true)
-  @Query(value = "update TB_SETTLECTL set PERIODYEAR=:peridyear,PERIODMONTH=:peridmonth where BOOKSETNO=1 ", nativeQuery = true)
-  void updateSettlePeriod(@Param("peridyear") int peridyear, @Param("peridmonth") int peridmonth);
-
-}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/TranscodeDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/TranscodeDao.java
deleted file mode 100644
index d40f266..0000000
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/TranscodeDao.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.supwisdom.dlpay.framework.dao;
-
-import com.supwisdom.dlpay.framework.domain.TTranscode;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public interface TranscodeDao extends JpaRepository<TTranscode, Integer> {
-}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java b/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java
index baaa274..b876d9d 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java
@@ -1,6 +1,6 @@
 package com.supwisdom.dlpay.framework.data;
 
-import java.util.Date;
+import java.sql.Timestamp;
 
 public interface SystemDateTime {
   String getHostdate();
@@ -9,5 +9,6 @@
 
   String getHostdatetime();
 
-  Date getSysdate();
+  Timestamp getSysdate();
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/ApiClientRedis.java b/src/main/java/com/supwisdom/dlpay/framework/domain/ApiClientRedis.java
index d7bb016..1be3460 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/ApiClientRedis.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/ApiClientRedis.java
@@ -15,6 +15,7 @@
 
   String loginTimestamp;
 
+
   public String getId() {
     return id;
   }
@@ -46,4 +47,5 @@
   public void setRoles(String roles) {
     this.roles = roles;
   }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/DictionaryTable.java b/src/main/java/com/supwisdom/dlpay/framework/domain/DictionaryTable.java
new file mode 100644
index 0000000..7d1d36a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/DictionaryTable.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.framework.domain;
+
+public interface DictionaryTable {
+  String getDictKey();
+
+  Object getDictValue();
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/JwtRedis.java b/src/main/java/com/supwisdom/dlpay/framework/domain/JwtRedis.java
index 01828e0..47ece23 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/JwtRedis.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/JwtRedis.java
@@ -4,7 +4,7 @@
 import org.springframework.data.redis.core.RedisHash;
 
 
-@RedisHash("api_jwt")
+@RedisHash(value = "api_jwt", timeToLive = 3600L)
 public class JwtRedis {
   @Id
   String jti;
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TApiClient.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TApiClient.java
index 385bff9..ac8eb1d 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TApiClient.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TApiClient.java
@@ -1,9 +1,12 @@
 package com.supwisdom.dlpay.framework.domain;
 
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
 
 @Entity
 @Table(name = "TB_APICLIENT")
@@ -21,6 +24,13 @@
   @Column(name = "roles", length = 300)
   private String roles;
 
+  @Column(name = "BCRYPT_SECRET", nullable = false, length = 64)
+  private String bcryptSecret;
+
+  @Column(name = "THIRDURL", length = 200)
+  private String thirdurl;
+
+
   public String getAppid() {
     return appid;
   }
@@ -35,6 +45,7 @@
 
   public void setSecret(String secret) {
     this.secret = secret;
+    this.bcryptSecret = new BCryptPasswordEncoder().encode(secret);
   }
 
   public String getStatus() {
@@ -52,4 +63,17 @@
   public void setRoles(String roles) {
     this.roles = roles;
   }
+
+  public String getBcryptSecret() {
+    return bcryptSecret;
+  }
+
+  public String getThirdurl() {
+    return thirdurl;
+  }
+
+  public void setThirdurl(String thirdurl) {
+    this.thirdurl = thirdurl;
+  }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TBusinesspara.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TBusinesspara.java
index 6c6691e..4a697c6 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TBusinesspara.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TBusinesspara.java
@@ -4,6 +4,7 @@
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
 
 @Entity
 @Table(name = "TB_BUSINESSPARA")
@@ -38,4 +39,5 @@
   public void setParaval(String paraval) {
     this.paraval = paraval;
   }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionary.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionary.java
index 461ef29..c838c3a 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionary.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionary.java
@@ -1,14 +1,16 @@
 package com.supwisdom.dlpay.framework.domain;
 
 import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
 
 @Entity
 @Table(name = "TB_DICTIONARY")
 @IdClass(TDictionaryPK.class)
-public class TDictionary {
+public class TDictionary implements DictionaryTable, Serializable {
   @Id
-  @Column(name = "DICTTYPE", nullable = false, precision = 9)
-  private Integer dicttype;
+  @Column(name = "DICTTYPE", nullable = false)
+  private String dicttype;
 
   @Id
   @Column(name = "DICTVAL", nullable = false, length = 30)
@@ -20,11 +22,11 @@
   @Column(name = "DICTCAPTION", length = 60)
   private String dictcaption;
 
-  public Integer getDicttype() {
+  public String getDicttype() {
     return dicttype;
   }
 
-  public void setDicttype(Integer dicttype) {
+  public void setDicttype(String dicttype) {
     this.dicttype = dicttype;
   }
 
@@ -51,4 +53,14 @@
   public void setDictcaption(String dictcaption) {
     this.dictcaption = dictcaption;
   }
+
+  @Override
+  public String getDictKey() {
+    return this.dictval;
+  }
+
+  @Override
+  public Object getDictValue() {
+    return this.dictcaption;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionaryPK.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionaryPK.java
index 04874e2..1dbb4c8 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionaryPK.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionaryPK.java
@@ -6,18 +6,18 @@
 
 public class TDictionaryPK implements Serializable {
   @Id
-  @Column(name = "DICTTYPE", nullable = false, precision = 9)
-  private Integer dicttype;
+  @Column(name = "DICTTYPE", nullable = false)
+  private String dicttype;
 
   @Id
   @Column(name = "DICTVAL", nullable = false, length = 30)
   private String dictval;
 
-  public Integer getDicttype() {
+  public String getDicttype() {
     return dicttype;
   }
 
-  public void setDicttype(Integer dicttype) {
+  public void setDicttype(String dicttype) {
     this.dicttype = dicttype;
   }
 
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java
index 2f3b83c..5d64c48 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java
@@ -1,38 +1,43 @@
 package com.supwisdom.dlpay.framework.domain;
 
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
 import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
 
 @Entity
 @Table(name = "TB_FUNCTION")
-@SequenceGenerator(name="SEQ_FUNC",sequenceName="SEQ_FUNC",allocationSize=1)
-public class TFunction {
+@JsonIgnoreProperties(value = {"hibernateLazyInitializer"})
+@SequenceGenerator(name = "SEQ_FUNC", sequenceName = "SEQ_FUNC", allocationSize = 1, initialValue = 1000)
+public class TFunction implements Serializable {
   @Id
-  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_FUNC")
-  @Column(name="ID", nullable = false)
+  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_FUNC")
+  @Column(name = "ID", nullable = false)
   private Integer id;
 
-  @Column(name="PARENTID")
+  @Column(name = "PARENTID")
   private Integer parentId;
 
-  @Column(name="NAME", length = 32)
+  @Column(name = "NAME", length = 32)
   private String name;
 
-  @Column(name="MENUURL", nullable = false, length = 60)
+  @Column(name = "MENUURL", nullable = false, length = 60)
   private String menuUrl; //菜单url
 
-  @Column(name="ISLEAF", nullable = false, precision = 1)
+  @Column(name = "ISLEAF", nullable = false, precision = 1)
   private Integer isLeaf;
 
-  @Column(name="ORDERNUM", precision = 9)
+  @Column(name = "ORDERNUM", precision = 9)
   private Integer orderNum;
 
-  @Column(name="MENUICON", precision = 9)
+  @Column(name = "MENUICON", precision = 9)
   private String menuIcon;
 
-  @Column(name="CREATETIME", length = 14)
+  @Column(name = "CREATETIME", length = 14)
   private String createtime;
 
-  @Column(name="LASTSAVED", length = 14)
+  @Column(name = "LASTSAVED", length = 14)
   private String lastsaved;
 
   public Integer getId() {
@@ -106,4 +111,5 @@
   public void setLastsaved(String lastsaved) {
     this.lastsaved = lastsaved;
   }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperLog.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperLog.java
index 1243efd..5c21e78 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperLog.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperLog.java
@@ -3,97 +3,99 @@
 import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.*;
+import javax.validation.constraints.NotNull;
 
 @Entity
 @Table(name = "TB_OPER_LOG")
 public class TOperLog {
-    @Id
-    @GenericGenerator(name = "idGenerator", strategy = "uuid")
-    @GeneratedValue(generator = "idGenerator")
-    @Column(name = "ID", nullable = false, length = 32)
-    private String id;
+  @Id
+  @GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @Column(name = "ID", nullable = false, length = 32)
+  private String id;
 
-    @Column(name = "OPERID", nullable = false, length = 32)
-    private String operid;
-    @Column(name = "OPERNAME")
-    private String opername;
+  @Column(name = "OPERID", nullable = false, length = 32)
+  private String operid;
+  @Column(name = "OPERNAME")
+  private String opername;
 
-    @Column(name = "RESNAME")
-    private String resname;
+  @Column(name = "RESNAME")
+  private String resname;
 
-    @Column(name = "RESPATH")
-    private String respath;
+  @Column(name = "RESPATH")
+  private String respath;
 
-    @Column(name = "LOGDATE")
-    private String logdate;
+  @Column(name = "LOGDATE")
+  private String logdate;
 
-    @Column(name = "FUNCTIONID")
-    private Integer functionid;
+  @Column(name = "FUNCTIONID")
+  private Integer functionid;
 
-    @Column(name = "FUNCTIONNAME")
-    private String functionname;
+  @Column(name = "FUNCTIONNAME")
+  private String functionname;
 
-    public Integer getFunctionid() {
-        return functionid;
-    }
+  public Integer getFunctionid() {
+    return functionid;
+  }
 
-    public void setFunctionid(Integer functionid) {
-        this.functionid = functionid;
-    }
+  public void setFunctionid(Integer functionid) {
+    this.functionid = functionid;
+  }
 
-    public String getFunctionname() {
-        return functionname;
-    }
+  public String getFunctionname() {
+    return functionname;
+  }
 
-    public void setFunctionname(String functionname) {
-        this.functionname = functionname;
-    }
+  public void setFunctionname(String functionname) {
+    this.functionname = functionname;
+  }
 
-    public String getId() {
-        return id;
-    }
+  public String getId() {
+    return id;
+  }
 
-    public void setId(String id) {
-        this.id = id;
-    }
+  public void setId(String id) {
+    this.id = id;
+  }
 
-    public String getOperid() {
-        return operid;
-    }
+  public String getOperid() {
+    return operid;
+  }
 
-    public void setOperid(String operid) {
-        this.operid = operid;
-    }
+  public void setOperid(String operid) {
+    this.operid = operid;
+  }
 
-    public String getOpername() {
-        return opername;
-    }
+  public String getOpername() {
+    return opername;
+  }
 
-    public void setOpername(String opername) {
-        this.opername = opername;
-    }
+  public void setOpername(String opername) {
+    this.opername = opername;
+  }
 
-    public String getResname() {
-        return resname;
-    }
+  public String getResname() {
+    return resname;
+  }
 
-    public void setResname(String resname) {
-        this.resname = resname;
-    }
+  public void setResname(String resname) {
+    this.resname = resname;
+  }
 
-    public String getRespath() {
-        return respath;
-    }
+  public String getRespath() {
+    return respath;
+  }
 
-    public void setRespath(String respath) {
-        this.respath = respath;
-    }
+  public void setRespath(String respath) {
+    this.respath = respath;
+  }
 
-    public String getLogdate() {
-        return logdate;
-    }
+  public String getLogdate() {
+    return logdate;
+  }
 
-    public void setLogdate(String logdate) {
-        this.logdate = logdate;
-    }
+  public void setLogdate(String logdate) {
+    this.logdate = logdate;
+  }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperRole.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperRole.java
index d17c273..14b510c 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperRole.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperRole.java
@@ -3,6 +3,7 @@
 import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.*;
+import javax.validation.constraints.NotNull;
 
 @Entity
 @Table(name = "TB_OPER_ROLE",
@@ -14,10 +15,12 @@
   @Column(name = "ID", nullable = false, length = 32)
   private String id;
 
-  @Column(name = "ROLEID", nullable = false, length = 32)
+  @Column(name = "ROLEID", length = 32)
+  @NotNull
   private String roleId;
 
-  @Column(name = "OPERID", nullable = false, length = 32)
+  @Column(name = "OPERID", length = 32)
+  @NotNull
   private String operid;
 
   public String getId() {
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
index cfcbeea..6c12879 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
@@ -6,6 +6,7 @@
 import org.springframework.security.core.userdetails.UserDetails;
 
 import javax.persistence.*;
+import javax.validation.constraints.NotNull;
 import java.util.Collection;
 
 @Entity
@@ -19,19 +20,24 @@
   @Column(name = "OPERID", nullable = false, length = 32)
   private String operid;
 
-  @Column(name = "OPERCODE", nullable = false, length = 20)
+  @Column(name = "OPERCODE", length = 20)
+  @NotNull
   private String opercode;
 
-  @Column(name = "OPERTYPE", nullable = false, length = 20)
+  @Column(name = "OPERTYPE", length = 20)
+  @NotNull
   private String opertype;
 
-  @Column(name = "OPERNAME", nullable = false, length = 100)
+  @Column(name = "OPERNAME", length = 100)
+  @NotNull
   private String opername;
 
-  @Column(name = "OPERPWD", nullable = false, length = 80)
+  @Column(name = "OPERPWD", length = 80)
+  @NotNull
   private String operpwd;
 
-  @Column(name = "STATUS", nullable = false, length = 32)
+  @Column(name = "STATUS", length = 32)
+  @NotNull
   private String status;
 
   @Column(name = "SEX", length = 10)
@@ -51,6 +57,11 @@
   @Transient
   private String roleids;
 
+
+  @Column(name = "thirdadmin", length = 20)
+  @NotNull
+  private String thirdadmin;
+
   @Transient
   private Collection<? extends GrantedAuthority> authorities;  //权限
 
@@ -210,4 +221,12 @@
   public void setRoleids(String roleids) {
     this.roleids = roleids;
   }
+
+  public String getThirdadmin() {
+    return thirdadmin;
+  }
+
+  public void setThirdadmin(String thirdadmin) {
+    this.thirdadmin = thirdadmin;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriod.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriod.java
deleted file mode 100644
index 4334eae..0000000
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriod.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package com.supwisdom.dlpay.framework.domain;
-
-import javax.persistence.*;
-
-@Entity
-@Table(name = "TB_PERIOD")
-@IdClass(TPeriodPK.class)
-public class TPeriod {
-  @Id
-  @Column(name="PERIOD_YEAR", nullable = false, precision = 4)
-  private Integer periodYear;
-
-  @Id
-  @Column(name="PERIOD_MONTH", nullable = false, precision = 2)
-  private Integer periodMonth;
-
-  @Column(name="STARTDATE", nullable = false, length = 8)
-  private String startdate;
-
-  @Column(name="ENDDATE", nullable = false, length = 8)
-  private String enddate;
-
-  @Column(name="SETTLEFLAG", nullable = false, precision = 1)
-  private Integer settleflag=0;
-
-  public Integer getPeriodYear() {
-    return periodYear;
-  }
-
-  public void setPeriodYear(Integer periodYear) {
-    this.periodYear = periodYear;
-  }
-
-  public Integer getPeriodMonth() {
-    return periodMonth;
-  }
-
-  public void setPeriodMonth(Integer periodMonth) {
-    this.periodMonth = periodMonth;
-  }
-
-  public String getStartdate() {
-    return startdate;
-  }
-
-  public void setStartdate(String startdate) {
-    this.startdate = startdate;
-  }
-
-  public String getEnddate() {
-    return enddate;
-  }
-
-  public void setEnddate(String enddate) {
-    this.enddate = enddate;
-  }
-
-  public Integer getSettleflag() {
-    return settleflag;
-  }
-
-  public void setSettleflag(Integer settleflag) {
-    this.settleflag = settleflag;
-  }
-}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriodPK.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriodPK.java
deleted file mode 100644
index e307db3..0000000
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriodPK.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.supwisdom.dlpay.framework.domain;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
-import java.io.Serializable;
-
-public class TPeriodPK implements Serializable {
-
-  @Id
-  @Column(name="PERIOD_YEAR", nullable = false, precision = 4)
-  private Integer periodYear;
-
-  @Id
-  @Column(name="PERIOD_MONTH", nullable = false, precision = 2)
-  private Integer periodMonth;
-
-  public Integer getPeriodYear() {
-    return periodYear;
-  }
-
-  public void setPeriodYear(Integer periodYear) {
-    this.periodYear = periodYear;
-  }
-
-  public Integer getPeriodMonth() {
-    return periodMonth;
-  }
-
-  public void setPeriodMonth(Integer periodMonth) {
-    this.periodMonth = periodMonth;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) return true;
-    if (o == null || getClass() != o.getClass()) return false;
-    TPeriodPK tPeriodPK = (TPeriodPK) o;
-    if (periodYear != null ? !periodYear.equals(tPeriodPK.getPeriodYear()) : periodYear != null)
-      return false;
-    if (periodMonth != null ? !periodMonth.equals(tPeriodPK.getPeriodMonth()) : periodMonth != null)
-      return false;
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = periodYear != null ? periodYear.hashCode() : 0;
-    result = 31 * result + (periodMonth != null ? periodMonth.hashCode() : 0);
-    return result;
-  }
-}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java
index f9a2368..be11862 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TPermission.java
@@ -3,54 +3,57 @@
 import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.*;
+import javax.validation.constraints.NotNull;
 
 @Entity
 @Table(name = "TB_PERMISSION")
 public class TPermission {
-    @Id
-    @GenericGenerator(name = "idGenerator", strategy = "uuid")
-    @GeneratedValue(generator = "idGenerator")
-    @Column(name = "ID", nullable = false, length = 32)
-    private String id;
+  @Id
+  @GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @Column(name = "ID", nullable = false, length = 32)
+  private String id;
 
-    @Column(name = "ROLE_FUNC_ID", length = 32)
-    private String roleFuncId;
+  @Column(name = "ROLE_FUNC_ID", length = 32)
+  private String roleFuncId;
 
-    @Column(name = "RESID")
-    private Integer resid;
+  @Column(name = "RESID")
+  @NotNull
+  private Integer resid;
 
-    @Column(name = "ROLEID",length = 32)
-    private String roleId;
+  @Column(name = "ROLEID", length = 32)
+  @NotNull
+  private String roleId;
 
-    public String getRoleId() {
-        return roleId;
-    }
+  public String getRoleId() {
+    return roleId;
+  }
 
-    public void setRoleId(String roleId) {
-        this.roleId = roleId;
-    }
+  public void setRoleId(String roleId) {
+    this.roleId = roleId;
+  }
 
-    public String getId() {
-        return id;
-    }
+  public String getId() {
+    return id;
+  }
 
-    public void setId(String id) {
-        this.id = id;
-    }
+  public void setId(String id) {
+    this.id = id;
+  }
 
-    public String getRoleFuncId() {
-        return roleFuncId;
-    }
+  public String getRoleFuncId() {
+    return roleFuncId;
+  }
 
-    public void setRoleFuncId(String roleFuncId) {
-        this.roleFuncId = roleFuncId;
-    }
+  public void setRoleFuncId(String roleFuncId) {
+    this.roleFuncId = roleFuncId;
+  }
 
-    public Integer getResid() {
-        return resid;
-    }
+  public Integer getResid() {
+    return resid;
+  }
 
-    public void setResid(Integer resid) {
-        this.resid = resid;
-    }
+  public void setResid(Integer resid) {
+    this.resid = resid;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
index 63044cb..71f4fc5 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
@@ -1,17 +1,19 @@
 package com.supwisdom.dlpay.framework.domain;
 
 import javax.persistence.*;
+import javax.validation.constraints.NotNull;
 
 @Entity
 @Table(name = "TB_RESOURCE")
-@SequenceGenerator(name="SEQ_RES",sequenceName="SEQ_RES",allocationSize=1)
+@SequenceGenerator(name = "SEQ_RES", sequenceName = "SEQ_RES", allocationSize = 1)
 public class TResource {
   @Id
-  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_RES")
-  @Column(name = "ID", nullable = false,length = 9)
+  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_RES")
+  @Column(name = "ID", nullable = false, length = 9)
   private Integer id;
 
-  @Column(name = "CODE", nullable = false, length = 32)
+  @Column(name = "CODE", length = 32)
+  @NotNull
   private String code;
 
   @Column(name = "NAME", length = 32)
@@ -20,7 +22,8 @@
   @Column(name = "URI", length = 32)
   private String uri;
 
-  @Column(name = "FUNCTION_ID", nullable = false, length = 32)
+  @Column(name = "FUNCTION_ID", length = 32)
+  @NotNull
   private Integer functionId;
 
   public Integer getId() {
@@ -62,4 +65,5 @@
   public void setFunctionId(Integer functionId) {
     this.functionId = functionId;
   }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TRole.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TRole.java
index 3112259..4f57b16 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TRole.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TRole.java
@@ -3,6 +3,7 @@
 import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.*;
+import javax.validation.constraints.NotNull;
 
 @Entity
 @Table(name = "TB_ROLE")
@@ -10,25 +11,29 @@
   @Id
   @GenericGenerator(name = "idGenerator", strategy = "uuid")
   @GeneratedValue(generator = "idGenerator")
-  @Column(name="ROLEID", nullable = false, length = 32)
+  @Column(name = "ROLEID", nullable = false, length = 32)
   private String roleId;
 
-  @Column(name="ROLENAME", nullable = false, length = 60)
+  @Column(name = "ROLENAME", length = 60)
+  @NotNull
   private String roleName;
 
-  @Column(name="ROLECODE", nullable = false, length = 20)
+  @Column(name = "ROLECODE", length = 20)
+  @NotNull
   private String roleCode;
 
-  @Column(name="ROLEDESC", length = 60)
+  @Column(name = "ROLEDESC", length = 60)
   private String roleDesc;
 
-  @Column(name="EDITFLAG", length = 60)
+  @Column(name = "EDITFLAG", length = 60)
+  @NotNull
   private Integer editflag;
 
-  @Column(name="CREATETIME", length = 14)
+  @Column(name = "CREATETIME", length = 14)
+  @NotNull
   private String createtime;
 
-  @Column(name="LASTSAVED", length = 14)
+  @Column(name = "LASTSAVED", length = 14)
   private String lastsaved;
 
   public String getRoleId() {
@@ -86,4 +91,5 @@
   public void setLastsaved(String lastsaved) {
     this.lastsaved = lastsaved;
   }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TRoleFunction.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TRoleFunction.java
index c5e9f05..6c34f5a 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TRoleFunction.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TRoleFunction.java
@@ -3,6 +3,7 @@
 import org.hibernate.annotations.GenericGenerator;
 
 import javax.persistence.*;
+import javax.validation.constraints.NotNull;
 
 @Entity
 @Table(name = "TB_ROLE_FUNCTION")
@@ -10,16 +11,18 @@
   @Id
   @GenericGenerator(name = "idGenerator", strategy = "uuid")
   @GeneratedValue(generator = "idGenerator")
-  @Column(name="ID", nullable = false, length = 32)
+  @Column(name = "ID", nullable = false, length = 32)
   private String id;
 
-  @Column(name="ROLEID", nullable = false, length = 32)
+  @Column(name = "ROLEID", length = 32)
+  @NotNull
   private String roleId;
 
-  @Column(name="FUNCTIONID", nullable = false, length = 32)
+  @Column(name = "FUNCTIONID", length = 32)
+  @NotNull
   private Integer functionId;
 
-  @Column(name="PERMISSIONS", length = 200)
+  @Column(name = "PERMISSIONS", length = 200)
   private String permissions;
 
   public String getId() {
@@ -53,4 +56,5 @@
   public void setPermissions(String permissions) {
     this.permissions = permissions;
   }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java
deleted file mode 100644
index 73dbf10..0000000
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package com.supwisdom.dlpay.framework.domain;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-@Entity
-@Table(name = "TB_SETTLECTL")
-public class TSettlectl {
-  @Id
-  @Column(name="BOOKSETNO", nullable = false, precision = 2)
-  private Integer booksetno;
-
-  @Column(name="PERIODYEAR", nullable = false, precision = 4)
-  private Integer periodYear;
-
-  @Column(name="PERIODMONTH", nullable = false, precision = 2)
-  private Integer periodMonth;
-
-  @Column(name="STATDATE", precision = 8)
-  private Integer statdate;
-
-  @Column(name="SETTLEDATE",nullable = false, precision = 8)
-  private Integer settledate;
-
-  @Column(name="STATUS", nullable = false, precision = 1)
-  private Integer status;
-
-  @Column(name="UPDTIME", length = 14)
-  private String updtime;
-
-  public Integer getBooksetno() {
-    return booksetno;
-  }
-
-  public void setBooksetno(Integer booksetno) {
-    this.booksetno = booksetno;
-  }
-
-  public Integer getPeriodYear() {
-    return periodYear;
-  }
-
-  public void setPeriodYear(Integer periodYear) {
-    this.periodYear = periodYear;
-  }
-
-  public Integer getPeriodMonth() {
-    return periodMonth;
-  }
-
-  public void setPeriodMonth(Integer periodMonth) {
-    this.periodMonth = periodMonth;
-  }
-
-  public Integer getStatdate() {
-    return statdate;
-  }
-
-  public void setStatdate(Integer statdate) {
-    this.statdate = statdate;
-  }
-
-  public Integer getSettledate() {
-    return settledate;
-  }
-
-  public void setSettledate(Integer settledate) {
-    this.settledate = settledate;
-  }
-
-  public Integer getStatus() {
-    return status;
-  }
-
-  public void setStatus(Integer status) {
-    this.status = status;
-  }
-
-  public String getUpdtime() {
-    return updtime;
-  }
-
-  public void setUpdtime(String updtime) {
-    this.updtime = updtime;
-  }
-}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TSyspara.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TSyspara.java
index 50cd0f7..1c57336 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TSyspara.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TSyspara.java
@@ -9,6 +9,7 @@
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
 
 @Entity
 @Table(name = "TB_SYSPARA")
@@ -29,16 +30,19 @@
   @Column(name = "VALUETYPE", length = 10)
   private String valueType = SysparaUtil.SYSPARA_VALUETYPE_STRING;
 
-  @Column(name = "EDITFLAG", nullable = false, precision = 1)
+  @Column(name = "EDITFLAG", precision = 1)
+  @NotNull
   private Integer editflag;
 
   @Column(name = "DISPLAYFLAG", length = 10)
+  @NotNull
   private String displayflag;
 
   @Column(name = "REMARK", length = 240)
   private String remark;
 
   @Column(name = "LASTSAVED", length = 14)
+  @NotNull
   private String lastsaved;
 
   public TSyspara() {
@@ -135,6 +139,7 @@
 
   /**
    * 判断参数是否非法
+   *
    * @return 非法 -> true; 合法 -> false
    */
   public boolean checkValueInvalid() {
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TTaskLock.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TTaskLock.java
index 72912c7..c3b29be 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TTaskLock.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TTaskLock.java
@@ -5,6 +5,7 @@
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
 
 @Entity
 @Table(name = "TB_TASK_LOCK")
@@ -22,6 +23,7 @@
   @Column(name="REMARK", length = 600)
   private String remark;
 
+
   public String getTaskcode() {
     return taskcode;
   }
@@ -53,4 +55,5 @@
   public void setRemark(String remark) {
     this.remark = remark;
   }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TTranscode.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TTranscode.java
deleted file mode 100644
index f4bb2f0..0000000
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TTranscode.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.supwisdom.dlpay.framework.domain;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-@Entity
-@Table(name = "TB_TRANSCODE")
-public class TTranscode {
-  @Id
-  @Column(name="TRANSCODE", nullable = false, precision = 4)
-  private Integer transcode;
-
-  @Column(name="TRANSNAME", nullable = false, length = 100)
-  private String transname;
-
-  public Integer getTranscode() {
-    return transcode;
-  }
-
-  public void setTranscode(Integer transcode) {
-    this.transcode = transcode;
-  }
-
-  public String getTransname() {
-    return transname;
-  }
-
-  public void setTransname(String transname) {
-    this.transname = transname;
-  }
-}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java b/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java
new file mode 100644
index 0000000..eafa20c
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/filter/CrosXssFilter.java
@@ -0,0 +1,54 @@
+package com.supwisdom.dlpay.framework.filter;
+
+import com.google.gson.Gson;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.*;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+
+@WebFilter
+public class CrosXssFilter implements Filter {
+  private static final Logger logger = LoggerFactory.getLogger(CrosXssFilter.class);
+
+  @Override
+  public void init(FilterConfig filterConfig) throws ServletException {
+
+  }
+
+  @Override
+  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+    request.setCharacterEncoding("utf-8");
+
+    //跨域设置
+//    if(response instanceof HttpServletResponse){
+//      HttpServletResponse httpServletResponse=(HttpServletResponse)response;
+//      //通过在响应 header 中设置 ‘*’ 来允许来自所有域的跨域请求访问。
+//      httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
+//      //通过对 Credentials 参数的设置，就可以保持跨域 Ajax 时的 Cookie
+//      //设置了Allow-Credentials，Allow-Origin就不能为*,需要指明具体的url域
+//      //httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
+//      //请求方式
+//      httpServletResponse.setHeader("Access-Control-Allow-Methods", "*");
+//      //（预检请求）的返回结果（即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息） 可以被缓存多久
+//      httpServletResponse.setHeader("Access-Control-Max-Age", "86400");
+//      //首部字段用于预检请求的响应。其指明了实际请求中允许携带的首部字段
+//      httpServletResponse.setHeader("Access-Control-Allow-Headers", "*");
+//    }
+
+    //sql,xss过滤
+    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+    logger.info("CrosXssFilter.......orignal url:{},ParameterMap:{}",httpServletRequest.getRequestURI(), new Gson().toJson(httpServletRequest.getParameterMap()));
+    XssHttpServletRequestWrapper xssHttpServletRequestWrapper = new XssHttpServletRequestWrapper(
+        httpServletRequest);
+    chain.doFilter(xssHttpServletRequestWrapper, response);
+    logger.info("CrosXssFilter..........doFilter url:{},ParameterMap:{}",xssHttpServletRequestWrapper.getRequestURI(), new Gson().toJson(xssHttpServletRequestWrapper.getParameterMap()));
+  }
+
+  @Override
+  public void destroy() {
+
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java b/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java
old mode 100755
new mode 100644
index 491a2e0..c58260d
--- a/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/filter/ValidateCodeFilter.java
@@ -1,98 +1,92 @@
-package com.supwisdom.dlpay.framework.filter;
-
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.supwisdom.dlpay.api.bean.JsonResult;
-import com.supwisdom.dlpay.exception.ValidateCodeException;
-import com.supwisdom.dlpay.framework.security.validate.ImageCodeUtil;
-import com.supwisdom.dlpay.framework.security.validate.VerifyCode;
-import com.supwisdom.dlpay.framework.util.StringUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.security.web.authentication.AuthenticationFailureHandler;
-import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
-import org.springframework.stereotype.Component;
-import org.springframework.web.filter.OncePerRequestFilter;
-
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-
-@Component("validateCodeFilter")
-public class ValidateCodeFilter extends OncePerRequestFilter{
-
-	/**
-	 * 校验失败处理器
-	 */
-	@Autowired
-	private AuthenticationFailureHandler myAuthenticationFailureHandler;
-
-	/**
-	 * 校验成功处理器
-	 */
-	@Autowired
-	private AuthenticationSuccessHandler myAuthenticationSuccessHandler;
-	@Autowired
-	private ObjectMapper objectMapper;
-
-
-	@Override
-	protected void doFilterInternal(HttpServletRequest request,
-																	HttpServletResponse response, FilterChain filterChain)
-			throws ServletException, IOException {
-		String context = request.getContextPath();
-		if (context == null || "" == context.trim()) {
-			context = "/";
-		}
-		if (request.getRequestURI().isEmpty()) {
-			filterChain.doFilter(request, response);
-			return;
-		}
-		String url = request.getRequestURI();
-		if (!"/".equals(context)) {
-			url = url.replace(context, "");
-		}
-		if (StringUtil.equals("/login/form", url)
-				&& StringUtil.equalsIgnoreCase(request.getMethod(), "post")) {
-			try {
-				validate(request);
-			} catch (ValidateCodeException e) {
-				//response.setStatus(HttpStatus.OK.value());
-				//response.setContentType("application/json;charset=UTF-8");
-				//response.getWriter().write(objectMapper.writeValueAsString(JsonResult.error(400, e.getMessage())));
-				//response.sendError(HttpStatus.UNAUTHORIZED.value(),e.getMessage());
-				myAuthenticationFailureHandler.onAuthenticationFailure(request, response, e);
-				return;
-			}
-		}
-		filterChain.doFilter(request, response);
-	}
-
-	private void validate(HttpServletRequest request) throws ValidateCodeException {
-		VerifyCode imageCode = (VerifyCode) request.getSession().getAttribute(ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY);
-		String inputCode;
-		try {
-			inputCode = request.getParameter("imageCode");
-		} catch (Exception e) {
-			throw new ValidateCodeException("获取验证码的值失败");
-		}
-		if (StringUtil.isEmpty(inputCode)) {
-			throw new ValidateCodeException("验证码不能为空");
-		}
-		if (null == imageCode) {
-			throw new ValidateCodeException("验证码不存在");
-		}
-		if (imageCode.isExpired()) {
-			request.getSession().removeAttribute(ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY);
-			throw new ValidateCodeException("验证码已过期");
-		}
-		if (!StringUtil.equalsIgnoreCase(imageCode.getText(), inputCode)) {
-			throw new ValidateCodeException("验证码不匹配");
-		}
-		request.getSession().removeAttribute(ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY);
-	}
-
-}
+package com.supwisdom.dlpay.framework.filter;
+
+
+import com.supwisdom.dlpay.exception.ValidateCodeException;
+import com.supwisdom.dlpay.framework.security.CodeUtil;
+import com.supwisdom.dlpay.framework.security.MyAuthenticationFailureHandler;
+import com.supwisdom.dlpay.framework.security.validate.ImageCodeUtil;
+import com.supwisdom.dlpay.framework.security.validate.VerifyCode;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+
+@Component("validateCodeFilter")
+public class ValidateCodeFilter extends OncePerRequestFilter {
+
+  /**
+   * 校验失败处理器
+   */
+  @Autowired
+  private MyAuthenticationFailureHandler myAuthenticationFailureHandler;
+
+
+  @Override
+  protected void doFilterInternal(HttpServletRequest request,
+                                  HttpServletResponse response, FilterChain filterChain)
+      throws ServletException, IOException {
+    String context = request.getContextPath();
+    if (context == null || "" == context.trim()) {
+      context = "/";
+    }
+    if (request.getRequestURI().isEmpty()) {
+      filterChain.doFilter(request, response);
+      return;
+    }
+    String url = request.getRequestURI();
+    if (!"/".equals(context)) {
+      url = url.replace(context, "");
+    }
+    if (StringUtil.equals("/login/form", url)
+        && StringUtil.equalsIgnoreCase(request.getMethod(), "post")) {
+      try {
+        validate(request);
+      } catch (ValidateCodeException e) {
+        //response.setStatus(HttpStatus.OK.value());
+        //response.setContentType("application/json;charset=UTF-8");
+        //response.getWriter().write(objectMapper.writeValueAsString(JsonResult.error(400, e.getMessage())));
+        //response.sendError(HttpStatus.UNAUTHORIZED.value(),e.getMessage());
+        myAuthenticationFailureHandler.onAuthenticationFailure(request, response, e);
+        return;
+      }
+    }
+    filterChain.doFilter(request, response);
+  }
+
+  private void validate(HttpServletRequest request) throws ValidateCodeException {
+    if (!CodeUtil.checkVerifyCode(request)) {
+      throw new ValidateCodeException("验证码不匹配");
+    } else {
+      request.getSession().removeAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
+    }
+//    VerifyCode imageCode = (VerifyCode) request.getSession().getAttribute(ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY);
+//    String inputCode;
+//    try {
+//      inputCode = request.getParameter("imageCode");
+//    } catch (Exception e) {
+//      throw new ValidateCodeException("获取验证码的值失败");
+//    }
+//    if (StringUtil.isEmpty(inputCode)) {
+//      throw new ValidateCodeException("验证码不能为空");
+//    }
+//    if (null == imageCode) {
+//      throw new ValidateCodeException("验证码不存在");
+//    }
+//    if (imageCode.isExpired()) {
+//      request.getSession().removeAttribute(ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY);
+//      throw new ValidateCodeException("验证码已过期");
+//    }
+//    if (!StringUtil.equalsIgnoreCase(imageCode.getText(), inputCode)) {
+//      throw new ValidateCodeException("验证码不匹配");
+//    }
+//    request.getSession().removeAttribute(ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY);
+  }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/filter/XssHttpServletRequestWrapper.java b/src/main/java/com/supwisdom/dlpay/framework/filter/XssHttpServletRequestWrapper.java
new file mode 100644
index 0000000..ddc4d15
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/filter/XssHttpServletRequestWrapper.java
@@ -0,0 +1,130 @@
+package com.supwisdom.dlpay.framework.filter;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 防止sql注入,xss攻击
+ * */
+public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
+  private final static Logger log = LoggerFactory.getLogger(XssHttpServletRequestWrapper.class);
+  private final static String key = "'|and|exec|execute|insert|select|delete|update|count|drop|%|chr|mid|master|truncate|" +
+      "char|declare|sitename|net user|xp_cmdshell|;|or|-|+|,|like'|and|exec|execute|insert|create|drop|" +
+      "table|from|grant|use|group_concat|column_name|" +
+      "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|" +
+      "chr|mid|master|truncate|char|declare|or|;|-|--|,|like|//|/|%|#";
+  private static Set<String> notAllowedKeyWords = new HashSet<String>(0);
+  private static String replacedString="INVALID";
+  static {
+    String keyStr[] = key.split("\\|");
+    for (String str : keyStr) {
+      notAllowedKeyWords.add(str);
+    }
+  }
+
+  private String currentUrl;
+
+  /**
+   * Constructs a request object wrapping the given request.
+   *
+   * @param request the {@link HttpServletRequest} to be wrapped.
+   * @throws IllegalArgumentException if the request is null
+   */
+  public XssHttpServletRequestWrapper(HttpServletRequest request) {
+    super(request);
+    currentUrl = request.getRequestURI();
+  }
+
+  /**覆盖getParameter方法，将参数名和参数值都做xss过滤。
+   * 如果需要获得原始的值，则通过super.getParameterValues(name)来获取
+   * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
+   */
+  @Override
+  public String getParameter(String parameter) {
+    String value = super.getParameter(parameter);
+    if (value == null) {
+      return null;
+    }
+    return cleanXSS(value);
+  }
+  @Override
+  public String[] getParameterValues(String parameter) {
+    String[] values = super.getParameterValues(parameter);
+    if (values == null) {
+      return null;
+    }
+    int count = values.length;
+    String[] encodedValues = new String[count];
+    for (int i = 0; i < count; i++) {
+      encodedValues[i] = cleanXSS(values[i]);
+    }
+    return encodedValues;
+  }
+
+  @Override
+  public Map<String, String[]> getParameterMap(){
+    Map<String, String[]> values=super.getParameterMap();
+    if (values == null) {
+      return null;
+    }
+    Map<String, String[]> result=new HashMap<>();
+    for(String key:values.keySet()){
+      String encodedKey=cleanXSS(key);
+      int count=values.get(key).length;
+      String[] encodedValues = new String[count];
+      for (int i = 0; i < count; i++){
+        encodedValues[i]=cleanXSS(values.get(key)[i]);
+      }
+      result.put(encodedKey,encodedValues);
+    }
+    return result;
+  }
+
+  /**
+   * 覆盖getHeader方法，将参数名和参数值都做xss过滤。
+   * 如果需要获得原始的值，则通过super.getHeaders(name)来获取
+   * getHeaderNames 也可能需要覆盖
+   */
+  @Override
+  public String getHeader(String name) {
+    String value = super.getHeader(name);
+    if (value == null) {
+      return null;
+    }
+    return cleanXSS(value);
+  }
+
+  private String cleanXSS(String valueP) {
+    // You'll need to remove the spaces from the html entities below
+    String value = valueP.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
+    value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
+    value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
+    value = value.replaceAll("'", "& #39;");
+    value = value.replaceAll("eval\\((.*)\\)", "");
+    value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
+    value = value.replaceAll("script", "");
+    value = cleanSqlKeyWords(value);
+    return value;
+  }
+
+  private String cleanSqlKeyWords(String value) {
+    String paramValue = value;
+    for (String keyword : notAllowedKeyWords) {
+      if (paramValue.length() > keyword.length() + 4
+          && (paramValue.contains(" "+keyword)||paramValue.contains(keyword+" ")||paramValue.contains(" "+keyword+" "))) {
+        paramValue = StringUtils.replace(paramValue, keyword, replacedString);
+        log.error(this.currentUrl + "已被过滤，因为参数中包含不允许sql的关键词(" + keyword
+            + ")"+";参数："+value+";过滤后的参数："+paramValue);
+      }
+    }
+    return paramValue;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/CodeUtil.java b/src/main/java/com/supwisdom/dlpay/framework/security/CodeUtil.java
new file mode 100644
index 0000000..ef3b475
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/security/CodeUtil.java
@@ -0,0 +1,45 @@
+package com.supwisdom.dlpay.framework.security;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class CodeUtil {
+  /**
+   * 将获取到的前端参数转为string类型
+   *
+   * @param request
+   * @param key
+   * @return
+   */
+  public static String getString(HttpServletRequest request, String key) {
+    try {
+      String result = request.getParameter(key);
+      if (result != null) {
+        result = result.trim();
+      }
+      if ("".equals(result)) {
+        result = null;
+      }
+      return result;
+    } catch (Exception e) {
+      return null;
+    }
+  }
+
+  /**
+   * 验证码校验
+   *
+   * @param request
+   * @return
+   */
+  public static boolean checkVerifyCode(HttpServletRequest request) {
+    //获取生成的验证码
+    String verifyCodeExpected = (String) request.getSession()
+        .getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
+    //获取用户输入的验证码
+    String verifyCodeActual = CodeUtil.getString(request, "verifyCodeActual");
+    if (verifyCodeActual == null || !verifyCodeActual.equals(verifyCodeExpected)) {
+      return false;
+    }
+    return true;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java b/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java
index 02dbce4..f1b65a8 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/security/MyPermissionEvaluator.java
@@ -2,70 +2,68 @@
 
 import com.supwisdom.dlpay.framework.domain.*;
 import com.supwisdom.dlpay.framework.util.DateUtil;
-import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.system.service.FunctionService;
 import com.supwisdom.dlpay.system.service.OperatorService;
 import com.supwisdom.dlpay.system.service.RoleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.PermissionEvaluator;
 import org.springframework.security.core.Authentication;
-import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.stereotype.Component;
 
 import java.io.Serializable;
-import java.util.Collection;
 import java.util.List;
 
 @Component
 public class MyPermissionEvaluator implements PermissionEvaluator {
-    @Autowired
-    private RoleService roleService;
-    @Autowired
-    private OperatorService operatorService;
-    @Autowired
-    private FunctionService functionService;
-    @Override
-    public boolean hasPermission(Authentication authentication, Object targetUri, Object permission) {
-        //TODO save logger
-        if (targetUri != null) {
-            UserDetails userDetails = (UserDetails) authentication.getPrincipal();
-            if (userDetails != null) {
-                TOperator operator = operatorService.getOperatorByCode(userDetails.getUsername());
-                if (operator != null) {
-                    List<TOperRole> operRoles = operatorService.getOperRoleByOperId(operator.getOperid());
-                    for (TOperRole operRole : operRoles) {
-                        TRole role = roleService.findRoleByRoleid(operRole.getRoleId());
-                        if (role != null) {
-                            TResource resource = roleService.findResourceByURI(String.valueOf(targetUri));
-                            if (resource != null) {
-                                TPermission permission1 = roleService.findByRoleIdAndResid(role.getRoleId(), resource.getId());
-                                if (permission1 != null) {
-                                    TOperLog log = new TOperLog();
-                                    log.setLogdate(DateUtil.getNow());
-                                    log.setOperid(operator.getOperid());
-                                    log.setOpername(operator.getOpercode());
-                                    log.setResname(resource.getName());
-                                    log.setRespath(resource.getUri());
-                                    TFunction function  =functionService.getFunctionById(resource.getFunctionId());
-                                    if(function!=null){
-                                        log.setFunctionid(function.getId());
-                                        log.setFunctionname(function.getName());
-                                    }
-                                    operatorService.saveOperLog(log);
-                                    return true;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return false;
-    }
+  @Autowired
+  private RoleService roleService;
+  @Autowired
+  private OperatorService operatorService;
+  @Autowired
+  private FunctionService functionService;
 
-    @Override
-    public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
-        return false;
+  @Override
+  public boolean hasPermission(Authentication authentication, Object targetUri, Object permission) {
+    //TODO save logger
+    if (targetUri != null) {
+      UserDetails userDetails = (UserDetails) authentication.getPrincipal();
+      if (userDetails != null) {
+        TOperator operator = operatorService.getOperatorByCode(userDetails.getUsername());
+        if (operator != null) {
+          List<TOperRole> operRoles = operatorService.getOperRoleByOperId(operator.getOperid());
+          for (TOperRole operRole : operRoles) {
+            TRole role = roleService.findRoleByRoleid(operRole.getRoleId());
+            if (role != null) {
+              TResource resource = roleService.findResourceByURI(String.valueOf(targetUri));
+              if (resource != null) {
+                TPermission permission1 = roleService.findByRoleIdAndResid(role.getRoleId(), resource.getId());
+                if (permission1 != null) {
+                  TOperLog log = new TOperLog();
+                  log.setLogdate(DateUtil.getNow());
+                  log.setOperid(operator.getOperid());
+                  log.setOpername(operator.getOpercode());
+                  log.setResname(resource.getName());
+                  log.setRespath(resource.getUri());
+                  TFunction function = functionService.getFunctionById(resource.getFunctionId());
+                  if (function != null) {
+                    log.setFunctionid(function.getId());
+                    log.setFunctionname(function.getName());
+                  }
+                  operatorService.saveOperLog(log);
+                  return true;
+                }
+              }
+            }
+          }
+        }
+      }
     }
+    return false;
+  }
+
+  @Override
+  public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
+    return false;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/OperUtil.java b/src/main/java/com/supwisdom/dlpay/framework/security/OperUtil.java
index d576b41..4dd8c9e 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/security/OperUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/security/OperUtil.java
@@ -1,68 +1,68 @@
-package com.supwisdom.dlpay.framework.security;
-
-import com.supwisdom.dlpay.framework.domain.TOperator;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.context.SecurityContextHolder;
-
-import java.util.Collection;
-
-public class OperUtil {
-
-  public static TOperator getCurrentOper() {
-    Authentication au = SecurityContextHolder.getContext()
-        .getAuthentication();
-    if (au == null)
-      return null;
-    if (au.getPrincipal() == null)
-      return null;
-    if (au != null && au.getPrincipal() instanceof TOperator) {
-      return (TOperator) au.getPrincipal();
-    } else {
-      TOperator oper = new TOperator();
-      oper.setOpername(au.getPrincipal().toString());
-      oper.setOperpwd(au.getCredentials() == null ? null : au
-          .getCredentials().toString());
-      return oper;
-    }
-  }
-
-  public static String getCurrentOperid() {
-    TOperator oper = getCurrentOper();
-    if (oper == null)
-      return null;
-    return oper.getOperid() == null ? oper.getOpercode() : oper.getOperid();
-  }
-
-  public static boolean isLogined() {
-    Authentication au = SecurityContextHolder.getContext()
-        .getAuthentication();
-    if (au == null)
-      return false;
-    if (au.getPrincipal() == null)
-      return false;
-    if (au.getPrincipal() instanceof TOperator)
-      return true;
-    return false;
-  }
-
-  public static boolean isAdmin() {
-    TOperator loginOper = OperUtil.getCurrentOper();
-    if (loginOper != null) {
-      Collection<? extends GrantedAuthority> gas = loginOper.getAuthorities();
-      if (gas == null) {
-        return false;
-      }
-      boolean flag = false;
-      for (GrantedAuthority grantedAuthority : gas) {
-        if ("ROLE_ADMIN".equals(grantedAuthority.getAuthority())) {
-          flag = true;
-        }
-      }
-      return flag;
-    } else {
-      return false;
-    }
-  }
-
-}
+package com.supwisdom.dlpay.framework.security;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+import java.util.Collection;
+
+public class OperUtil {
+
+  public static TOperator getCurrentOper() {
+    Authentication au = SecurityContextHolder.getContext()
+        .getAuthentication();
+    if (au == null)
+      return null;
+    if (au.getPrincipal() == null)
+      return null;
+    if (au != null && au.getPrincipal() instanceof TOperator) {
+      return (TOperator) au.getPrincipal();
+    } else {
+      TOperator oper = new TOperator();
+      oper.setOpername(au.getPrincipal().toString());
+      oper.setOperpwd(au.getCredentials() == null ? null : au
+          .getCredentials().toString());
+      return oper;
+    }
+  }
+
+  public static String getCurrentOperid() {
+    TOperator oper = getCurrentOper();
+    if (oper == null)
+      return null;
+    return oper.getOperid() == null ? oper.getOpercode() : oper.getOperid();
+  }
+
+  public static boolean isLogined() {
+    Authentication au = SecurityContextHolder.getContext()
+        .getAuthentication();
+    if (au == null)
+      return false;
+    if (au.getPrincipal() == null)
+      return false;
+    if (au.getPrincipal() instanceof TOperator)
+      return true;
+    return false;
+  }
+
+  public static boolean isAdmin() {
+    TOperator loginOper = OperUtil.getCurrentOper();
+    if (loginOper != null) {
+      Collection<? extends GrantedAuthority> gas = loginOper.getAuthorities();
+      if (gas == null) {
+        return false;
+      }
+      boolean flag = false;
+      for (GrantedAuthority grantedAuthority : gas) {
+        if ("ROLE_ADMIN".equals(grantedAuthority.getAuthority())) {
+          flag = true;
+        }
+      }
+      return flag;
+    } else {
+      return false;
+    }
+  }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/ValidateCodeSecurityConfig.java b/src/main/java/com/supwisdom/dlpay/framework/security/ValidateCodeSecurityConfig.java
index 56782db..22405b0 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/security/ValidateCodeSecurityConfig.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/security/ValidateCodeSecurityConfig.java
@@ -1,7 +1,5 @@
 package com.supwisdom.dlpay.framework.security;
 
-import javax.servlet.Filter;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -9,9 +7,11 @@
 import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
 import org.springframework.stereotype.Component;
 
+import javax.servlet.Filter;
+
 @Component("validateCodeSecurityConfig")
 public class ValidateCodeSecurityConfig  extends SecurityConfigurerAdapter<DefaultSecurityFilterChain,HttpSecurity> {
-	
+
 	@Autowired
 	private Filter validateCodeFilter;
 
diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/validate/ImageCode.java b/src/main/java/com/supwisdom/dlpay/framework/security/validate/ImageCode.java
old mode 100755
new mode 100644
index 6b56ca8..d88d3af
--- a/src/main/java/com/supwisdom/dlpay/framework/security/validate/ImageCode.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/security/validate/ImageCode.java
@@ -1,21 +1,21 @@
-package com.supwisdom.dlpay.framework.security.validate;
-
-import java.awt.image.BufferedImage;
-
-public class ImageCode extends ValidateCode {
-	private BufferedImage image;
-
-	public ImageCode(BufferedImage image, String code, int expireTime) {
-		super(code, expireTime);
-		this.image = image;
-	}
-
-	public BufferedImage getImage() {
-		return image;
-	}
-
-	public void setImage(BufferedImage image) {
-		this.image = image;
-	}
-
-}
+package com.supwisdom.dlpay.framework.security.validate;
+
+import java.awt.image.BufferedImage;
+
+public class ImageCode extends ValidateCode {
+	private BufferedImage image;
+
+	public ImageCode(BufferedImage image, String code, int expireTime) {
+		super(code, expireTime);
+		this.image = image;
+	}
+
+	public BufferedImage getImage() {
+		return image;
+	}
+
+	public void setImage(BufferedImage image) {
+		this.image = image;
+	}
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/validate/ValidateCode.java b/src/main/java/com/supwisdom/dlpay/framework/security/validate/ValidateCode.java
old mode 100755
new mode 100644
index b20eca2..5580d49
--- a/src/main/java/com/supwisdom/dlpay/framework/security/validate/ValidateCode.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/security/validate/ValidateCode.java
@@ -1,55 +1,56 @@
-package com.supwisdom.dlpay.framework.security.validate;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.supwisdom.dlpay.framework.util.DateUtil;
-import java.util.Date;
-
-
-public class ValidateCode{
-
-	private String code;
-	
-	private Date expireTime;
-
-	public ValidateCode() {
-		super();
-	}
-
-	public ValidateCode(String code, Date expireTime) {
-		super();
-		this.code = code;
-		this.expireTime = expireTime;
-	}
-
-	public ValidateCode(String code, int expireTime) {
-		super();
-		this.code = code;
-		this.expireTime = DateUtil.setMinutes(new Date(), expireTime);
-	}
-
-	public String getCode() {
-		return code;
-	}
-
-	public void setCode(String code) {
-		this.code = code;
-	}
-
-	public Date getExpireTime() {
-		return expireTime;
-	}
-
-	public void setExpireTime(Date expireTime) {
-		this.expireTime = expireTime;
-	}
-
-	@JsonIgnore
-	public boolean isExpired() {
-		return new Date().compareTo(expireTime) > 0;
-	}
-
-	@Override
-	public String toString() {
-		return "ValidateCode [code=" + code + ", expireTime=" + expireTime + "]";
-	}
-}
+package com.supwisdom.dlpay.framework.security.validate;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+
+import java.util.Date;
+
+
+public class ValidateCode{
+
+	private String code;
+	
+	private Date expireTime;
+
+	public ValidateCode() {
+		super();
+	}
+
+	public ValidateCode(String code, Date expireTime) {
+		super();
+		this.code = code;
+		this.expireTime = expireTime;
+	}
+
+	public ValidateCode(String code, int expireTime) {
+		super();
+		this.code = code;
+		this.expireTime = DateUtil.setMinutes(new Date(), expireTime);
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public Date getExpireTime() {
+		return expireTime;
+	}
+
+	public void setExpireTime(Date expireTime) {
+		this.expireTime = expireTime;
+	}
+
+	@JsonIgnore
+	public boolean isExpired() {
+		return new Date().compareTo(expireTime) > 0;
+	}
+
+	@Override
+	public String toString() {
+		return "ValidateCode [code=" + code + ", expireTime=" + expireTime + "]";
+	}
+}
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 af90257..2c1ef49 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
@@ -11,35 +11,36 @@
 
   /**
    * 取数据库日期
-   * */
+   */
+  @Transactional
   SystemDateTime getSysdatetime();
 
   /**
    * 更新任务表
-   * */
+   */
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   TTaskLock updateTaskLock(TTaskLock lock);
 
   /**
    * 取任务表
-   * */
+   */
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   TTaskLock doLockTask(String taskcode, Integer minRecover, String remark);
 
   /**
    * 获取记账日期
-   * */
-  String getAccdate();
+   */
+//  String getAccdate();
 
   /**
    * 获取流水号
-   * */
+   */
   String getRefno();
 
   /**
    * 按交易码取交易名称
    */
-  String getTranscodeName(int transocde, String defaultValue);
+//  String getTranscodeName(int transocde, String defaultValue);
 
 
   /********************** 获取【系统参数】【业务参数】通用方法 **********************/
@@ -73,6 +74,7 @@
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   TBusinesspara getBusinessValueForUpdateNowait(String parakey);
+
   /********************** 获取【系统参数】【业务参数】通用方法 **********************/
 
 
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 eee9e5a..3e0dedf 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
@@ -13,9 +13,6 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
 @Service
 public class SystemUtilServiceImpl implements SystemUtilService {
   @Autowired
@@ -23,10 +20,7 @@
 
   @Autowired
   private TaskLockDao taskLockDao;
-  @Autowired
-  private SettleCtlDao settleCtlDao;
-  @Autowired
-  private TranscodeDao transcodeDao;
+
   @Autowired
   private SysparaDao sysparaDao;
   @Autowired
@@ -34,35 +28,6 @@
 
   private static final Logger logger = LoggerFactory.getLogger(SystemUtilServiceImpl.class);
 
-  public static class SystemDateTimeImpl implements SystemDateTime {
-    private Date now;
-    private static final SimpleDateFormat sdft = new SimpleDateFormat("yyyyMMddHHmmss");
-
-    public SystemDateTimeImpl(Date now) {
-      this.now = now;
-    }
-
-    @Override
-    public String getHostdate() {
-      return sdft.format(this.now).substring(0, 8);
-    }
-
-    @Override
-    public String getHosttime() {
-      return sdft.format(this.now).substring(8, 14);
-    }
-
-    @Override
-    public String getHostdatetime() {
-      return sdft.format(this.now);
-    }
-
-    @Override
-    public Date getSysdate() {
-      return this.now;
-    }
-  }
-
   /**
    * 获取oracle数据库时间
    */
@@ -115,17 +80,6 @@
     return lock;
   }
 
-  @Override
-  public String getAccdate() {
-    String hostdate = getSysdatetime().getHostdate();
-    TSettlectl settlectl = settleCtlDao.getOne(1);
-    if (null != settlectl && null != settlectl.getSettledate()) {
-      if (Integer.valueOf(hostdate) < settlectl.getSettledate().intValue()) {
-        return settlectl.getSettledate().toString();
-      }
-    }
-    return hostdate;
-  }
 
   private String getOracleRefno() {
     return taskLockDao.getOracleRefno();
@@ -141,14 +95,6 @@
     }
   }
 
-  @Override
-  public String getTranscodeName(int transocde, String defaultValue) {
-    TTranscode tTranscode = transcodeDao.getOne(transocde);
-    if (null != tTranscode && !StringUtil.isEmpty(tTranscode.getTransname())) {
-      return tTranscode.getTransname();
-    }
-    return defaultValue;
-  }
 
   @Override
   public String getSysparaValue(int paraid) {
@@ -174,29 +120,31 @@
   @Override
   public int getSysparaValueAsInt(int paraid, int defaultValue) {
     TSyspara syspara = sysparaDao.findByParaid(paraid);
-    if (null != syspara && NumberUtil.isNumber(syspara.getParaval())) return Integer.parseInt(syspara.getParaval());
+    if (null != syspara && NumberUtil.isNumber(syspara.getParaval()))
+      return Integer.parseInt(syspara.getParaval());
     return defaultValue;
   }
 
   @Override
   public double getSysparaValueAsDouble(int paraid, double defaultValue) {
     TSyspara syspara = sysparaDao.findByParaid(paraid);
-    if (null != syspara && NumberUtil.isDecimal(syspara.getParaval())) return Double.parseDouble(syspara.getParaval());
+    if (null != syspara && NumberUtil.isDecimal(syspara.getParaval()))
+      return Double.parseDouble(syspara.getParaval());
     return defaultValue;
   }
 
   @Override
-  public TSyspara getSyspara(int paraid){
+  public TSyspara getSyspara(int paraid) {
     return sysparaDao.findByParaid(paraid);
   }
 
   @Override
-  public TSyspara getSysparaValueForUpdate(int paraid){
+  public TSyspara getSysparaValueForUpdate(int paraid) {
     return sysparaDao.findByParaidWithLock(paraid);
   }
 
   @Override
-  public TSyspara getSysparaValueForUpdateNowait(int paraid){
+  public TSyspara getSysparaValueForUpdateNowait(int paraid) {
     return sysparaDao.findByParaidWithLockNowait(paraid);
   }
 
@@ -223,7 +171,7 @@
   }
 
   @Override
-  public TBusinesspara getBusinessValueForUpdate(String parakey){
+  public TBusinesspara getBusinessValueForUpdate(String parakey) {
     if (!StringUtil.isEmpty(parakey)) return businessparaDao.findByParakeyForUpdate(parakey.trim());
     return null;
   }
@@ -235,7 +183,7 @@
   }
 
   @Override
-  public String getSubsystemSignKey(String syscode){
+  public String getSubsystemSignKey(String syscode) {
     // fixme: 验证数据无误性签名秘钥
     return "";
   }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/tenant/HibernateConfig.java b/src/main/java/com/supwisdom/dlpay/framework/tenant/HibernateConfig.java
new file mode 100644
index 0000000..26a582c
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/tenant/HibernateConfig.java
@@ -0,0 +1,64 @@
+package com.supwisdom.dlpay.framework.tenant;
+
+import lombok.extern.slf4j.Slf4j;
+import org.hibernate.MultiTenancyStrategy;
+import org.hibernate.cfg.Environment;
+import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
+import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
+import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.orm.jpa.JpaVendorAdapter;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.Map;
+
+@Configuration
+@Slf4j
+public class HibernateConfig {
+
+  private final JpaProperties jpaProperties;
+
+  private final HibernateProperties hibernateProperties;
+
+  public HibernateConfig(@Autowired JpaProperties jpaProperties,
+                         HibernateProperties hibernateProperties) {
+    this.jpaProperties = jpaProperties;
+    this.hibernateProperties = hibernateProperties;
+  }
+
+  @Bean
+  public JpaVendorAdapter getJpaVendorAdapter() {
+    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
+    adapter.setGenerateDdl(true);
+    return adapter;
+  }
+
+  @Bean("entityManagerFactory")
+  public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource dataSource,
+                                                                         MultiTenantConnectionProvider multiTenantConnectionProvider,
+                                                                         CurrentTenantIdentifierResolver currentTenantIdentifierResolver) {
+    Map<String, Object> properties = new HashMap<>();
+    properties.putAll(hibernateProperties
+        .determineHibernateProperties(jpaProperties.getProperties(),
+            new HibernateSettings()));
+    properties.put(Environment.MULTI_TENANT, MultiTenancyStrategy.SCHEMA);
+    properties.put(Environment.MULTI_TENANT_CONNECTION_PROVIDER, multiTenantConnectionProvider);
+    properties.put(Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, currentTenantIdentifierResolver);
+
+    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
+    em.setDataSource(dataSource);
+    em.setPackagesToScan("com.supwisdom");
+    em.setJpaPropertyMap(properties);
+    em.setJpaVendorAdapter(getJpaVendorAdapter());
+//    log.info("setup multi-tenant entityManagerFactor");
+    return em;
+  }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantConnectionProviderImpl.java b/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantConnectionProviderImpl.java
new file mode 100644
index 0000000..ed9fb0e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantConnectionProviderImpl.java
@@ -0,0 +1,66 @@
+package com.supwisdom.dlpay.framework.tenant;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+/**
+ * Created by shuwei on 2018/12/4.
+ */
+@Component
+public class MultiTenantConnectionProviderImpl implements MultiTenantConnectionProvider {
+  @Autowired
+  private DataSource dataSource;
+
+  @Override
+  public Connection getAnyConnection() throws SQLException {
+    return dataSource.getConnection();
+  }
+
+  @Override
+  public void releaseAnyConnection(Connection connection) throws SQLException {
+    connection.close();
+  }
+
+  @Override
+  public Connection getConnection(String ti) throws SQLException {
+    String tenantIdentifier = TenantContext.getTenantSchema();
+    final Connection connection = getAnyConnection();
+    try {
+      if (tenantIdentifier != null) {
+        connection.createStatement().execute("SET search_path = \"" + tenantIdentifier + "\", public");
+      } else {
+        connection.createStatement().execute("SET search_path =  public");
+      }
+    } catch (SQLException e) {
+      throw new HibernateException("Problem setting schema to " + tenantIdentifier, e);
+    }
+    return connection;
+  }
+
+  @Override
+  public void releaseConnection(String tenantIdentifier, Connection connection) throws SQLException {
+    connection.close();
+  }
+
+  @Override
+  public boolean supportsAggressiveRelease() {
+    return false;
+  }
+
+  @SuppressWarnings("rawtypes")
+  @Override
+  public boolean isUnwrappableAs(Class unwrapType) {
+    return false;
+  }
+
+  @Override
+  public <T> T unwrap(Class<T> unwrapType) {
+    return null;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantIdentifierResolver.java b/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantIdentifierResolver.java
new file mode 100644
index 0000000..c1dc432
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/tenant/MultiTenantIdentifierResolver.java
@@ -0,0 +1,23 @@
+package com.supwisdom.dlpay.framework.tenant;
+
+import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
+import org.springframework.stereotype.Component;
+
+/**
+ * Created by shuwei on 2018/12/4.
+ */
+@Component
+public class MultiTenantIdentifierResolver implements CurrentTenantIdentifierResolver {
+  @Override
+  public String resolveCurrentTenantIdentifier() {
+    if (TenantContext.getTenantSchema() == null) {
+      return "default";
+    }
+    return TenantContext.getTenantSchema();
+  }
+
+  @Override
+  public boolean validateExistingCurrentSessions() {
+    return true;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantContext.java b/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantContext.java
new file mode 100644
index 0000000..c1d4ca4
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantContext.java
@@ -0,0 +1,20 @@
+package com.supwisdom.dlpay.framework.tenant;
+
+/**
+ * Created by shuwei on 2018/11/29.
+ */
+public class TenantContext {
+  private static ThreadLocal<String> currentTenant = new ThreadLocal<>();
+
+  public static void setTenantSchema(String tid) {
+    currentTenant.set(tid);
+  }
+
+  public static String getTenantSchema() {
+    return currentTenant.get();
+  }
+
+  public static void clear() {
+    currentTenant.set(null);
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantInterceptor.java b/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantInterceptor.java
new file mode 100644
index 0000000..59d56b6
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/tenant/TenantInterceptor.java
@@ -0,0 +1,23 @@
+package com.supwisdom.dlpay.framework.tenant;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.util.Constants;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Component
+public class TenantInterceptor extends HandlerInterceptorAdapter {
+
+  @Override
+  public void postHandle(HttpServletRequest request, HttpServletResponse response,
+                         Object handler, ModelAndView modelAndView)
+      throws Exception {
+    //
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/Constants.java b/src/main/java/com/supwisdom/dlpay/framework/util/Constants.java
new file mode 100644
index 0000000..17dd6bc
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/Constants.java
@@ -0,0 +1,11 @@
+package com.supwisdom.dlpay.framework.util;
+
+public class Constants {
+  //  HTTP HEADER define
+  public static final String HEADER_TETANTID = "X-TENANT-ID";
+
+  // define
+  public static final String JWT_CLAIM_TENANTID = "tenantId";
+  public static final String JWT_CLAIM_UID = "uid";
+  public static final String JWT_CLAIM_AUTHORITIES = "authorities";
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
index 3a7e013..30b15b1 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
@@ -3,6 +3,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.sql.Timestamp;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
@@ -20,7 +21,7 @@
    * History:
    */
   public static String getNow() {
-    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
     return sdf.format(new Date());
   }
 
@@ -29,7 +30,7 @@
    * Description: 根据类型返回一个当前时间 @param partten String @return String 格式：partten
    */
   public static String getNow(String partten) {
-    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(partten);
+    SimpleDateFormat sdf = new SimpleDateFormat(partten);
     return sdf.format(new Date());
   }
 
@@ -39,7 +40,7 @@
    */
   public static String getNewTime(String startTime, int interval) {
     try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
       Date d = sdf.parse(startTime);
       Calendar calendar = Calendar.getInstance();
       calendar.setTimeInMillis(d.getTime());
@@ -56,7 +57,7 @@
    */
   public static String getNewTime(String startTime, int interval, String partten) {
     try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(partten);
+      SimpleDateFormat sdf = new SimpleDateFormat(partten);
       Date d = sdf.parse(startTime);
       Calendar calendar = Calendar.getInstance();
       calendar.setTimeInMillis(d.getTime());
@@ -69,7 +70,7 @@
 
   public static String getNewDay(String startDay, int intervalday) {
     try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
+      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
       Date d = sdf.parse(startDay);
       Calendar calendar = Calendar.getInstance();
       calendar.setTimeInMillis(d.getTime());
@@ -85,7 +86,7 @@
    */
   public static long getIntervalDay(String firstDay, String secondDay) {
     try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
+      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
       Date f = sdf.parse(firstDay);
       Date s = sdf.parse(secondDay);
       long time = s.getTime() - f.getTime();
@@ -104,7 +105,7 @@
    */
   public static int compareDatetime(String firstTime, String secondTime) {
     try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
       Date f = sdf.parse(firstTime);
       Date s = sdf.parse(secondTime);
       return f.compareTo(s);
@@ -122,7 +123,7 @@
    */
   public static int compareDatetime(String firstTime, String secondTime, String pattern) {
     try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
+      SimpleDateFormat sdf = new SimpleDateFormat(pattern);
       Date f = sdf.parse(firstTime);
       Date s = sdf.parse(secondTime);
       return f.compareTo(s);
@@ -140,7 +141,7 @@
    */
   public static int compareDatetime(String firstTime, String secondTime, int seconds) {
     try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
       Date f = sdf.parse(firstTime);
       Date s = sdf.parse(secondTime);
       Calendar calendar = Calendar.getInstance();
@@ -158,7 +159,7 @@
    */
   public static String reformatDatetime(String time, String fromPattern, String toPattern) {
     try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(fromPattern);
+      SimpleDateFormat sdf = new SimpleDateFormat(fromPattern);
       Date d = sdf.parse(time);
       Calendar calendar = Calendar.getInstance();
       calendar.setTimeInMillis(d.getTime());
@@ -176,7 +177,7 @@
   public static long getInterval(String startTime, String endTime) {
     long duration = 0;
     try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
       duration = sdf.parse(endTime).getTime() - sdf.parse(startTime).getTime();
     } catch (ParseException e) {
       logger.error("Hi guys,there is an error when you try to parse the date string");
@@ -190,7 +191,7 @@
   public static long getIntervalTime(String startTime, String endTime, String pattern) {
     long duration = 0;
     try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
+      SimpleDateFormat sdf = new SimpleDateFormat(pattern);
       duration = sdf.parse(endTime).getTime() - sdf.parse(startTime).getTime();
     } catch (ParseException e) {
       logger.error("Hi guys,there is an error when you try to parse the date string");
@@ -237,9 +238,9 @@
   public static boolean checkDatetimeValid(String datetime, String pattern) {
     if (null == datetime) return false;
     try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
+      SimpleDateFormat sdf = new SimpleDateFormat(pattern);
       Date d = sdf.parse(datetime);
-      return true;
+      return datetime.trim().equals(sdf.format(d));
     } catch (Exception e) {
     }
     return false;
@@ -252,7 +253,7 @@
    */
   public static int getWeekday(String datestr) {
     try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
+      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
       Calendar calendar = Calendar.getInstance();
       boolean isFirstSunday = (calendar.getFirstDayOfWeek() == Calendar.SUNDAY); //一周第一天是否为星期天
       Date d = sdf.parse(datestr);
@@ -275,7 +276,7 @@
    */
   public static Date getSpecifyDate(String datestr, String pattern) {
     try {
-      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(pattern);
+      SimpleDateFormat sdf = new SimpleDateFormat(pattern);
       Date result = sdf.parse(datestr);
       return result;
     } catch (Exception e) {
@@ -324,4 +325,21 @@
   public static String getUTCTime() {
     return getUTCTime(System.currentTimeMillis());
   }
+
+  public static int compareDay(Timestamp d1, Timestamp d2) {
+    Calendar cd1 = Calendar.getInstance();
+    cd1.setTimeInMillis(d1.getTime());
+    Calendar cd2 = Calendar.getInstance();
+    cd2.setTimeInMillis(d2.getTime());
+
+    if (cd1.get(Calendar.YEAR) != cd2.get(Calendar.YEAR)) {
+      return cd1.compareTo(cd2);
+    }
+
+    return Integer.compare(cd1.get(Calendar.DAY_OF_YEAR), cd2.get(Calendar.DAY_OF_YEAR));
+  }
+
+  public static Boolean sameDay(Timestamp d1, Timestamp d2) {
+    return (compareDay(d1, d2) == 0);
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/Dictionary.java b/src/main/java/com/supwisdom/dlpay/framework/util/Dictionary.java
new file mode 100644
index 0000000..46377e9
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/Dictionary.java
@@ -0,0 +1,15 @@
+package com.supwisdom.dlpay.framework.util;
+
+public class Dictionary {
+  // dictionary 表字典
+  public static final String REVERSE_FLAG = "reverseflagList";
+  public static final String DTL_STATUS = "dtlStatusList";
+  public static final String IDTYPE = "idtypeList";
+  public static final String SEX = "sexList";
+  public static final String ACCOUNT_STATUS = "accountStatusList";
+
+  /////////////////////////////////////
+  public static final String SOURCE_TYPE = "sourcetypeList";
+  public static final String TRANS_CODE = "transcodeList";
+  public static final String PAY_TYPE = "paytypelist";
+}
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 7ea105c..88ca6e8 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/HmacUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/HmacUtil.java
@@ -2,11 +2,11 @@
 
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
-import java.io.UnsupportedEncodingException;
 import java.nio.charset.StandardCharsets;
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
-import java.util.*;
+import java.util.HashMap;
+import java.util.Map;
 
 public class HmacUtil {
   /**
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 4a46b28..e80344a 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java
@@ -28,6 +28,11 @@
   public static final String SUBJNO_RECHARGE_CASH = "112201";
 
   /**
+   * 应收账款 - 其他第三方充值款
+   */
+  public static final String SUBJNO_RECHARGE_OTHER = "112209";
+
+  /**
    * 应收账款 - 支付宝充值款
    */
   public static final String SUBJNO_RECHARGE_ALIPAY = "112210";
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 07e4aaf..3ccb2a7 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/SysparaUtil.java
@@ -13,6 +13,10 @@
   public static final int SYSPARAID_NO1 = 1; //系统默认最大余额限制的ID
   public static final int SYSPARAID_NO2 = 2; //paraid=2
 
+  public static final int SYSPARAID_NO2019 = 2019; //与卡管系统对接的应用ID
+  public static final int SYSPARAID_NO2020 = 2020; //与卡管系统对接的应用appkey
+  public static final int SYSPARAID_NO2021 = 2021; //与卡管系统对接的业务参数deskey
+
   public static final double SYSPARA_NO1_DEFAULT = 10000.0; // 系统默认最大余额限制
 
 }
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 20cd922..cc1b344 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
@@ -12,6 +12,9 @@
   public static final int TRANSCODE_WECHAT=1001;
 
 
-  public static final int TRANSTYPE_PAY = 311;
-  public static final int TRANSTYPE_YKTPAY=1000;
+  public static final int TRANSCODE_ERCHARGE = 3500; //账户充值
+
+
+
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/ShopBusinessInfo.java b/src/main/java/com/supwisdom/dlpay/system/bean/ShopBusinessInfo.java
new file mode 100644
index 0000000..f7c2434
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/ShopBusinessInfo.java
@@ -0,0 +1,60 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class ShopBusinessInfo {
+  private String shopaccno;
+  private String summary;
+  private Long transcnt;
+  private Double dramt;
+  private Double cramt;
+
+  public ShopBusinessInfo() {
+  }
+
+  public ShopBusinessInfo(String shopaccno, String summary, Long transcnt, Double dramt, Double cramt) {
+    this.shopaccno = shopaccno;
+    this.summary = summary;
+    this.transcnt = transcnt;
+    this.dramt = dramt;
+    this.cramt = cramt;
+  }
+
+  public String getShopaccno() {
+    return shopaccno;
+  }
+
+  public void setShopaccno(String shopaccno) {
+    this.shopaccno = shopaccno;
+  }
+
+  public String getSummary() {
+    return summary;
+  }
+
+  public void setSummary(String summary) {
+    this.summary = summary;
+  }
+
+  public Long getTranscnt() {
+    return transcnt;
+  }
+
+  public void setTranscnt(Long transcnt) {
+    this.transcnt = transcnt;
+  }
+
+  public Double getDramt() {
+    return dramt;
+  }
+
+  public void setDramt(Double dramt) {
+    this.dramt = dramt;
+  }
+
+  public Double getCramt() {
+    return cramt;
+  }
+
+  public void setCramt(Double cramt) {
+    this.cramt = cramt;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/ShopBusinessShowBean.java b/src/main/java/com/supwisdom/dlpay/system/bean/ShopBusinessShowBean.java
new file mode 100644
index 0000000..0d793e1
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/ShopBusinessShowBean.java
@@ -0,0 +1,67 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class ShopBusinessShowBean {
+  private String shopid;
+  private String shopname;
+  private String fshopid;
+  private String shopaccno;
+  private String summary;
+  private Long transcnt;
+  private Double transamt;
+
+  public String getShopid() {
+    return shopid;
+  }
+
+  public void setShopid(String shopid) {
+    this.shopid = shopid;
+  }
+
+  public String getShopname() {
+    return shopname;
+  }
+
+  public void setShopname(String shopname) {
+    this.shopname = shopname;
+  }
+
+  public String getFshopid() {
+    return fshopid;
+  }
+
+  public void setFshopid(String fshopid) {
+    this.fshopid = fshopid;
+  }
+
+  public String getShopaccno() {
+    return shopaccno;
+  }
+
+  public void setShopaccno(String shopaccno) {
+    this.shopaccno = shopaccno;
+  }
+
+  public String getSummary() {
+    return summary;
+  }
+
+  public void setSummary(String summary) {
+    this.summary = summary;
+  }
+
+  public Long getTranscnt() {
+    return transcnt;
+  }
+
+  public void setTranscnt(Long transcnt) {
+    this.transcnt = transcnt;
+  }
+
+  public Double getTransamt() {
+    return transamt;
+  }
+
+  public void setTransamt(Double transamt) {
+    this.transamt = transamt;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayInfo.java b/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayInfo.java
new file mode 100644
index 0000000..f31d5b5
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayInfo.java
@@ -0,0 +1,25 @@
+package com.supwisdom.dlpay.system.bean;
+
+public interface SubjectDayInfo {
+  String getSubjno();
+
+  String getSubjname();
+
+  String getFsubjno();
+
+  Integer getSubjlevel();
+
+  String getDisplayflag();
+
+  Double getLastdaydrbal();
+
+  Double getLastdaycrbal();
+
+  Double getDramt();
+
+  Double getCramt();
+
+  Double getDrbal();
+
+  Double getCrbal();
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayShowBean.java b/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayShowBean.java
new file mode 100644
index 0000000..c36c212
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayShowBean.java
@@ -0,0 +1,103 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class SubjectDayShowBean {
+  private String subjno;
+  private String subjname;
+  private String fsubjno;
+  private Integer subjlevel;
+  private String displayflag;
+  private Double lastdaydrbal;
+  private Double lastdaycrbal;
+  private Double dramt;
+  private Double cramt;
+  private Double drbal;
+  private Double crbal;
+
+  public String getSubjno() {
+    return subjno;
+  }
+
+  public void setSubjno(String subjno) {
+    this.subjno = subjno;
+  }
+
+  public String getSubjname() {
+    return subjname;
+  }
+
+  public void setSubjname(String subjname) {
+    this.subjname = subjname;
+  }
+
+  public String getFsubjno() {
+    return fsubjno;
+  }
+
+  public void setFsubjno(String fsubjno) {
+    this.fsubjno = fsubjno;
+  }
+
+  public Integer getSubjlevel() {
+    return subjlevel;
+  }
+
+  public void setSubjlevel(Integer subjlevel) {
+    this.subjlevel = subjlevel;
+  }
+
+  public String getDisplayflag() {
+    return displayflag;
+  }
+
+  public void setDisplayflag(String displayflag) {
+    this.displayflag = displayflag;
+  }
+
+  public Double getLastdaydrbal() {
+    return lastdaydrbal;
+  }
+
+  public void setLastdaydrbal(Double lastdaydrbal) {
+    this.lastdaydrbal = lastdaydrbal;
+  }
+
+  public Double getLastdaycrbal() {
+    return lastdaycrbal;
+  }
+
+  public void setLastdaycrbal(Double lastdaycrbal) {
+    this.lastdaycrbal = lastdaycrbal;
+  }
+
+  public Double getDramt() {
+    return dramt;
+  }
+
+  public void setDramt(Double dramt) {
+    this.dramt = dramt;
+  }
+
+  public Double getCramt() {
+    return cramt;
+  }
+
+  public void setCramt(Double cramt) {
+    this.cramt = cramt;
+  }
+
+  public Double getDrbal() {
+    return drbal;
+  }
+
+  public void setDrbal(Double drbal) {
+    this.drbal = drbal;
+  }
+
+  public Double getCrbal() {
+    return crbal;
+  }
+
+  public void setCrbal(Double crbal) {
+    this.crbal = crbal;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDetailShowBean.java b/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDetailShowBean.java
new file mode 100644
index 0000000..2cc3222
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDetailShowBean.java
@@ -0,0 +1,100 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class SubjectDetailShowBean {
+  private Integer voucherdate; //凭证日期
+  private Integer voucherno; //凭证编号
+  private String subjno;
+  private String summary;
+  private Double dramt;
+  private Double cramt;
+  private Integer balflag;//1-借；2-贷
+  private Double balance;
+  private String oppname;
+
+  public SubjectDetailShowBean() {
+  }
+
+  public SubjectDetailShowBean(Integer voucherdate, Integer voucherno, String subjno, String summary, Double dramt, Double cramt, Integer balflag, Double balance, String oppname) {
+    this.voucherdate = voucherdate;
+    this.voucherno = voucherno;
+    this.subjno = subjno;
+    this.summary = summary;
+    this.dramt = dramt;
+    this.cramt = cramt;
+    this.balflag = balflag;
+    this.balance = balance;
+    this.oppname = oppname;
+  }
+
+  public Integer getVoucherdate() {
+    return voucherdate;
+  }
+
+  public void setVoucherdate(Integer voucherdate) {
+    this.voucherdate = voucherdate;
+  }
+
+  public Integer getVoucherno() {
+    return voucherno;
+  }
+
+  public void setVoucherno(Integer voucherno) {
+    this.voucherno = voucherno;
+  }
+
+  public String getSubjno() {
+    return subjno;
+  }
+
+  public void setSubjno(String subjno) {
+    this.subjno = subjno;
+  }
+
+  public String getSummary() {
+    return summary;
+  }
+
+  public void setSummary(String summary) {
+    this.summary = summary;
+  }
+
+  public Double getDramt() {
+    return dramt;
+  }
+
+  public void setDramt(Double dramt) {
+    this.dramt = dramt;
+  }
+
+  public Double getCramt() {
+    return cramt;
+  }
+
+  public void setCramt(Double cramt) {
+    this.cramt = cramt;
+  }
+
+  public Integer getBalflag() {
+    return balflag;
+  }
+
+  public void setBalflag(Integer balflag) {
+    this.balflag = balflag;
+  }
+
+  public Double getBalance() {
+    return balance;
+  }
+
+  public void setBalance(Double balance) {
+    this.balance = balance;
+  }
+
+  public String getOppname() {
+    return oppname;
+  }
+
+  public void setOppname(String oppname) {
+    this.oppname = oppname;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/TreeSelectNode.java b/src/main/java/com/supwisdom/dlpay/system/bean/TreeSelectNode.java
index 47ceff2..87b6fd2 100644
--- a/src/main/java/com/supwisdom/dlpay/system/bean/TreeSelectNode.java
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/TreeSelectNode.java
@@ -9,6 +9,7 @@
   private boolean checked;
   private List<TreeSelectNode> children;
 
+  private String pId;   //扩展 父级ID
   private String accno; //扩展：商户账号
 
   public String getId() {
@@ -51,6 +52,14 @@
     this.children = children;
   }
 
+  public String getpId() {
+    return pId;
+  }
+
+  public void setpId(String pId) {
+    this.pId = pId;
+  }
+
   public String getAccno() {
     return accno;
   }
diff --git a/src/main/java/com/supwisdom/dlpay/system/common/DictPool.java b/src/main/java/com/supwisdom/dlpay/system/common/DictPool.java
deleted file mode 100644
index 56128cc..0000000
--- a/src/main/java/com/supwisdom/dlpay/system/common/DictPool.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.supwisdom.dlpay.system.common;
-
-import com.supwisdom.dlpay.system.service.DictionaryDataService;
-import com.supwisdom.dlpay.util.ConstantUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.HashMap;
-import java.util.Map;
-
-@Component("dictPool")
-@Scope("singleton")
-public class DictPool {
-  private static HashMap<String, Object> dictmap = new HashMap<>();
-
-  @Autowired
-  private DictionaryDataService dictionaryDataService;
-
-  public static HashMap<Object, Object> getDictMap(String key) {
-    synchronized (dictmap) {
-      return (HashMap<Object, Object>) dictmap.get(key);
-    }
-  }
-
-  public static void updateDict(String dictType, Map<String, String> value) {
-    synchronized (dictmap) {
-      dictmap.put(dictType, value);
-    }
-  }
-
-  public void init() {
-    dictmap.put("allSourcetypeList", dictionaryDataService.getSystemAllSourcetype());
-    dictmap.put("allReverseflagList", dictionaryDataService.getDictionaryByDicttype(ConstantUtil.DICTTYPE_NO1));
-
-  }
-}
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/DictPoolAction.java b/src/main/java/com/supwisdom/dlpay/system/controller/DictPoolAction.java
index 085a27d..39b5040 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/DictPoolAction.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/DictPoolAction.java
@@ -1,10 +1,11 @@
 package com.supwisdom.dlpay.system.controller;
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.system.service.DictionaryProxy;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
-import com.supwisdom.dlpay.system.common.DictPool;
+
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.FormParam;
 import java.util.Map;
@@ -12,18 +13,16 @@
 @RestController
 public class DictPoolAction {
   @Autowired
-  private DictPool dictPool;
+  private DictionaryProxy dictionaryProxy;
 
   @GetMapping("/dictpool")
   public Map getDictDataByDicttype(@FormParam("dicttype") String dictType, HttpServletRequest request) {
     dictType = request.getParameter("dicttype");
-    Map res = DictPool.getDictMap(dictType);
-    return res;
+    return dictionaryProxy.getDictionaryAsMap(dictType);
   }
 
   @GetMapping("/dictrefresh")
   public JsonResult refreshDict() {
-    dictPool.init();
     return JsonResult.ok();
   }
 
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/DtlController.java b/src/main/java/com/supwisdom/dlpay/system/controller/DtlController.java
new file mode 100644
index 0000000..3532822
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/DtlController.java
@@ -0,0 +1,88 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.api.domain.TPersondtl;
+import com.supwisdom.dlpay.api.domain.TShopdtl;
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import com.supwisdom.dlpay.framework.domain.TDictionary;
+import com.supwisdom.dlpay.framework.util.Dictionary;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.system.bean.ShopdtlSearchBean;
+import com.supwisdom.dlpay.system.bean.TreeSelectNode;
+import com.supwisdom.dlpay.system.bean.UserdtlSearchBean;
+import com.supwisdom.dlpay.system.service.DictionaryProxy;
+import com.supwisdom.dlpay.system.service.DtlDataService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+@Controller
+public class DtlController {
+  @Autowired
+  private DtlDataService dtlDataService;
+
+  @Autowired
+  private DictionaryProxy dictionaryProxy;
+
+  /**
+   * ====================================================
+   * 个人流水查询
+   * ====================================================
+   */
+
+  @GetMapping("/dtl/userdtllist")
+  @PreAuthorize("hasPermission('/dtl/userdtl','')")
+  @ResponseBody
+  public PageResult<TPersondtl> searchUserdtlPage(@ModelAttribute UserdtlSearchBean searchBean) {
+    try {
+      Integer pageNo = searchBean.getPage();
+      Integer pageSize = searchBean.getLimit();
+      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+      return dtlDataService.getPersondtlPage(searchBean, pageNo, pageSize);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
+    }
+  }
+
+  /**
+   * ====================================================
+   * 商户流水查询
+   * ====================================================
+   */
+  @GetMapping("/dtl/shopdtl")
+  public String shopdtlView(Model model) {
+    model.addAttribute(Dictionary.PAY_TYPE,
+        dictionaryProxy.getDictionaryAsList(Dictionary.SOURCE_TYPE));
+    model.addAttribute(Dictionary.TRANS_CODE,
+        dictionaryProxy.getDictionaryAsList(Dictionary.TRANS_CODE));
+    model.addAttribute(Dictionary.DTL_STATUS,
+        dictionaryProxy.getDictionaryAsList(Dictionary.DTL_STATUS));
+    return "system/dtl/shopdtl";
+  }
+
+  @GetMapping("/dtl/shopdtllist")
+  @PreAuthorize("hasPermission('/dtl/shopdtl','')")
+  @ResponseBody
+  public PageResult<TShopdtl> searchUserdtlPage(@ModelAttribute ShopdtlSearchBean searchBean) {
+    try {
+      Integer pageNo = searchBean.getPage();
+      Integer pageSize = searchBean.getLimit();
+      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+      return dtlDataService.getShopdtlPage(searchBean, pageNo, pageSize);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
+    }
+  }
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java b/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java
index bbd7a5c..a9cc78b 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/FunctionController.java
@@ -4,6 +4,7 @@
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.framework.domain.TFunction;
 import com.supwisdom.dlpay.framework.domain.TResource;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.WebConstant;
 import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
@@ -19,120 +20,115 @@
 @Controller
 public class FunctionController {
 
-    @Autowired
-    private FunctionService functionService;
+  @Autowired
+  private FunctionService functionService;
 
-    @GetMapping("/function/index")
-    public String indexView() {
-        return "system/function/index";
-    }
+  @GetMapping("/function/index")
+  public String indexView() {
+    return "system/function/index";
+  }
 
-    @GetMapping("/function/list")
-    @PreAuthorize("hasPermission('/function/index','')")
-    @ResponseBody
-    public PageResult<TFunction> getDataList(@RequestParam("page") Integer pageNo,
-                                             @RequestParam("limit") Integer pageSize,
-                                             @RequestParam(value = "searchkey", required = false) String searchKey) {
-        try {
-            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
-            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
-            FunctionSearchBean searchBean = new FunctionSearchBean();
-            searchBean.setPageNo(pageNo);
-            searchBean.setFunctioname(searchKey);
-            searchBean.setPageSize(pageSize);
-            return functionService.getFunctionsByKey(searchBean);
-        } catch (Exception e) {
-            e.printStackTrace();
-            return new PageResult<>(99, "系统查询错误");
-        }
+  @GetMapping("/function/list")
+  @PreAuthorize("hasPermission('/function/index','')")
+  @ResponseBody
+  public PageResult<TFunction> getDataList(@RequestParam("page") Integer pageNo,
+                                           @RequestParam("limit") Integer pageSize,
+                                           @RequestParam(value = "searchkey", required = false) String searchKey) {
+    try {
+      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+      FunctionSearchBean searchBean = new FunctionSearchBean();
+      searchBean.setPageNo(pageNo);
+      searchBean.setFunctioname(searchKey);
+      searchBean.setPageSize(pageSize);
+      return functionService.getFunctionsByKey(searchBean);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
     }
+  }
 
-    @GetMapping("/function/loadadd")
-    @PreAuthorize("hasPermission('/function/loadadd','')")
-    public String loadadd() {
-        return "system/function/form";
-    }
+  @GetMapping("/function/loadadd")
+  @PreAuthorize("hasPermission('/function/loadadd','')")
+  public String loadadd() {
+    return "system/function/form";
+  }
 
-    @PostMapping("/function/add")
-    @PreAuthorize("hasPermission('/function/add','')")
-    @ResponseBody
-    public JsonResult add(@RequestBody TFunction function) {
-        if (function != null) {
-            return functionService.saveFunction(function);
-        } else {
-            return JsonResult.error("添加失败");
-        }
-    }
-    @PostMapping("/function/delfunc")
-    @PreAuthorize("hasPermission('/function/delfunc','')")
-    @ResponseBody
-    public JsonResult delfunc(@RequestParam Integer funcid) {
-        return functionService.deleteFunction(funcid);
-    }
 
-    @GetMapping("/function/checkname")
-    @ResponseBody
-    public JsonResult checkname(@RequestParam String name,
-                                @RequestParam(value = "id", required = false) Integer id) {
-        TFunction function = functionService.getFunctionByNameAndId(name, id);
-        if (function == null) {
-            return JsonResult.ok();
-        } else {
-            return JsonResult.error("功能名称重复");
-        }
-    }
+  @PostMapping("/function/delfunc")
+  @PreAuthorize("hasPermission('/function/delfunc','')")
+  @ResponseBody
+  public JsonResult delfunc(@RequestParam Integer funcid) {
+    return functionService.deleteFunction(funcid);
+  }
 
-    @GetMapping("/function/loadsubadd")
-    @PreAuthorize("hasPermission('/function/loadsubadd','')")
-    public String loadsubadd(Model model) {
-        List<TFunction> functionList = functionService.getParentFunction();
-        model.addAttribute("list", functionList);
-        return "system/function/subform";
+  @GetMapping("/function/checkname")
+  @ResponseBody
+  public JsonResult checkname(@RequestParam String name,
+                              @RequestParam(value = "id", required = false) Integer id) {
+    TFunction function = functionService.getFunctionByNameAndId(name, id);
+    if (function == null) {
+      return JsonResult.ok();
+    } else {
+      return JsonResult.error("功能名称重复");
     }
+  }
 
-    @GetMapping("/function/loadres")
-    @PreAuthorize("hasPermission('/function/loadres','')")
-    public String loadres(@RequestParam Integer functionid, Model model) {
-        TFunction function = functionService.getFunctionById(functionid);
-        List<TResource> resources = functionService.getResources(functionid);
-        model.addAttribute("function", function);
-        model.addAttribute("resources", resources);
-        return "system/function/reslist";
-    }
-    @GetMapping("/function/reslist")
-    @PreAuthorize("hasPermission('/function/loadres','')")
-    @ResponseBody
-    public PageResult<TResource> reslist(@RequestParam Integer functionid, Model model) {
-        List<TResource> resources = functionService.getResources(functionid);
-        return new PageResult<TResource>(resources);
-    }
-    @GetMapping("/function/loadresadd")
-    public String loadresadd(Model model) {
-        List<TFunction> functionList = functionService.getLeafFunction();
-        model.addAttribute("list", functionList);
-        return "system/function/resform";
-    }
+  @GetMapping("/function/loadsubadd")
+  @PreAuthorize("hasPermission('/function/loadsubadd','')")
+  public String loadsubadd(Model model) {
+    List<TFunction> functionList = functionService.getParentFunction();
+    model.addAttribute("list", functionList);
+    return "system/function/subform";
+  }
 
-    @PostMapping("/function/addres")
-    @PreAuthorize("hasPermission('/function/addres','')")
-    @ResponseBody
-    public JsonResult addres(@RequestBody TResource resource) {
-        if (resource != null) {
-            return functionService.saveRes(resource);
-        } else {
-            return JsonResult.error("添加失败");
-        }
+  @GetMapping("/function/loadres")
+  @PreAuthorize("hasPermission('/function/loadres','')")
+  public String loadres(@RequestParam Integer functionid, Model model) {
+    TFunction function = functionService.getFunctionById(functionid);
+    List<TResource> resources = functionService.getResources(functionid);
+    model.addAttribute("function", function);
+    model.addAttribute("resources", resources);
+    return "system/function/reslist";
+  }
+
+  @GetMapping("/function/reslist")
+  @PreAuthorize("hasPermission('/function/loadres','')")
+  @ResponseBody
+  public PageResult<TResource> reslist(@RequestParam Integer functionid, Model model) {
+    List<TResource> resources = functionService.getResources(functionid);
+    return new PageResult<TResource>(resources);
+  }
+
+  @GetMapping("/function/loadresadd")
+  public String loadresadd(Model model) {
+    List<TFunction> functionList = functionService.getLeafFunction();
+    model.addAttribute("list", functionList);
+    return "system/function/resform";
+  }
+
+  @PostMapping("/function/addres")
+  @PreAuthorize("hasPermission('/function/addres','')")
+  @ResponseBody
+  public JsonResult addres(@RequestBody TResource resource) {
+    if (resource != null) {
+      return functionService.saveRes(resource);
+    } else {
+      return JsonResult.error("添加失败");
     }
-    @GetMapping("/function/editres")
-    public String loadresadd(@RequestParam Integer resid,Model model) {
-        List<TFunction> functionList = functionService.getLeafFunction();
-        model.addAttribute("list", functionList);
-        return "system/function/resform";
-    }
-    @PostMapping("/function/delres")
-    @PreAuthorize("hasPermission('/function/delres','')")
-    @ResponseBody
-    public JsonResult delres(@RequestParam Integer resid) {
-        return functionService.deleteResource(resid);
-    }
+  }
+
+  @GetMapping("/function/editres")
+  public String loadresadd(@RequestParam Integer resid, Model model) {
+    List<TFunction> functionList = functionService.getLeafFunction();
+    model.addAttribute("list", functionList);
+    return "system/function/resform";
+  }
+
+  @PostMapping("/function/delres")
+  @PreAuthorize("hasPermission('/function/delres','')")
+  @ResponseBody
+  public JsonResult delres(@RequestParam Integer resid) {
+    return functionService.deleteResource(resid);
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java b/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
index dc0ef57..1cc6c7c 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/OperatorController.java
@@ -1,12 +1,13 @@
 package com.supwisdom.dlpay.system.controller;
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
-import com.supwisdom.dlpay.framework.domain.*;
+import com.supwisdom.dlpay.framework.domain.TOperLog;
+import com.supwisdom.dlpay.framework.domain.TOperRole;
+import com.supwisdom.dlpay.framework.domain.TOperator;
 import com.supwisdom.dlpay.framework.security.OperUtil;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.framework.util.WebConstant;
-import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
 import com.supwisdom.dlpay.system.bean.LogBean;
 import com.supwisdom.dlpay.system.bean.OperatorSearchBean;
 import com.supwisdom.dlpay.system.service.OperatorService;
@@ -95,7 +96,8 @@
     public JsonResult add(@RequestParam("operid") String operid, @RequestParam("opercode") String opercode,
                           @RequestParam("opername") String opername, @RequestParam("sex") String sex,
                           @RequestParam("mobile") String mobile, @RequestParam("email") String email,
-                          @RequestParam("roleId") String roleId, Model map) {
+                          @RequestParam("roleId") String roleId, @RequestParam(value = "thirdadmin", required = false) String thirdadmin,
+                          Model map) {
         if (operatorService.checkOpercodeExists(opercode, operid)) {
             return JsonResult.error("账号重复");
         }
@@ -106,6 +108,7 @@
         operator.setMobile(mobile);
         operator.setEmail(email);
         operator.setSex(sex);
+        operator.setThirdadmin("yes".equalsIgnoreCase(thirdadmin) ? "yes" : "no");
         boolean ret = operatorService.saveOperator(operator, roleId);
         if (ret) {
             return JsonResult.ok("操作成功");
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java b/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
deleted file mode 100644
index 24da8e3..0000000
--- a/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
+++ /dev/null
@@ -1,555 +0,0 @@
-package com.supwisdom.dlpay.system.controller;
-
-import com.supwisdom.dlpay.api.bean.JsonResult;
-import com.supwisdom.dlpay.api.domain.TSourceType;
-import com.supwisdom.dlpay.api.domain.TPaytypeConfig;
-import com.supwisdom.dlpay.framework.domain.TApiClient;
-import com.supwisdom.dlpay.framework.domain.TBusinesspara;
-import com.supwisdom.dlpay.framework.domain.TSyspara;
-import com.supwisdom.dlpay.framework.service.SystemUtilService;
-import com.supwisdom.dlpay.framework.util.*;
-import com.supwisdom.dlpay.system.service.ParamService;
-import com.supwisdom.dlpay.util.ConstantUtil;
-import com.supwisdom.dlpay.util.WebCheckException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@Controller
-public class ParamController {
-  @Autowired
-  private ParamService paramService;
-  @Autowired
-  private SystemUtilService systemUtilService;
-
-  @GetMapping("/param/syspara")
-  public String sysparaView() {
-    return "system/param/syspara";
-  }
-
-  @GetMapping("/param/sysparalist")
-  @PreAuthorize("hasPermission('/param/syspara','')")
-  @ResponseBody
-  public PageResult<TSyspara> getDataList(@RequestParam("page") Integer pageNo,
-                                          @RequestParam("limit") Integer pageSize,
-                                          @RequestParam(value = "paraid", required = false) Integer paraid,
-                                          @RequestParam(value = "paraname", required = false) String paraname) {
-    try {
-      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
-      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
-      return paramService.getSysparaPage(paraid, paraname, pageNo, pageSize);
-    } catch (Exception e) {
-      e.printStackTrace();
-      return new PageResult<>(99, "系统查询错误");
-    }
-  }
-
-  @PostMapping("/param/sysparaupdate")
-  @PreAuthorize("hasPermission('/param/sysparaupdate','')")
-  @ResponseBody
-  public JsonResult updateSyspara(@RequestParam("paraid") Integer paraid,
-                                  @RequestParam("paraval") String paraval) {
-    if (null == paraid || null == paraval) {
-      return JsonResult.error("参数传递错误");
-    } else if (paraval.length() > 30) {
-      return JsonResult.error("参数值过长");
-    }
-    TSyspara syspara = paramService.getSysparaByParaid(paraid);
-    if (null == syspara) {
-      return JsonResult.error("全局参数不存在");
-    }
-    syspara.setParaval(paraval);
-    syspara.setLastsaved(systemUtilService.getSysdatetime().getHostdatetime());
-    if (syspara.checkValueInvalid()) {
-      return JsonResult.error("参数值格式错误");
-    }
-    try {
-      if (paramService.updateSyspara(syspara)) {
-        return JsonResult.ok("修改成功");
-      } else {
-        return JsonResult.error("修改失败");
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-
-  /**
-   * ====================================================
-   * 业务参数配置
-   * ====================================================
-   */
-  @GetMapping("/param/businesspara")
-  public String busiparaView() {
-    return "system/param/businesspara";
-  }
-
-  @GetMapping("/param/businessparalist")
-  @PreAuthorize("hasPermission('/param/businesspara','')")
-  @ResponseBody
-  public PageResult<TBusinesspara> getBusinessDataList(@RequestParam("page") Integer pageNo,
-                                                       @RequestParam("limit") Integer pageSize,
-                                                       @RequestParam(value = "paraname", required = false) String paraname) {
-    try {
-      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
-      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
-      return paramService.getBusinessparaPage(paraname, pageNo, pageSize);
-    } catch (Exception e) {
-      e.printStackTrace();
-      return new PageResult<>(99, "系统查询错误");
-    }
-  }
-
-  @PostMapping("/param/deletebusinesspara")
-  @PreAuthorize("hasPermission('/param/deletebusinesspara','')")
-  @ResponseBody
-  public JsonResult deleteBusinesspara(@RequestParam("parakey") String parakey) {
-    try {
-      if (StringUtil.isEmpty(parakey)) {
-        return JsonResult.error("参数名为空");
-      }
-      TBusinesspara businesspara = paramService.getBusinessparaByParakey(parakey);
-      if (null == businesspara) {
-        return JsonResult.error("业务参数[" + parakey + "]不存在！");
-      }
-      if (paramService.deleteBusinesspara(businesspara)) {
-        return JsonResult.ok("删除成功！");
-      } else {
-        return JsonResult.error("删除失败！");
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-  @PostMapping("/param/businessparaupdate")
-  @PreAuthorize("hasPermission('/param/businessparaupdate','')")
-  @ResponseBody
-  public JsonResult updateBusinesspara(@RequestParam("parakey") String parakey, @RequestParam("paraval") String paraval) {
-    try {
-      if (StringUtil.isEmpty(parakey) || null == paraval) {
-        return JsonResult.error("参数传递错误");
-      }
-      TBusinesspara businesspara = paramService.getBusinessparaByParakey(parakey);
-      if (null == businesspara) {
-        return JsonResult.error("业务参数[" + parakey + "]不存在！");
-      }
-      businesspara.setParaval(paraval);
-      if (paramService.saveOrUpdateBusinesspara(businesspara)) {
-        return JsonResult.ok("修改成功！");
-      } else {
-        return JsonResult.error("修改失败！");
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-  @GetMapping("/param/load4addbuspara")
-  @PreAuthorize("hasPermission('/param/load4addbuspara','')")
-  public String loadadd() {
-    return "system/param/busparaform";
-  }
-
-  @GetMapping("/param/checkbusname")
-  @ResponseBody
-  public JsonResult checkname(@RequestParam("parakey") String parakey) {
-    TBusinesspara businesspara = paramService.getBusinessparaByParakey(parakey);
-    if (businesspara == null) {
-      return JsonResult.ok();
-    } else {
-      return JsonResult.error("参数名重复");
-    }
-  }
-
-  @PostMapping("/param/addbusinesspara")
-  @PreAuthorize("hasPermission('/param/addbusinesspara','')")
-  @ResponseBody
-  public JsonResult addBusinesspara(@RequestParam("parakey") String parakey, @RequestParam("paraval") String paraval) {
-    if (StringUtil.isEmpty(parakey) || null == paraval) {
-      return JsonResult.error("参数传递错误");
-    }
-    try {
-      TBusinesspara businesspara = paramService.getBusinessparaByParakey(parakey);
-      if (null != businesspara) {
-        return JsonResult.error("参数名重复");
-      }
-      businesspara = new TBusinesspara();
-      businesspara.setParakey(parakey.trim());
-      businesspara.setParaval(paraval.trim());
-      if (paramService.saveOrUpdateBusinesspara(businesspara)) {
-        return JsonResult.ok("新增成功！");
-      } else {
-        return JsonResult.error("新增失败！");
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-
-  /**
-   * ====================================================
-   * APPID应用权限参数管理
-   * ====================================================
-   */
-  @GetMapping("/param/apiclientpara")
-  public String appidParaView() {
-    return "system/param/apiclientpara";
-  }
-
-  @GetMapping("/param/apiclientparalist")
-  @PreAuthorize("hasPermission('/param/apiclientpara','')")
-  @ResponseBody
-  public PageResult<TApiClient> getApiclientDataList(@RequestParam("page") Integer pageNo,
-                                                     @RequestParam("limit") Integer pageSize,
-                                                     @RequestParam(value = "appid", required = false) String appid) {
-    try {
-      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
-      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
-      return paramService.getApiClientparaPage(appid, pageNo, pageSize);
-    } catch (Exception e) {
-      e.printStackTrace();
-      return new PageResult<>(99, "系统查询错误");
-    }
-  }
-
-  @GetMapping("/param/load4addapiclient")
-  @PreAuthorize("hasPermission('/param/load4addapiclient','')")
-  public String load4AddApiclientPara(Model model) {
-    Map<String, String> roles = new HashMap<>(0);
-    roles.put("ROLE_THIRD_COMMON", "ROLE_THIRD_COMMON");
-    roles.put("ROLE_THIRD_CONSUME", "ROLE_THIRD_CONSUME");
-    roles.put("ROLE_THIRD_DEPOSIT", "ROLE_THIRD_DEPOSIT");
-    roles.put("ROLE_THIRD_SHOP", "ROLE_THIRD_SHOP");
-    roles.put("ROLE_THIRD_ADMIN", "ROLE_THIRD_ADMIN");
-    model.addAttribute("rolelist", roles);
-    return "system/param/apiclientform";
-  }
-
-  @PostMapping("/param/updateapiclientstate")
-  @PreAuthorize("hasPermission('/param/updateapiclientstate','')")
-  @ResponseBody
-  public JsonResult updateApiclientState(@RequestParam("appid") String appid, @RequestParam("state") String state) {
-    if (StringUtil.isEmpty(appid) || (!TradeDict.STATUS_NORMAL.equals(state) && !TradeDict.STATUS_CLOSED.equals(state))) {
-      return JsonResult.error("参数传递错误");
-    }
-    try {
-      TApiClient apiClient = paramService.getApiClientByAppid(appid);
-      if (null == apiClient) {
-        return JsonResult.error("应用参数不存在");
-      } else if (state.equals(apiClient.getStatus())) {
-        return JsonResult.error("状态修改错误，请刷新查询");
-      }
-      apiClient.setStatus(state);
-      if (paramService.saveOrUpdateApiClient(apiClient)) {
-        return JsonResult.ok(TradeDict.STATUS_NORMAL.equals(state) ? "启用成功" : "关闭成功");
-      } else {
-        return JsonResult.error(TradeDict.STATUS_NORMAL.equals(state) ? "启用失败" : "关闭失败");
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-  @PostMapping("/param/deleteapiclient")
-  @PreAuthorize("hasPermission('/param/deleteapiclient','')")
-  @ResponseBody
-  public JsonResult deleteApiclientParam(@RequestParam("appid") String appid) {
-    if (StringUtil.isEmpty(appid)) {
-      return JsonResult.error("参数传递错误");
-    }
-    try {
-      TApiClient apiClient = paramService.getApiClientByAppid(appid);
-      if (null == apiClient) {
-        return JsonResult.error("应用参数不存在");
-      }
-
-      if (paramService.deleteApiClient(apiClient)) {
-        return JsonResult.ok("删除成功");
-      } else {
-        return JsonResult.error("删除失败");
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-  @PostMapping("/param/updateapiclientpara")
-  @PreAuthorize("hasPermission('/param/updateapiclientpara','')")
-  @ResponseBody
-  public JsonResult updateApiclientSecret(@RequestParam("appid") String appid,
-                                          @RequestParam(value = "secret", required = false) String secret,
-                                          @RequestParam(value = "roles", required = false) String roles) {
-    if (StringUtil.isEmpty(appid) || (StringUtil.isEmpty(secret) && StringUtil.isEmpty(roles))) {
-      return JsonResult.error("参数传递错误");
-    }
-    try {
-      TApiClient apiClient = paramService.getApiClientByAppid(appid);
-      if (null == apiClient) {
-        return JsonResult.error("应用参数不存在");
-      }
-      if (!StringUtil.isEmpty(secret)) {
-        apiClient.setSecret(secret);
-      }
-      if (!StringUtil.isEmpty(roles)) {
-        apiClient.setRoles(roles);
-      }
-      if (paramService.saveOrUpdateApiClient(apiClient)) {
-        return JsonResult.ok("修改成功");
-      } else {
-        return JsonResult.error("修改失败");
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-  @PostMapping("/param/addapiclientpara")
-  @PreAuthorize("hasPermission('/param/addapiclientpara','')")
-  @ResponseBody
-  public JsonResult addApiclientPara(@RequestParam("appid") String appid,
-                                     @RequestParam("roles") String roles) {
-    if (StringUtil.isEmpty(appid) || StringUtil.isEmpty(roles)) {
-      return JsonResult.error("参数传递错误");
-    }
-    try {
-      TApiClient apiClient = paramService.getApiClientByAppid(appid);
-      if (null != apiClient) {
-        return JsonResult.error("APPID重复");
-      }
-      apiClient = new TApiClient();
-      apiClient.setAppid(appid.trim());
-      apiClient.setSecret(RandomUtils.getUUIDStr());
-      apiClient.setStatus(TradeDict.STATUS_NORMAL);
-      apiClient.setRoles(roles);
-      if (paramService.saveOrUpdateApiClient(apiClient)) {
-        return JsonResult.ok("新增成功");
-      } else {
-        return JsonResult.error("新增失败");
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-  /**
-   * ====================================================
-   * 支付能力配置
-   * ====================================================
-   */
-  @GetMapping("/param/paytype")
-  public String paytypeView() {
-    return "system/param/paytype";
-  }
-
-  @GetMapping("/param/paytypelist")
-  @PreAuthorize("hasPermission('/param/paytype','')")
-  @ResponseBody
-  public PageResult<TSourceType> getPaytypeDataList(@RequestParam("page") Integer pageNo,
-                                                    @RequestParam("limit") Integer pageSize,
-                                                    @RequestParam(value = "paytype", required = false) String paytype) {
-    try {
-      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
-      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
-      return paramService.getPaytypePage(paytype, pageNo, pageSize);
-    } catch (Exception e) {
-      e.printStackTrace();
-      return new PageResult<>(99, "系统查询错误");
-    }
-  }
-
-  @GetMapping("/param/load4addpaytype")
-  @PreAuthorize("hasPermission('/param/load4addpaytype','')")
-  public String load4AddPaytype(Model model) {
-    return "system/param/paytypeform";
-  }
-
-  @PostMapping("/param/updatepaytypestate")
-  @PreAuthorize("hasPermission('/param/updatepaytypestate','')")
-  @ResponseBody
-  public JsonResult updatePaytypeState(@RequestParam("paytype") String paytype,
-                                       @RequestParam("state") Boolean state,
-                                       @RequestParam(value = "optype", required = false) String optype) {
-    if (StringUtil.isEmpty(paytype)
-        || (!StringUtil.isEmpty(optype) && !"charge".equals(optype) && !"consume".equals(optype) && !"anonymous".equals(optype))) {
-      return JsonResult.error("参数传递错误");
-    }
-    try {
-      TSourceType tPaytype = paramService.getPaytype(paytype);
-      if (null == tPaytype) {
-        return JsonResult.error("支付方式不存在！");
-      }
-      if ("charge".equals(optype)) {
-        if (state.equals(tPaytype.isChargeEnable())) {
-          return JsonResult.error("状态错误，请重新查询后操作");
-        }
-        tPaytype.setChargeEnable(state);
-      } else if ("consume".equals(optype)) {
-        if (state.equals(tPaytype.getConsumeEnable())) {
-          return JsonResult.error("状态错误，请重新查询后操作");
-        }
-        tPaytype.setConsumeEnable(state);
-      } else if ("anonymous".equals(optype)) {
-        if (state.equals(tPaytype.getAnonymousEnable())) {
-          return JsonResult.error("状态错误，请重新查询后操作");
-        }
-        tPaytype.setAnonymousEnable(state);
-      } else {
-        if (state.equals(tPaytype.getEnable())) {
-          return JsonResult.error("状态错误，请重新查询后操作");
-        }
-        tPaytype.setEnable(state); //默认切换主状态
-      }
-
-      if (paramService.saveOrUpdatePaytype(tPaytype)) {
-        return JsonResult.ok(state ? "启用成功" : "关闭成功");
-      } else {
-        return JsonResult.error(!state ? "启用失败" : "关闭失败");
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-  @PostMapping("/param/updatepaytypename")
-  @PreAuthorize("hasPermission('/param/updatepaytypename','')")
-  @ResponseBody
-  public JsonResult updatePaytypeName(@RequestParam("paytype") String paytype,
-                                      @RequestParam("paydesc") String paydesc) {
-    if (StringUtil.isEmpty(paytype) || StringUtil.isEmpty(paydesc)) {
-      return JsonResult.error("参数传递错误");
-    }
-    try {
-      TSourceType tPaytype = paramService.getPaytype(paytype);
-      if (null == tPaytype) {
-        return JsonResult.error("支付方式不存在！");
-      }
-      tPaytype.setPaydesc(paydesc.trim());
-      if (paramService.saveOrUpdatePaytype(tPaytype)) {
-        return JsonResult.ok("修改成功");
-      } else {
-        return JsonResult.error("修改失败");
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-  @PostMapping("/param/deletepaytype")
-  @PreAuthorize("hasPermission('/param/deletepaytype','')")
-  @ResponseBody
-  public JsonResult deletePaytype(@RequestParam("paytype") String paytype) {
-    try {
-      TSourceType tPaytype = paramService.getPaytype(paytype);
-      if (null == tPaytype) {
-        return JsonResult.error("支付方式不存在！");
-      }
-      if (paramService.deletePaytype(tPaytype)) {
-        return JsonResult.ok("删除成功");
-      } else {
-        return JsonResult.error("删除失败");
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-  @PostMapping("/param/addpaytype")
-  @PreAuthorize("hasPermission('/param/addpaytype','')")
-  @ResponseBody
-  public JsonResult addPaytype(@RequestParam("paytype") String paytype,
-                               @RequestParam(value = "enable", required = false, defaultValue = "no") String enable,
-                               @RequestParam(value = "chargeEnable", required = false, defaultValue = "no") String chargeEnable,
-                               @RequestParam(value = "consumeEnable", required = false, defaultValue = "no") String consumeEnable,
-                               @RequestParam(value = "anonymousEnable", required = false, defaultValue = "no") String anonymousEnable,
-                               @RequestParam("paydesc") String paydesc) {
-    try {
-      TSourceType tPaytype = paramService.getPaytype(paytype);
-      if (null != tPaytype) {
-        return JsonResult.error("支付方式已经存在");
-      }
-      tPaytype = new TSourceType();
-      tPaytype.setSourceType(paytype.trim());
-      if (StringUtil.isEmpty(paydesc)) return JsonResult.error("支付名称不能为空！");
-      tPaytype.setPaydesc(paydesc.trim());
-      tPaytype.setEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(enable));
-      tPaytype.setChargeEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(chargeEnable));
-      tPaytype.setConsumeEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(consumeEnable));
-      tPaytype.setAnonymousEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(anonymousEnable));
-      if (paramService.saveOrUpdatePaytype(tPaytype)) {
-        return JsonResult.ok("新增成功");
-      } else {
-        return JsonResult.error("新增失败");
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-  @GetMapping("/param/checkpaytype")
-  @ResponseBody
-  public JsonResult checkPaytype(@RequestParam("paytype") String paytype) {
-    TSourceType tPaytype = paramService.getPaytype(paytype);
-    if (null != tPaytype) {
-      return JsonResult.error("支付方式已经存在");
-    } else {
-      return JsonResult.ok("可以使用");
-    }
-  }
-
-  @GetMapping("/param/load4paytypeconfig")
-  @PreAuthorize("hasPermission('/param/load4paytypeconfig','')")
-  public String load4PaytypeConfig(@RequestParam("paytype") String paytype, Model model) {
-    List<TPaytypeConfig> configList = paramService.getPaytypeConfigList(paytype);
-    model.addAttribute("configlist", configList);
-    model.addAttribute("paytype", paytype);
-    return "system/param/paytypeconfig";
-  }
-
-  @PostMapping("/param/addpaytypeconfig")
-  @PreAuthorize("hasPermission('/param/addpaytypeconfig','')")
-  @ResponseBody
-  public JsonResult addPaytypeConfig(@RequestBody Map<String, String> param) {
-    String paytypeHtmlKey = "hid_paytype"; //页面上传来paytype的KEY
-    if (null == param || StringUtil.isEmpty(param.get(paytypeHtmlKey))) {
-      return JsonResult.error("参数传递错误");
-    }
-
-    try {
-      String paytype = param.get(paytypeHtmlKey).trim();
-      param.remove(paytypeHtmlKey);
-      if (paramService.savePaytypeConfig(paytype, param)) {
-        return JsonResult.ok("配置成功");
-      } else {
-        return JsonResult.error("配置失败");
-      }
-    } catch (WebCheckException ex) {
-      return JsonResult.error(ex.getMessage());
-    } catch (Exception e) {
-      e.printStackTrace();
-      return JsonResult.error("系统处理异常").put("exception", e);
-    }
-  }
-
-
-}
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/ShopController.java b/src/main/java/com/supwisdom/dlpay/system/controller/ShopController.java
new file mode 100644
index 0000000..5e64b4b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/ShopController.java
@@ -0,0 +1,76 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.api.domain.TShopPaytypeConfig;
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.*;
+import com.supwisdom.dlpay.system.bean.ShopConfigBean;
+import com.supwisdom.dlpay.system.service.DictionaryProxy;
+import com.supwisdom.dlpay.system.service.ParamService;
+import com.supwisdom.dlpay.system.service.ShopDataService;
+import com.supwisdom.dlpay.util.WebCheckException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Controller
+public class ShopController {
+  @Autowired
+  private ShopDataService shopDataService;
+  @Autowired
+  private ParamService paramService;
+  @Autowired
+  private SystemUtilService systemUtilService;
+
+  @Autowired
+  private DictionaryProxy dictionaryProxy;
+
+  @GetMapping("/shop/index")
+  public String shopView() {
+    return "system/shop/index";
+  }
+
+
+  /**
+   * ====================================================
+   * 商户支付能力配置
+   * ====================================================
+   */
+  @GetMapping("/shop/config")
+  public String shopConfigView(Model model) {
+//    model.addAttribute("paytypelist", shopDataService.getConsumePaytypes());
+    model.addAttribute(Dictionary.PAY_TYPE,
+        dictionaryProxy.<TSourceType>getDictionaryAsList(Dictionary.SOURCE_TYPE));
+    return "system/shop/config";
+  }
+
+
+  @GetMapping("/shop/load4addpaytype")
+  @PreAuthorize("hasPermission('/shop/load4addpaytype','')")
+  public String load4AddShopPaytype(Model model) {
+    model.addAttribute(Dictionary.PAY_TYPE,
+        dictionaryProxy.getDictionaryAsList(Dictionary.SOURCE_TYPE));
+    return "system/shop/configform";
+  }
+
+
+
+  @GetMapping("/shop/load4paytypepara")
+  @PreAuthorize("hasPermission('/shop/load4paytypepara','')")
+  public String load4AddShopPaytypePara(@RequestParam("shopaccno") String shopaccno,
+                                        @RequestParam("paytype") String paytype,
+                                        Model model) {
+    List<TShopPaytypeConfig> configList = shopDataService.getShopPaytypeConfigs(shopaccno, paytype);
+    model.addAttribute("configlist", configList);
+    model.addAttribute("shopaccno", shopaccno);
+    model.addAttribute("paytype", paytype);
+    return "system/shop/configpara";
+  }
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java b/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java
index 4ea1598..6b80220 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/UserController.java
@@ -2,13 +2,14 @@
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.api.domain.TAccount;
-import com.supwisdom.dlpay.framework.domain.TPerson;
 import com.supwisdom.dlpay.api.domain.TPointsAccount;
+import com.supwisdom.dlpay.framework.domain.TPerson;
+import com.supwisdom.dlpay.framework.util.Dictionary;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.framework.util.WebConstant;
-import com.supwisdom.dlpay.system.bean.IdTypeBean;
 import com.supwisdom.dlpay.system.bean.PersonParamBean;
+import com.supwisdom.dlpay.system.service.DictionaryProxy;
 import com.supwisdom.dlpay.system.service.UserDataService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -16,147 +17,142 @@
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.ArrayList;
-import java.util.List;
-
 @Controller
 public class UserController {
-    @Autowired
-    private UserDataService userDataService;
+  @Autowired
+  private UserDataService userDataService;
 
-    @GetMapping("/user/index")
-    public String index() {
-        return "system/user/index";
-    }
+  @Autowired
+  private DictionaryProxy dictionaryProxy;
 
-    @GetMapping("/user/list")
-    @PreAuthorize("hasPermission('/user/list','')")
-    @ResponseBody
-    public PageResult<TPerson> getDataList(@RequestParam("page") Integer pageNo,
-                                           @RequestParam("limit") Integer pageSize,
-                                           @RequestParam(value = "searchkey", required = false) String searchKey) {
-        try {
-            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
-            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
-            PersonParamBean searchBean = new PersonParamBean();
-            searchBean.setPageNo(pageNo);
-            searchBean.setName(searchKey);
-            searchBean.setPageSize(pageSize);
-            return userDataService.getPersonsByKey(searchBean);
-        } catch (Exception e) {
-            e.printStackTrace();
-            return new PageResult<>(99, "系统查询错误");
-        }
-    }
+  @GetMapping("/user/index")
+  public String index() {
+    return "system/user/index";
+  }
 
-    @GetMapping("/user/loadadd")
-    public String add(ModelMap map) {
-        List<IdTypeBean> list = new ArrayList<>();
-        list.add(new IdTypeBean("1", "身份证"));
-        list.add(new IdTypeBean("2", "护照"));
-        list.add(new IdTypeBean("3", "驾照"));
-        list.add(new IdTypeBean("4", "港澳通行证"));
-        list.add(new IdTypeBean("5", "学工号"));
-        list.add(new IdTypeBean("9", "其他"));
-        map.put("idtypes", list);
-        return "system/user/add";
+  @GetMapping("/user/list")
+  @PreAuthorize("hasPermission('/user/list','')")
+  @ResponseBody
+  public PageResult<TPerson> getDataList(@RequestParam("page") Integer pageNo,
+                                         @RequestParam("limit") Integer pageSize,
+                                         @RequestParam(value = "searchkey", required = false) String searchKey) {
+    try {
+      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+      PersonParamBean searchBean = new PersonParamBean();
+      searchBean.setPageNo(pageNo);
+      searchBean.setName(searchKey);
+      searchBean.setPageSize(pageSize);
+      return userDataService.getPersonsByKey(searchBean);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
     }
+  }
 
-    @PostMapping("/user/add")
-    @PreAuthorize("hasPermission('/user/add','')")
-    @ResponseBody
-    public JsonResult add(@RequestBody TPerson person) {
-        if (StringUtil.isEmpty(person.getName())
-                || StringUtil.isEmpty(person.getSex())
-                || StringUtil.isEmpty(person.getIdno())
-                || StringUtil.isEmpty(person.getIdtype())
-                || StringUtil.isEmpty(person.getMobile())) {
-            return JsonResult.error("参数错误");
-        }
-        return userDataService.saveUser(person);
-    }
+  @GetMapping("/user/loadadd")
+  public String add(ModelMap map) {
+    map.put(Dictionary.IDTYPE, dictionaryProxy.getDictionaryAsList(Dictionary.IDTYPE));
+    return "system/user/add";
+  }
 
-    @PostMapping("/user/del")
-    @PreAuthorize("hasPermission('/user/del','')")
-    @ResponseBody
-    public JsonResult del(@RequestParam String userid) {
-        if (StringUtil.isEmpty(userid)) {
-            return JsonResult.error("参数错误");
-        }
-        return userDataService.deleteUser(userid);
+  @PostMapping("/user/add")
+  @PreAuthorize("hasPermission('/user/add','')")
+  @ResponseBody
+  public JsonResult add(@RequestBody TPerson person) {
+    if (StringUtil.isEmpty(person.getName())
+        || StringUtil.isEmpty(person.getSex())
+        || StringUtil.isEmpty(person.getIdno())
+        || StringUtil.isEmpty(person.getIdtype())
+        || StringUtil.isEmpty(person.getMobile())) {
+      return JsonResult.error("参数错误");
     }
+    return userDataService.saveUser(person);
+  }
 
-    @GetMapping("/user/acc")
-    public String acc() {
-        return "system/user/account";
+  @PostMapping("/user/del")
+  @PreAuthorize("hasPermission('/user/del','')")
+  @ResponseBody
+  public JsonResult del(@RequestParam String userid) {
+    if (StringUtil.isEmpty(userid)) {
+      return JsonResult.error("参数错误");
     }
+    return userDataService.deleteUser(userid);
+  }
 
-    @GetMapping("/user/account")
-    @PreAuthorize("hasPermission('/user/account','')")
-    @ResponseBody
-    public PageResult<TAccount> getDataAccountList(@RequestParam("page") Integer pageNo,
-                                                   @RequestParam("limit") Integer pageSize,
-                                                   @RequestParam(value = "searchkey", required = false) String searchKey) {
-        try {
-            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
-            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
-            PersonParamBean searchBean = new PersonParamBean();
-            searchBean.setPageNo(pageNo);
-            searchBean.setName(searchKey);
-            searchBean.setPageSize(pageSize);
-            return userDataService.getAccountsByKey(searchBean);
-        } catch (Exception e) {
-            e.printStackTrace();
-            return new PageResult<>(99, "系统查询错误");
-        }
-    }
+  @GetMapping("/user/acc")
+  public String acc() {
+    return "system/user/account";
+  }
 
-    @GetMapping("/user/point")
-    public String point() {
-        return "system/user/point";
+  @GetMapping("/user/account")
+  @PreAuthorize("hasPermission('/user/account','')")
+  @ResponseBody
+  public PageResult<TAccount> getDataAccountList(@RequestParam("page") Integer pageNo,
+                                                 @RequestParam("limit") Integer pageSize,
+                                                 @RequestParam(value = "searchkey", required = false) String searchKey) {
+    try {
+      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+      PersonParamBean searchBean = new PersonParamBean();
+      searchBean.setPageNo(pageNo);
+      searchBean.setName(searchKey);
+      searchBean.setPageSize(pageSize);
+      return userDataService.getAccountsByKey(searchBean);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
     }
+  }
 
-    @GetMapping("/user/pointlist")
-    @PreAuthorize("hasPermission('/user/pointlist','')")
-    @ResponseBody
-    public PageResult<TPointsAccount> getDataPointList(@RequestParam("page") Integer pageNo,
-                                                       @RequestParam("limit") Integer pageSize,
-                                                       @RequestParam(value = "searchkey", required = false) String searchKey) {
-        try {
-            if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
-            if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
-            PersonParamBean searchBean = new PersonParamBean();
-            searchBean.setPageNo(pageNo);
-            searchBean.setName(searchKey);
-            searchBean.setPageSize(pageSize);
-            return userDataService.getPointsByKey(searchBean);
-        } catch (Exception e) {
-            e.printStackTrace();
-            return new PageResult<>(99, "系统查询错误");
-        }
-    }
+  @GetMapping("/user/point")
+  public String point() {
+    return "system/user/point";
+  }
 
-    @PostMapping("/user/delacc")
-    @PreAuthorize("hasPermission('/user/delacc','')")
-    @ResponseBody
-    public JsonResult delacc(@RequestParam String accno) {
-        if (StringUtil.isEmpty(accno)) {
-            return JsonResult.error("参数错误");
-        }
-        return userDataService.closeAccount(accno);
+  @GetMapping("/user/pointlist")
+  @PreAuthorize("hasPermission('/user/pointlist','')")
+  @ResponseBody
+  public PageResult<TPointsAccount> getDataPointList(@RequestParam("page") Integer pageNo,
+                                                     @RequestParam("limit") Integer pageSize,
+                                                     @RequestParam(value = "searchkey", required = false) String searchKey) {
+    try {
+      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+      PersonParamBean searchBean = new PersonParamBean();
+      searchBean.setPageNo(pageNo);
+      searchBean.setName(searchKey);
+      searchBean.setPageSize(pageSize);
+      return userDataService.getPointsByKey(searchBean);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
     }
-    @PostMapping("/user/delpoint")
-    @PreAuthorize("hasPermission('/user/delpoint','')")
-    @ResponseBody
-    public JsonResult delpoint(@RequestParam String userid) {
-        if (StringUtil.isEmpty(userid)) {
-            return JsonResult.error("参数错误");
-        }
-        return userDataService.deletePoint(userid);
+  }
+
+  @PostMapping("/user/delacc")
+  @PreAuthorize("hasPermission('/user/delacc','')")
+  @ResponseBody
+  public JsonResult delacc(@RequestParam String accno) {
+    if (StringUtil.isEmpty(accno)) {
+      return JsonResult.error("参数错误");
     }
-    @GetMapping("/user/pointdtl")
-    public String pointdtl(@RequestParam String userid,ModelMap map) {
-        map.put("userid",userid);
-        return "system/user/pointdtl";
+    return userDataService.closeAccount(accno);
+  }
+
+  @PostMapping("/user/delpoint")
+  @PreAuthorize("hasPermission('/user/delpoint','')")
+  @ResponseBody
+  public JsonResult delpoint(@RequestParam String userid) {
+    if (StringUtil.isEmpty(userid)) {
+      return JsonResult.error("参数错误");
     }
+    return userDataService.deletePoint(userid);
+  }
+
+  @GetMapping("/user/pointdtl")
+  public String pointdtl(@RequestParam String userid, ModelMap map) {
+    map.put("userid", userid);
+    return "system/user/pointdtl";
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/DictionaryDataService.java b/src/main/java/com/supwisdom/dlpay/system/service/DictionaryDataService.java
index a378a8c..b750f81 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/DictionaryDataService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/DictionaryDataService.java
@@ -1,12 +1,10 @@
 package com.supwisdom.dlpay.system.service;
 
-import java.util.HashMap;
+import com.supwisdom.dlpay.framework.domain.TDictionary;
+
+import java.util.List;
 
 public interface DictionaryDataService {
-  HashMap<String, Object> getSystemAllSourcetype();
-
-  HashMap<String, Object> getDictionaryByDicttype(int dicttype);
-
-
+  List<TDictionary> getDictionaryByDictType(String dicttype);
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/DictionaryProxy.java b/src/main/java/com/supwisdom/dlpay/system/service/DictionaryProxy.java
new file mode 100644
index 0000000..723e954
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/service/DictionaryProxy.java
@@ -0,0 +1,50 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.framework.domain.DictionaryTable;
+import com.supwisdom.dlpay.framework.util.Dictionary;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class DictionaryProxy {
+  private final DictionaryDataService dictionaryDataService;
+
+  private final ParamService paramService;
+
+  public DictionaryProxy(DictionaryDataService dictionaryDataService, ParamService paramService) {
+    this.dictionaryDataService = dictionaryDataService;
+    this.paramService = paramService;
+  }
+
+  @SuppressWarnings("UNCHECKED_CAST")
+  public <T> Map<String, T> getDictionaryObject(String dictType) {
+    List<T> list = getDictionaryAsList(dictType);
+    Map<String, T> result = new HashMap<>();
+    for (Object item : list) {
+      if (item instanceof DictionaryTable) {
+        result.put(((DictionaryTable) item).getDictKey(), (T) item);
+      }
+    }
+    return result;
+  }
+
+  public Map<String, Object> getDictionaryAsMap(String dictType) {
+    List list = getDictionaryAsList(dictType);
+    Map<String, Object> result = new HashMap<>();
+    for (Object item : list) {
+      if (item instanceof DictionaryTable) {
+        DictionaryTable it = (DictionaryTable) item;
+        result.put(it.getDictKey(), it.getDictValue());
+      }
+    }
+    return result;
+  }
+
+  @SuppressWarnings("UNCHECKED_CAST")
+  public <T> List<T> getDictionaryAsList(String dictType) {
+      return (List<T>) dictionaryDataService.getDictionaryByDictType(dictType);
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/DtlDataService.java b/src/main/java/com/supwisdom/dlpay/system/service/DtlDataService.java
index fa0affe..8735059 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/DtlDataService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/DtlDataService.java
@@ -2,8 +2,6 @@
 
 import com.supwisdom.dlpay.api.domain.TPersondtl;
 import com.supwisdom.dlpay.api.domain.TShopdtl;
-import com.supwisdom.dlpay.framework.domain.TDictionary;
-import com.supwisdom.dlpay.framework.domain.TTranscode;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.system.bean.ShopdtlSearchBean;
 import com.supwisdom.dlpay.system.bean.TreeSelectNode;
@@ -20,12 +18,4 @@
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
   PageResult<TShopdtl> getShopdtlPage(ShopdtlSearchBean searchBean, int pageNo, int pageSize);
 
-  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
-  List<TTranscode> getAllTranscodes();
-
-  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
-  List<TDictionary> getAllDtlStatus();
-
-  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
-  List<TreeSelectNode> getTreeSelectShops();
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/FunctionService.java b/src/main/java/com/supwisdom/dlpay/system/service/FunctionService.java
index 8884b21..4f1c841 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/FunctionService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/FunctionService.java
@@ -22,7 +22,7 @@
   PageResult<TFunction> getFunctionsByKey(FunctionSearchBean param);
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
-  TFunction getFunctionByNameAndId(String name,Integer id);
+  TFunction getFunctionByNameAndId(String name, Integer id);
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   JsonResult saveFunction(TFunction function);
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/OperatorService.java b/src/main/java/com/supwisdom/dlpay/system/service/OperatorService.java
index 3954045..6d0e612 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/OperatorService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/OperatorService.java
@@ -19,7 +19,7 @@
     boolean checkOpercodeExists(String opercode, String operid);
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    boolean saveOperator(TOperator operator,String roles);
+    boolean saveOperator(TOperator operator, String roles);
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
     TOperator getOperatorByCode(String opercode);
@@ -31,7 +31,7 @@
     boolean resetPwd(String operid);
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    boolean updateState(String operid,String state);
+    boolean updateState(String operid, String state);
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     boolean saveOperLog(TOperLog log);
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java b/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
index 3d2b0e8..093e9a9 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
@@ -1,7 +1,7 @@
 package com.supwisdom.dlpay.system.service;
 
-import com.supwisdom.dlpay.api.domain.TSourceType;
 import com.supwisdom.dlpay.api.domain.TPaytypeConfig;
+import com.supwisdom.dlpay.api.domain.TSourceType;
 import com.supwisdom.dlpay.framework.domain.TApiClient;
 import com.supwisdom.dlpay.framework.domain.TBusinesspara;
 import com.supwisdom.dlpay.framework.domain.TSyspara;
@@ -33,9 +33,6 @@
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   boolean deleteBusinesspara(TBusinesspara businesspara);
 
-  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-  boolean saveOrUpdateBusinesspara(TBusinesspara businesspara);
-
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
   PageResult<TApiClient> getApiClientparaPage(String appid, int pageNo, int pageSize);
 
@@ -49,23 +46,23 @@
   boolean deleteApiClient(TApiClient apiClient);
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
-  PageResult<TSourceType> getPaytypePage(String paytype, int pageNo, int pageSize);
+  PageResult<TSourceType> getSourceTypePage(String paytype, int pageNo, int pageSize);
+
+  @Transactional(readOnly = true)
+  List<TSourceType> getAllSourceType();
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
-  TSourceType getPaytype(String paytype);
+  TSourceType getSourceType(String paytype);
+
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-  boolean saveOrUpdatePaytype(TSourceType paytype);
-
-  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-  boolean deletePaytype(TSourceType paytype);
+  boolean deleteSourceType(TSourceType paytype);
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
-  List<TPaytypeConfig> getPaytypeConfigList(String paytype);
+  List<TPaytypeConfig> getSourceTypeConfigList(String paytype);
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-  boolean savePaytypeConfig(String paytype, Map<String, String> param) throws WebCheckException;
-
+  boolean saveSourceTypeConfig(String paytype, Map<String, String> param) throws WebCheckException;
 
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/SettleReportService.java b/src/main/java/com/supwisdom/dlpay/system/service/SettleReportService.java
new file mode 100644
index 0000000..e6d580b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/service/SettleReportService.java
@@ -0,0 +1,31 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.system.bean.ShopBusinessShowBean;
+import com.supwisdom.dlpay.system.bean.SubjectDayShowBean;
+import com.supwisdom.dlpay.system.bean.SubjectDetailShowBean;
+import com.supwisdom.dlpay.system.bean.TreeSelectNode;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface SettleReportService {
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  String getSystemSettledate();
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  PageResult<SubjectDayShowBean> getSubjectDayInfos(String startdate, String enddate, boolean nodealshow);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  PageResult<SubjectDetailShowBean> getSubjectDetailInfos(String startdate, String enddate, String subjno, int pageNo, int pageSize);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  List<TreeSelectNode> getSystemShowSubjectTree();
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  List<TreeSelectNode> getSystemNormalShopTree();
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  PageResult<ShopBusinessShowBean> getShopBusinessShowInfos(String startdate, String enddate, String shopid, boolean nodealshow);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/ShopDataService.java b/src/main/java/com/supwisdom/dlpay/system/service/ShopDataService.java
new file mode 100644
index 0000000..a39475e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/service/ShopDataService.java
@@ -0,0 +1,21 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.api.domain.TShopPaytype;
+import com.supwisdom.dlpay.api.domain.TShopPaytypeConfig;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.system.bean.ShopConfigBean;
+import com.supwisdom.dlpay.system.bean.ZTreeNode;
+import com.supwisdom.dlpay.util.WebCheckException;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface ShopDataService {
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+  TShopPaytype getShopPaytype(String shopaccno, String paytype);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+  List<TShopPaytypeConfig> getShopPaytypeConfigs(String shopaccno, String paytype);
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java b/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
index e25e020..d60e949 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/UserDataService.java
@@ -2,9 +2,9 @@
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.api.domain.TAccount;
-import com.supwisdom.dlpay.framework.domain.TPerson;
 import com.supwisdom.dlpay.api.domain.TPersonIdentity;
 import com.supwisdom.dlpay.api.domain.TPointsAccount;
+import com.supwisdom.dlpay.framework.domain.TPerson;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.system.bean.PersonParamBean;
 import org.springframework.transaction.annotation.Propagation;
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/DictionaryDataServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/DictionaryDataServiceImpl.java
index 85e9438..b1ab465 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/DictionaryDataServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/DictionaryDataServiceImpl.java
@@ -1,45 +1,31 @@
 package com.supwisdom.dlpay.system.service.impl;
 
-import com.supwisdom.dlpay.api.dao.SourceTypeDao;
-import com.supwisdom.dlpay.api.domain.TSourceType;
 import com.supwisdom.dlpay.framework.dao.DictionaryDao;
 import com.supwisdom.dlpay.framework.domain.TDictionary;
-import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.system.service.DictionaryDataService;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
+import java.util.ArrayList;
 import java.util.List;
 
 @Service
 public class DictionaryDataServiceImpl implements DictionaryDataService {
-  @Autowired
-  private SourceTypeDao sourceTypeDao;
-  @Autowired
-  private DictionaryDao dictionaryDao;
+  private final DictionaryDao dictionaryDao;
 
-  @Override
-  public HashMap<String, Object> getSystemAllSourcetype() {
-    HashMap<String, Object> result = new HashMap<>(0);
-    List<TSourceType> list = sourceTypeDao.findAll();
-    if (!StringUtil.isEmpty(list)) {
-      for (TSourceType tst : list) {
-        result.put(tst.getSourceType(), tst.getPaydesc());
-      }
-    }
-    return result;
+  public DictionaryDataServiceImpl(DictionaryDao dictionaryDao) {
+    this.dictionaryDao = dictionaryDao;
+
   }
 
   @Override
-  public HashMap<String, Object> getDictionaryByDicttype(int dicttype) {
-    HashMap<String, Object> result = new HashMap<>(0);
+  @Cacheable(cacheNames = "dicationary_cache", key = "#p0")
+  public List<TDictionary> getDictionaryByDictType(String dicttype) {
     List<TDictionary> list = dictionaryDao.findAllByDicttype(dicttype);
-    if (!StringUtil.isEmpty(list)) {
-      for (TDictionary dict : list) {
-        result.put(dict.getDictval() == null ? "" : dict.getDictval(), dict.getDictcaption());
-      }
+    if (!list.isEmpty()) {
+      return list;
     }
-    return result;
+    return new ArrayList<>();
   }
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/DtlDataServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/DtlDataServiceImpl.java
new file mode 100644
index 0000000..66fb425
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/DtlDataServiceImpl.java
@@ -0,0 +1,122 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.api.dao.PersondtlDao;
+import com.supwisdom.dlpay.api.dao.ShopdtlDao;
+import com.supwisdom.dlpay.api.domain.TPersondtl;
+import com.supwisdom.dlpay.api.domain.TShopdtl;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.bean.ShopdtlSearchBean;
+import com.supwisdom.dlpay.system.bean.TreeSelectNode;
+import com.supwisdom.dlpay.system.bean.UserdtlSearchBean;
+import com.supwisdom.dlpay.system.service.DictionaryProxy;
+import com.supwisdom.dlpay.system.service.DtlDataService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class DtlDataServiceImpl implements DtlDataService {
+  @Autowired
+  private PersondtlDao persondtlDao;
+  @Autowired
+  private ShopdtlDao shopdtlDao;
+  @Autowired
+  private DictionaryProxy dictionaryProxy;
+
+
+  @Override
+  public PageResult<TPersondtl> getPersondtlPage(UserdtlSearchBean searchBean, int pageNo, int pageSize) {
+    Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC, "refno"));
+    Page<TPersondtl> page = persondtlDao.findAll(new Specification<TPersondtl>() {
+      @Override
+      public Predicate toPredicate(Root<TPersondtl> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+        List<Predicate> predicates = new ArrayList<>();
+        if (!StringUtil.isEmpty(searchBean.getStartAccdate())) {
+          predicates.add(criteriaBuilder.ge(root.get("accdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getStartAccdate()))));
+        }
+        if (!StringUtil.isEmpty(searchBean.getEndAccdate())) {
+          predicates.add(criteriaBuilder.le(root.get("accdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getEndAccdate()))));
+        }
+        if (!StringUtil.isEmpty(searchBean.getStartTransdate())) {
+          predicates.add(criteriaBuilder.ge(root.get("transdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getStartTransdate()))));
+
+        }
+        if (!StringUtil.isEmpty(searchBean.getEndTransdate())) {
+          predicates.add(criteriaBuilder.le(root.get("transdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getEndTransdate()))));
+        }
+        if (!StringUtil.isEmpty(searchBean.getPersonname())) {
+          predicates.add(criteriaBuilder.like(root.get("userName").as(String.class), "%" + searchBean.getPersonname().trim() + "%"));
+        }
+        if (!StringUtil.isEmpty(searchBean.getSourcetype())) {
+          predicates.add(criteriaBuilder.equal(root.get("sourceType").as(String.class), searchBean.getSourcetype().trim()));
+        }
+        if (!StringUtil.isEmpty(searchBean.getTradeflag())) {
+          predicates.add(criteriaBuilder.equal(root.get("tradeflag").as(String.class), searchBean.getTradeflag().trim()));
+        }
+        if (!StringUtil.isEmpty(searchBean.getTranscode())) {
+          predicates.add(criteriaBuilder.equal(root.get("transcode").as(String.class), searchBean.getTranscode().trim()));
+        }
+        if (!StringUtil.isEmpty(searchBean.getStatus())) {
+          predicates.add(criteriaBuilder.equal(root.get("status").as(String.class), searchBean.getStatus().trim()));
+        }
+        return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+      }
+    }, pageable);
+    return new PageResult<>(page);
+  }
+
+  @Override
+  public PageResult<TShopdtl> getShopdtlPage(ShopdtlSearchBean searchBean, int pageNo, int pageSize) {
+    Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC, "refno"));
+    Page<TShopdtl> page = shopdtlDao.findAll((Specification<TShopdtl>) (root, query, criteriaBuilder) -> {
+      List<Predicate> predicates = new ArrayList<>();
+      if (!StringUtil.isEmpty(searchBean.getStartAccdate())) {
+        predicates.add(criteriaBuilder.ge(root.get("accdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getStartAccdate()))));
+      }
+      if (!StringUtil.isEmpty(searchBean.getEndAccdate())) {
+        predicates.add(criteriaBuilder.le(root.get("accdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getEndAccdate()))));
+      }
+      if (!StringUtil.isEmpty(searchBean.getStartTransdate())) {
+        predicates.add(criteriaBuilder.ge(root.get("transdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getStartTransdate()))));
+
+      }
+      if (!StringUtil.isEmpty(searchBean.getEndTransdate())) {
+        predicates.add(criteriaBuilder.le(root.get("transdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getEndTransdate()))));
+      }
+      if (!StringUtil.isEmpty(searchBean.getShopname())) {
+        predicates.add(criteriaBuilder.like(root.get("shopname").as(String.class), "%" + searchBean.getShopname().trim() + "%"));
+      }
+      if (!StringUtil.isEmpty(searchBean.getShopaccno())) {
+        predicates.add(criteriaBuilder.equal(root.get("shopaccno").as(String.class), searchBean.getShopaccno().trim()));
+      }
+      if (!StringUtil.isEmpty(searchBean.getSourcetype())) {
+        predicates.add(criteriaBuilder.equal(root.get("sourceType").as(String.class), searchBean.getSourcetype().trim()));
+      }
+      if (!StringUtil.isEmpty(searchBean.getTradeflag())) {
+        predicates.add(criteriaBuilder.equal(root.get("tradeflag").as(String.class), searchBean.getTradeflag().trim()));
+      }
+      if (!StringUtil.isEmpty(searchBean.getTranscode())) {
+        predicates.add(criteriaBuilder.equal(root.get("transcode").as(String.class), searchBean.getTranscode().trim()));
+      }
+      if (!StringUtil.isEmpty(searchBean.getStatus())) {
+        predicates.add(criteriaBuilder.equal(root.get("status").as(String.class), searchBean.getStatus().trim()));
+      }
+      return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+    }, pageable);
+    return new PageResult<>(page);
+  }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/FunctionServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/FunctionServiceImpl.java
index 5a764a5..9dec0bf 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/FunctionServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/FunctionServiceImpl.java
@@ -11,6 +11,8 @@
 import com.supwisdom.dlpay.system.bean.FunctionSearchBean;
 import com.supwisdom.dlpay.system.service.FunctionService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
@@ -31,6 +33,7 @@
   private RoleFunctionDao roleFunctionDao;
 
   @Override
+  @Cacheable(cacheNames = "oper_function_list", key = "#p0")
   public List<TFunction> getFunctionsByOperid(String operid) {
     List<TFunction> list = functionDao.getTFunctionsByOperid(StringUtil.isEmpty(operid) ? "" : operid.trim());
     if (!StringUtil.isEmpty(list)) return list;
@@ -68,6 +71,7 @@
   }
 
   @Override
+  @CacheEvict(cacheNames = "oper_function_list")
   public TFunction getFunctionByNameAndId(String name, Integer id) {
     if (id != null && id != 0) {
       return functionDao.findByNameAndIdNot(name, id);
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java
index e58032e..1a591ac 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/OperatorServiceImpl.java
@@ -6,6 +6,7 @@
 import com.supwisdom.dlpay.framework.domain.TOperLog;
 import com.supwisdom.dlpay.framework.domain.TOperRole;
 import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
 import com.supwisdom.dlpay.framework.util.*;
 import com.supwisdom.dlpay.system.bean.LogBean;
 import com.supwisdom.dlpay.system.bean.OperatorSearchBean;
@@ -29,145 +30,146 @@
 
 @Service
 public class OperatorServiceImpl implements OperatorService {
-    @Autowired
-    private OperatorDao operatorDao;
-    @Autowired
-    private OperRoleDao operRoleDao;
-    @Autowired
-    private OperLogDao operLogDao;
+  @Autowired
+  private OperatorDao operatorDao;
+  @Autowired
+  private OperRoleDao operRoleDao;
+  @Autowired
+  private OperLogDao operLogDao;
 
-    @Override
-    public PageResult<TOperator> getOperatorsByPage(int pageNo, int pageSize, OperatorSearchBean searchBean) {
-        Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.Direction.DESC, "opendate");
-        Page<TOperator> page = operatorDao.findAll(new Specification<TOperator>() {
-            @Override
-            public Predicate toPredicate(Root<TOperator> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
-                List<Predicate> predicates = new ArrayList<>();
-                if (!StringUtil.isEmpty(searchBean.getOpercode())) {
-                    predicates.add(criteriaBuilder.equal(root.get("opercode").as(String.class), searchBean.getOpercode().trim()));
-                }
-                if (!StringUtil.isEmpty(searchBean.getOpername())) {
-                    predicates.add(criteriaBuilder.like(root.get("opername").as(String.class), "%" + searchBean.getOpername().trim() + "%"));
-                }
-                if (!StringUtil.isEmpty(searchBean.getMobile())) {
-                    predicates.add(criteriaBuilder.like(root.get("mobile").as(String.class), "%" + searchBean.getMobile().trim() + "%"));
-                }
-                if (null != searchBean.getDeleteShow() && !searchBean.getDeleteShow()) {
-                    predicates.add(criteriaBuilder.equal(root.get("status").as(String.class), TradeDict.STATUS_NORMAL)); //仅显示正常
-                }
-                return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
-            }
-        }, pageable);
+  @Override
+  public PageResult<TOperator> getOperatorsByPage(int pageNo, int pageSize, OperatorSearchBean searchBean) {
+    Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.Direction.DESC, "opendate");
+    Page<TOperator> page = operatorDao.findAll(new Specification<TOperator>() {
+      @Override
+      public Predicate toPredicate(Root<TOperator> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+        List<Predicate> predicates = new ArrayList<>();
+        if (!StringUtil.isEmpty(searchBean.getOpercode())) {
+          predicates.add(criteriaBuilder.equal(root.get("opercode").as(String.class), searchBean.getOpercode().trim()));
+        }
+        if (!StringUtil.isEmpty(searchBean.getOpername())) {
+          predicates.add(criteriaBuilder.like(root.get("opername").as(String.class), "%" + searchBean.getOpername().trim() + "%"));
+        }
+        if (!StringUtil.isEmpty(searchBean.getMobile())) {
+          predicates.add(criteriaBuilder.like(root.get("mobile").as(String.class), "%" + searchBean.getMobile().trim() + "%"));
+        }
+        if (null != searchBean.getDeleteShow() && !searchBean.getDeleteShow()) {
+          predicates.add(criteriaBuilder.equal(root.get("status").as(String.class), TradeDict.STATUS_NORMAL)); //仅显示正常
+        }
+        return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+      }
+    }, pageable);
 
-        return new PageResult<>(page);
-    }
+    return new PageResult<>(page);
+  }
 
-    @Override
-    public boolean checkOpercodeExists(String opercode, String operid) {
-        TOperator oper = operatorDao.findByOpercode(opercode.trim());
-        if (null != oper && StringUtil.isEmpty(operid)) return true;
-        if (null != oper && !StringUtil.isEmpty(operid) && !operid.trim().equals(oper.getOperid())) return true;
+  @Override
+  public boolean checkOpercodeExists(String opercode, String operid) {
+    TOperator oper = operatorDao.findByOpercode(opercode.trim());
+    if (null != oper && StringUtil.isEmpty(operid)) return true;
+    if (null != oper && !StringUtil.isEmpty(operid) && !operid.trim().equals(oper.getOperid())) return true;
+    return false;
+  }
+
+  @Override
+  public boolean saveOperator(TOperator operator, String roles) {
+    if (StringUtil.isEmpty(operator.getOperid())) {
+      String[] roleids = roles.split(",");
+      operator.setOpendate(DateUtil.getNow("yyyyMMdd"));
+      operator.setStatus(TradeDict.STATUS_NORMAL);
+      operator.setOpertype(WebConstant.OPERTYPE_DEFAULT);
+      BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+      operator.setOperpwd(encoder.encode(WebConstant.OPERPWD_DEFAULT));
+      operator = operatorDao.save(operator);
+      for (String role : roleids) {
+        TOperRole operRole = new TOperRole();
+        operRole.setOperid(operator.getOperid());
+        operRole.setRoleId(role);
+        operRoleDao.save(operRole);
+      }
+    } else {
+      Optional<TOperator> temp = operatorDao.findById(operator.getOperid());
+      if (!temp.isPresent()) {
         return false;
+      }
+      TOperator op = temp.get();
+      op.setSex(operator.getSex());
+      op.setEmail(operator.getEmail());
+      op.setMobile(operator.getMobile());
+      op.setOpername(operator.getOpername());
+      op.setOpercode(operator.getOpercode());
+      op.setThirdadmin(operator.getThirdadmin());
+      operatorDao.save(op);
+      operRoleDao.deleteByOperid(op.getOperid());
+      String[] roleids = roles.split(",");
+      for (String role : roleids) {
+        TOperRole operRole = new TOperRole();
+        operRole.setOperid(op.getOperid());
+        operRole.setRoleId(role);
+        operRoleDao.save(operRole);
+      }
     }
+    return true;
+  }
 
-    @Override
-    public boolean saveOperator(TOperator operator, String roles) {
-        if (StringUtil.isEmpty(operator.getOperid())) {
-            String[] roleids = roles.split(",");
-            operator.setOpendate(DateUtil.getNow("yyyyMMdd"));
-            operator.setStatus(TradeDict.STATUS_NORMAL);
-            operator.setOpertype(WebConstant.OPERTYPE_DEFAULT);
-            BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
-            operator.setOperpwd(encoder.encode(WebConstant.OPERPWD_DEFAULT));
-            operator = operatorDao.save(operator);
-            for (String role : roleids) {
-                TOperRole operRole = new TOperRole();
-                operRole.setOperid(operator.getOperid());
-                operRole.setRoleId(role);
-                operRoleDao.save(operRole);
-            }
-        } else {
-            Optional<TOperator> temp = operatorDao.findById(operator.getOperid());
-            if (!temp.isPresent()) {
-                return false;
-            }
-            TOperator op = temp.get();
-            op.setSex(operator.getSex());
-            op.setEmail(operator.getEmail());
-            op.setMobile(operator.getMobile());
-            op.setOpername(operator.getOpername());
-            op.setOpercode(operator.getOpercode());
-            operatorDao.save(op);
-            operRoleDao.deleteByOperid(op.getOperid());
-            String[] roleids = roles.split(",");
-            for (String role : roleids) {
-                TOperRole operRole = new TOperRole();
-                operRole.setOperid(op.getOperid());
-                operRole.setRoleId(role);
-                operRoleDao.save(operRole);
-            }
-        }
-        return true;
-    }
+  @Override
+  public TOperator getOperatorByCode(String opercode) {
+    return operatorDao.findByOpercode(opercode);
+  }
 
-    @Override
-    public TOperator getOperatorByCode(String opercode) {
-        return operatorDao.findByOpercode(opercode);
-    }
+  @Override
+  public List<TOperRole> getOperRoleByOperId(String operid) {
+    return operRoleDao.findAllByOperid(operid);
+  }
 
-    @Override
-    public List<TOperRole> getOperRoleByOperId(String operid) {
-        return operRoleDao.findAllByOperid(operid);
+  @Override
+  public boolean resetPwd(String operid) {
+    Optional<TOperator> temp = operatorDao.findById(operid);
+    if (!temp.isPresent()) {
+      return false;
     }
+    TOperator op = temp.get();
+    BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+    op.setOperpwd(encoder.encode(WebConstant.OPERPWD_DEFAULT));
+    operatorDao.save(op);
+    return true;
+  }
 
-    @Override
-    public boolean resetPwd(String operid) {
-        Optional<TOperator> temp = operatorDao.findById(operid);
-        if (!temp.isPresent()) {
-            return false;
-        }
-        TOperator op = temp.get();
-        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
-        op.setOperpwd(encoder.encode(WebConstant.OPERPWD_DEFAULT));
-        operatorDao.save(op);
-        return true;
+  @Override
+  public boolean updateState(String operid, String state) {
+    Optional<TOperator> temp = operatorDao.findById(operid);
+    if (!temp.isPresent()) {
+      return false;
     }
+    TOperator op = temp.get();
+    op.setStatus(state);
+    operatorDao.save(op);
+    return true;
+  }
 
-    @Override
-    public boolean updateState(String operid, String state) {
-        Optional<TOperator> temp = operatorDao.findById(operid);
-        if (!temp.isPresent()) {
-            return false;
-        }
-        TOperator op = temp.get();
-        op.setStatus(state);
-        operatorDao.save(op);
-        return true;
-    }
+  @Override
+  public boolean saveOperLog(TOperLog log) {
+    operLogDao.save(log);
+    return true;
+  }
 
-    @Override
-    public boolean saveOperLog(TOperLog log) {
-        operLogDao.save(log);
-        return true;
+  @Override
+  public PageResult<TOperLog> getOperLogs(LogBean param) {
+    Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
+        , Sort.by(Sort.Direction.DESC, "logdate"));
+    if (!StringUtil.isEmpty(param.getOpername())) {
+      return new PageResult<>(operLogDao.findAllByOpernameContaining(param.getOpername(), pageable));
     }
+    return new PageResult<>(operLogDao.findAll(pageable));
+  }
 
-    @Override
-    public PageResult<TOperLog> getOperLogs(LogBean param) {
-        Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
-                , Sort.by(Sort.Direction.DESC,"logdate"));
-        if (!StringUtil.isEmpty(param.getOpername())) {
-            return new PageResult<>(operLogDao.findAllByOpernameContaining(param.getOpername(), pageable));
-        }
-        return new PageResult<>(operLogDao.findAll(pageable));
+  @Override
+  public boolean saveOperator(TOperator operator) {
+    Optional<TOperator> temp = operatorDao.findById(operator.getOperid());
+    if (!temp.isPresent()) {
+      return false;
     }
-
-    @Override
-    public boolean saveOperator(TOperator operator) {
-        Optional<TOperator> temp = operatorDao.findById(operator.getOperid());
-        if (!temp.isPresent()) {
-            return false;
-        }
-        operatorDao.save(operator);
-        return true;
-    }
+    operatorDao.save(operator);
+    return true;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java
index f774582..31794bf 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java
@@ -2,20 +2,23 @@
 
 import com.supwisdom.dlpay.api.dao.PaytypeConfigDao;
 import com.supwisdom.dlpay.api.dao.SourceTypeDao;
-import com.supwisdom.dlpay.api.domain.TSourceType;
 import com.supwisdom.dlpay.api.domain.TPaytypeConfig;
+import com.supwisdom.dlpay.api.domain.TSourceType;
 import com.supwisdom.dlpay.framework.dao.ApiClientDao;
 import com.supwisdom.dlpay.framework.dao.BusinessparaDao;
 import com.supwisdom.dlpay.framework.dao.SysparaDao;
 import com.supwisdom.dlpay.framework.domain.TApiClient;
 import com.supwisdom.dlpay.framework.domain.TBusinesspara;
 import com.supwisdom.dlpay.framework.domain.TSyspara;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.system.service.ParamService;
 import com.supwisdom.dlpay.util.ConstantUtil;
 import com.supwisdom.dlpay.util.WebCheckException;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
@@ -41,7 +44,7 @@
   @Autowired
   private ApiClientDao apiClientDao;
   @Autowired
-  private SourceTypeDao paytypeDao;
+  private SourceTypeDao sourceTypeDao;
   @Autowired
   private PaytypeConfigDao paytypeConfigDao;
 
@@ -105,14 +108,6 @@
     return false;
   }
 
-  @Override
-  public boolean saveOrUpdateBusinesspara(TBusinesspara businesspara) {
-    if (null != businesspara) {
-      businessparaDao.save(businesspara);
-      return true;
-    }
-    return false;
-  }
 
   @Override
   public PageResult<TApiClient> getApiClientparaPage(String appid, int pageNo, int pageSize) {
@@ -132,8 +127,8 @@
   }
 
   @Override
-  public boolean saveOrUpdateApiClient(TApiClient apiClient){
-    if(null!=apiClient){
+  public boolean saveOrUpdateApiClient(TApiClient apiClient) {
+    if (null != apiClient) {
       apiClientDao.save(apiClient);
       return true;
     }
@@ -150,42 +145,43 @@
   }
 
   @Override
-  public PageResult<TSourceType> getPaytypePage(String paytype, int pageNo, int pageSize) {
+  public PageResult<TSourceType> getSourceTypePage(String paytype, int pageNo, int pageSize) {
     Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("sourceType"));
     if (!StringUtil.isEmpty(paytype)) {
-      return new PageResult<>(paytypeDao.findBySourceTypeContaining(paytype.trim(), pageable));
+      return new PageResult<>(sourceTypeDao.findBySourceTypeContaining(paytype.trim(), pageable));
     }
-    return new PageResult<>(paytypeDao.findAll(pageable));
+    return new PageResult<>(sourceTypeDao.findAll(pageable));
   }
 
   @Override
-  public TSourceType getPaytype(String paytype) {
+  @Cacheable(cacheNames = "source_type_cache", key = "#p0")
+  public TSourceType getSourceType(String paytype) {
     if (!StringUtil.isEmpty(paytype)) {
-      return paytypeDao.getBySourceType(paytype.trim());
+      return sourceTypeDao.getBySourceType(paytype.trim());
     }
     return null;
   }
 
   @Override
-  public boolean saveOrUpdatePaytype(TSourceType paytype){
-    if(null!=paytype){
-      paytypeDao.save(paytype);
+  @Cacheable(cacheNames = "source_type_cache")
+  public List<TSourceType> getAllSourceType() {
+    return sourceTypeDao.findAll();
+  }
+
+
+  @Override
+  @CacheEvict(cacheNames = "source_type_cache", key = "#paytype.sourceType")
+  public boolean deleteSourceType(TSourceType paytype) {
+    if (null != paytype) {
+      sourceTypeDao.delete(paytype);
       return true;
     }
     return false;
   }
 
   @Override
-  public boolean deletePaytype(TSourceType paytype){
-    if(null!=paytype){
-      paytypeDao.delete(paytype);
-      return true;
-    }
-    return false;
-  }
-
-  @Override
-  public List<TPaytypeConfig> getPaytypeConfigList(String paytype) {
+  @Cacheable(cacheNames = "source_type_config_cache", key = "#p0")
+  public List<TPaytypeConfig> getSourceTypeConfigList(String paytype) {
     if (!StringUtil.isEmpty(paytype)) {
       List<TPaytypeConfig> list = paytypeConfigDao.getByPaytypeOrderByConfigid(paytype.trim());
       if (!StringUtil.isEmpty(list))
@@ -195,13 +191,15 @@
   }
 
   @Override
-  public boolean savePaytypeConfig(String paytype, Map<String, String> param) throws WebCheckException {
-    TSourceType tPaytype = getPaytype(paytype);
+  @CacheEvict(cacheNames = "source_type_config_cache", key = "#p0")
+  public boolean saveSourceTypeConfig(String paytype, Map<String, String> param) throws WebCheckException {
+    TSourceType tPaytype = getSourceType(paytype);
     if (null == tPaytype) throw new WebCheckException("支付能力[" + paytype + "]不存在");
     for (String key : param.keySet()) {
       String value = param.get(key);
       TPaytypeConfig config = paytypeConfigDao.getByPaytypeAndAndConfigid(tPaytype.getSourceType(), key);
-      if (null == config) throw new WebCheckException("支付能力[" + tPaytype.getSourceType() + "]不存在配置项[" + key + "],请重新查询");
+      if (null == config)
+        throw new WebCheckException("支付能力[" + tPaytype.getSourceType() + "]不存在配置项[" + key + "],请重新查询");
       config.setConfigValue(StringUtil.isEmpty(value) ? null : value.trim());
       paytypeConfigDao.save(config);
     }
@@ -209,5 +207,4 @@
   }
 
 
-
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java
index c96485c..67281b5 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/RoleServiceImpl.java
@@ -7,6 +7,7 @@
 import com.supwisdom.dlpay.framework.domain.TResource;
 import com.supwisdom.dlpay.framework.domain.TRole;
 import com.supwisdom.dlpay.framework.domain.TRoleFunction;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
 import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
@@ -25,154 +26,164 @@
 
 @Service
 public class RoleServiceImpl implements RoleService {
-    @Autowired
-    private RoleDao roleDao;
+  @Autowired
+  private RoleDao roleDao;
 
-    @Autowired
-    private ResourceDao resourceDao;
+  @Autowired
+  private ResourceDao resourceDao;
 
-    @Autowired
-    private RoleFunctionDao roleFunctionDao;
+  @Autowired
+  private RoleFunctionDao roleFunctionDao;
 
-    @Autowired
-    private PermissionDao permissionDao;
-    @Autowired
-    private OperRoleDao operRoleDao;
+  @Autowired
+  private PermissionDao permissionDao;
+  @Autowired
+  private OperRoleDao operRoleDao;
 
 
-    @Override
-    public List<TRole> findAllRoles() {
-        List<TRole> list = roleDao.getAllRoles();
-        if (!StringUtil.isEmpty(list)) return list;
-        return new ArrayList<>(0);
+  @Override
+  public List<TRole> findAllRoles() {
+    List<TRole> list = roleDao.getAllRoles();
+    if (!StringUtil.isEmpty(list)) return list;
+    return new ArrayList<>(0);
+  }
+
+  @Override
+  public TRole findRoleByRoleid(String roleid) {
+    Optional<TRole> role = roleDao.findById(roleid);
+    if (role.isPresent()) {
+      return role.get();
     }
+    return null;
+  }
 
-    @Override
-    public TRole findRoleByRoleid(String roleid) {
-        Optional<TRole> role = roleDao.findById(roleid);
-        if(role.isPresent()){
-            return role.get();
-        }
-        return null;
+  @Override
+  public TResource findResourceByURI(String uri) {
+    return resourceDao.findByUri(uri);
+  }
+
+  @Override
+  public TRoleFunction findRoleFunctionByRoleIdAndFunctionId(String roleid, Integer functionid) {
+    return roleFunctionDao.findByRoleIdAndFunctionId(roleid, functionid);
+  }
+
+  @Override
+  public PageResult<TRole> getRolesByKey(FunctionSearchBean param) {
+    Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
+        , Sort.by("createtime"));
+    if (!StringUtil.isEmpty(param.getFunctioname())) {
+      return new PageResult<>(roleDao.findAllByRoleNameContaining(param.getFunctioname(), pageable));
     }
+    return new PageResult<>(roleDao.findAll(pageable));
+  }
 
-    @Override
-    public TResource findResourceByURI(String uri) {
-        return resourceDao.findByUri(uri);
+  @Override
+  public JsonResult saveRole(TRole role) {
+    if (!StringUtil.isEmpty(role.getRoleId())) {
+      TRole temp = roleDao.findByRoleNameAndRoleIdNot(role.getRoleName(), role.getRoleId());
+      if (temp != null) {
+        return JsonResult.error("角色名称已存在");
+      }
+      Optional<TRole> opt = roleDao.findById(role.getRoleId());
+      if (opt == null || !opt.isPresent()) {
+        return JsonResult.error("角色已被删除");
+      }
+      temp = opt.get();
+      temp.setRoleName(role.getRoleName());
+      temp.setRoleDesc(role.getRoleDesc());
+//      temp.setRoleCode(role.getRoleCode());
+      temp.setLastsaved(DateUtil.getNow());
+      roleDao.save(temp);
+    } else {
+      TRole temp = roleDao.findByRoleName(role.getRoleName());
+      if (temp != null) {
+        return JsonResult.error("角色名称已存在");
+      }
+
+      role.setCreatetime(DateUtil.getNow());
+      role.setEditflag(1);
+      role.setRoleCode("ROLE_ADMIN");
+      roleDao.save(role);
     }
+    return JsonResult.ok("成功");
+  }
 
-    @Override
-    public TRoleFunction findRoleFunctionByRoleIdAndFunctionId(String roleid, Integer functionid) {
-        return roleFunctionDao.findByRoleIdAndFunctionId(roleid, functionid);
+  @Override
+  public List<TRoleFunction> getRoleFuncByRoleid(String roleId) {
+    return roleFunctionDao.findByRoleId(roleId);
+  }
+
+
+  @Override
+  public TPermission findByRoleIdAndResid(String roleFuncId, Integer resid) {
+    return permissionDao.findByRoleIdAndResid(roleFuncId, resid);
+  }
+
+  @Override
+  public JsonResult saveRoleFuncId(String roleId, String funcs) {
+    Optional<TRole> ret = roleDao.findById(roleId);
+    if (ret == null || !ret.isPresent()) {
+      return JsonResult.error("角色不存在");
     }
-
-    @Override
-    public PageResult<TRole> getRolesByKey(FunctionSearchBean param) {
-        Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
-                , Sort.by("createtime"));
-        if (!StringUtil.isEmpty(param.getFunctioname())) {
-            return new PageResult<>(roleDao.findAllByRoleNameContaining(param.getFunctioname(), pageable));
-        }
-        return new PageResult<>(roleDao.findAll(pageable));
+    roleFunctionDao.deleteByRoleId(roleId);
+    permissionDao.deleteByRoleId(roleId);
+    String[] datas = funcs.split(",");
+    for (String func : datas) {
+      if (func.contains("_res")) {
+        String id = func.replace("_res", "");
+        TPermission permission = new TPermission();
+        permission.setResid(Integer.valueOf(id));
+        permission.setRoleId(roleId);
+        permissionDao.save(permission);
+      } else {
+        if("-1".equals(func)) continue; //全选排除
+        TRoleFunction roleFunction = new TRoleFunction();
+        roleFunction.setFunctionId(Integer.valueOf(func));
+        roleFunction.setRoleId(roleId);
+        roleFunctionDao.save(roleFunction);
+      }
     }
+    return JsonResult.ok("成功");
+  }
 
-    @Override
-    public JsonResult saveRole(TRole role) {
-        if (!StringUtil.isEmpty(role.getRoleId())) {
-            TRole temp = roleDao.findByRoleNameAndRoleIdNot(role.getRoleName(), role.getRoleId());
-            if (temp != null) {
-                return JsonResult.error("角色名称已存在");
-            }
-            Optional<TRole> opt = roleDao.findById(role.getRoleId());
-            if (opt == null || !opt.isPresent()) {
-                return JsonResult.error("角色已被删除");
-            }
-            temp = opt.get();
-            temp.setRoleName(role.getRoleName());
-            temp.setRoleDesc(role.getRoleDesc());
-            temp.setRoleCode(role.getRoleCode());
-            temp.setLastsaved(DateUtil.getNow());
-            roleDao.save(temp);
-        } else {
-            TRole temp = roleDao.findByRoleName(role.getRoleName());
-            if (temp != null) {
-                return JsonResult.error("角色名称已存在");
-            }
-
-            role.setCreatetime(DateUtil.getNow());
-            role.setEditflag(1);
-            role.setRoleCode("ROLE_ADMIN");
-            roleDao.save(role);
-        }
-        return JsonResult.ok("成功");
+  @Override
+  public List<ZTreeNode> findByRoleIdNative(String roleId) {
+    List<NodeData> nodeData = roleFunctionDao.findByRoleIdNative(roleId);
+    List<ZTreeNode> ret = new ArrayList<>();
+    boolean allChecked = true;
+    for (NodeData data : nodeData) {
+      ZTreeNode zTreeNode = new ZTreeNode();
+      zTreeNode.setpId(data.getPid());
+      zTreeNode.setId(data.getId());
+      zTreeNode.setName(data.getName());
+      zTreeNode.setChecked(data.getChecked() == 0 ? false : true);
+      if (allChecked && !zTreeNode.isChecked()) allChecked = false;
+      zTreeNode.setOpen(data.getOpen() == 0 ? false : true);
+      ret.add(zTreeNode);
     }
+    ZTreeNode root = new ZTreeNode();
+    root.setId("-1");
+    root.setpId("-99");
+    root.setName("选择全部功能");
+    root.setChecked(allChecked);
+    root.setOpen(true);
+    ret.add(root);
+    return ret;
+  }
 
-    @Override
-    public List<TRoleFunction> getRoleFuncByRoleid(String roleId) {
-        return roleFunctionDao.findByRoleId(roleId);
+  @Override
+  public JsonResult deleteRole(String roleid) {
+    Optional<TRole> ret = roleDao.findById(roleid);
+    if (ret == null || !ret.isPresent()) {
+      return JsonResult.error("角色不存在");
     }
-
-
-    @Override
-    public TPermission findByRoleIdAndResid(String roleFuncId, Integer resid) {
-        return permissionDao.findByRoleIdAndResid(roleFuncId, resid);
+    if (ret.get().getEditflag() != 1) {
+      return JsonResult.error("该角色不能删除");
     }
-
-    @Override
-    public JsonResult saveRoleFuncId(String roleId, String funcs) {
-        Optional<TRole> ret = roleDao.findById(roleId);
-        if (ret == null || !ret.isPresent()) {
-            return JsonResult.error("角色不存在");
-        }
-        roleFunctionDao.deleteByRoleId(roleId);
-        permissionDao.deleteByRoleId(roleId);
-        String[] datas = funcs.split(",");
-        for (String func : datas) {
-            if (func.contains("_res")) {
-                String id = func.replace("_res", "");
-                TPermission permission = new TPermission();
-                permission.setResid(Integer.valueOf(id));
-                permission.setRoleId(roleId);
-                permissionDao.save(permission);
-            } else {
-                TRoleFunction roleFunction = new TRoleFunction();
-                roleFunction.setFunctionId(Integer.valueOf(func));
-                roleFunction.setRoleId(roleId);
-                roleFunctionDao.save(roleFunction);
-            }
-        }
-        return JsonResult.ok("成功");
-    }
-
-    @Override
-    public List<ZTreeNode> findByRoleIdNative(String roleId) {
-        List<NodeData> nodeData = roleFunctionDao.findByRoleIdNative(roleId);
-        List<ZTreeNode> ret = new ArrayList<>();
-        for (NodeData data : nodeData) {
-            ZTreeNode zTreeNode = new ZTreeNode();
-            zTreeNode.setpId(data.getPid());
-            zTreeNode.setId(data.getId());
-            zTreeNode.setName(data.getName());
-            zTreeNode.setChecked(data.getChecked() == 0 ? false : true);
-            zTreeNode.setOpen(data.getOpen() == 0 ? false : true);
-            ret.add(zTreeNode);
-        }
-        return ret;
-    }
-
-    @Override
-    public JsonResult deleteRole(String roleid) {
-        Optional<TRole> ret = roleDao.findById(roleid);
-        if (ret == null || !ret.isPresent()) {
-            return JsonResult.error("角色不存在");
-        }
-        if(ret.get().getEditflag()!=1){
-            return JsonResult.error("该角色不能删除");
-        }
-        permissionDao.deleteByRoleId(roleid);
-        roleFunctionDao.deleteByRoleId(roleid);
-        operRoleDao.deleteByRoleId(roleid);
-        roleDao.deleteById(roleid);
-        return JsonResult.ok("成功");
-    }
+    permissionDao.deleteByRoleId(roleid);
+    roleFunctionDao.deleteByRoleId(roleid);
+    operRoleDao.deleteByRoleId(roleid);
+    roleDao.deleteById(roleid);
+    return JsonResult.ok("成功");
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/ShopDataServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/ShopDataServiceImpl.java
new file mode 100644
index 0000000..815d574
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/ShopDataServiceImpl.java
@@ -0,0 +1,84 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.api.dao.PaytypeConfigDao;
+import com.supwisdom.dlpay.api.dao.ShopPaytypeConfigDao;
+import com.supwisdom.dlpay.api.dao.ShopPaytypeDao;
+import com.supwisdom.dlpay.api.dao.SourceTypeDao;
+import com.supwisdom.dlpay.api.domain.TPaytypeConfig;
+import com.supwisdom.dlpay.api.domain.TShopPaytype;
+import com.supwisdom.dlpay.api.domain.TShopPaytypeConfig;
+import com.supwisdom.dlpay.api.domain.TSourceType;
+import com.supwisdom.dlpay.framework.data.SystemDateTime;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.framework.util.Subject;
+import com.supwisdom.dlpay.framework.util.TradeDict;
+import com.supwisdom.dlpay.system.bean.ShopConfigBean;
+import com.supwisdom.dlpay.system.bean.ZTreeNode;
+import com.supwisdom.dlpay.system.service.ShopDataService;
+import com.supwisdom.dlpay.util.WebCheckException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class ShopDataServiceImpl implements ShopDataService {
+  @Autowired
+  private ShopPaytypeDao shopPaytypeDao;
+  @Autowired
+  private SystemUtilService systemUtilService;
+  @Autowired
+  private SourceTypeDao paytypeDao;
+  @Autowired
+  private PaytypeConfigDao paytypeConfigDao;
+  @Autowired
+  private ShopPaytypeConfigDao shopPaytypeConfigDao;
+
+
+
+
+
+  @Override
+  public TShopPaytype getShopPaytype(String shopaccno, String paytype) {
+    return shopPaytypeDao.getById(paytype, shopaccno);
+  }
+
+
+
+  @Override
+  public List<TShopPaytypeConfig> getShopPaytypeConfigs(String shopaccno, String paytype) {
+    List<TShopPaytypeConfig> result = new ArrayList<>(0);
+    if (!StringUtil.isEmpty(paytype)) {
+      List<TPaytypeConfig> list = paytypeConfigDao.getByPaytypeOrderByConfigid(paytype.trim());
+      if (!StringUtil.isEmpty(list)) {
+        for (TPaytypeConfig pt : list) {
+          TShopPaytypeConfig spc = shopPaytypeConfigDao.getShopPaytypeConfigById(shopaccno, pt.getPaytype(), pt.getConfigid());
+          if (null == spc) {
+            spc = new TShopPaytypeConfig();
+            spc.setShopaccno(shopaccno);
+            spc.setPaytype(pt.getPaytype());
+            spc.setConfigid(pt.getConfigid());
+            spc.setConfigName(pt.getConfigName());
+            spc.setConfigValue(null);
+          }
+          result.add(spc);
+        }
+      }
+    }
+    return result;
+  }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
index 6488fd6..09b7358 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/UserDataServiceImpl.java
@@ -25,163 +25,163 @@
 
 @Service
 public class UserDataServiceImpl implements UserDataService {
-    @Autowired
-    private PersonDao personDao;
-    @Autowired
-    private AccountDao accountDao;
-    @Autowired
-    private PointsAccountDao pointsAccountDao;
-    @Autowired
-    private SystemUtilService systemUtilService;
-    @Autowired
-    private PersonIdentityDao personIdentityDao;
+  @Autowired
+  private PersonDao personDao;
+  @Autowired
+  private AccountDao accountDao;
+  @Autowired
+  private PointsAccountDao pointsAccountDao;
+  @Autowired
+  private SystemUtilService systemUtilService;
+  @Autowired
+  private PersonIdentityDao personIdentityDao;
 
-    @Override
-    public PageResult<TPerson> getPersonsByKey(PersonParamBean param) {
-        Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
-                , Sort.by(Sort.Direction.DESC, "lastsaved"));
-        if (!StringUtil.isEmpty(param.getName())) {
-            return new PageResult<>(personDao.findAllByNameContaining(param.getName(), pageable));
-        }
-        return new PageResult<>(personDao.findAll(pageable));
+  @Override
+  public PageResult<TPerson> getPersonsByKey(PersonParamBean param) {
+    Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize()
+            , Sort.by(Sort.Direction.DESC, "lastsaved"));
+    if (!StringUtil.isEmpty(param.getName())) {
+      return new PageResult<>(personDao.findAllByNameContaining(param.getName(), pageable));
     }
+    return new PageResult<>(personDao.findAll(pageable));
+  }
 
-    @Override
-    public PageResult<TAccount> getAccountsByKey(PersonParamBean param) {
-        Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
-        if (!StringUtil.isEmpty(param.getName())) {
-            return new PageResult<>(accountDao.findAllByAccnameContaining(param.getName(), pageable));
-        }
-        return new PageResult<>(accountDao.findAll(pageable));
+  @Override
+  public PageResult<TAccount> getAccountsByKey(PersonParamBean param) {
+    Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
+    if (!StringUtil.isEmpty(param.getName())) {
+      return new PageResult<>(accountDao.findAllByAccnameContaining(param.getName(), pageable));
     }
+    return new PageResult<>(accountDao.findAll(pageable));
+  }
 
-    @Override
-    public PageResult<TPointsAccount> getPointsByKey(PersonParamBean param) {
-        Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
-        if (!StringUtil.isEmpty(param.getName())) {
-            return new PageResult<>(pointsAccountDao.findAllByNameContaining(param.getName(), pageable));
-        }
-        return new PageResult<>(pointsAccountDao.findAll(pageable));
+  @Override
+  public PageResult<TPointsAccount> getPointsByKey(PersonParamBean param) {
+    Pageable pageable = PageRequest.of(param.getPageNo() - 1, param.getPageSize());
+    if (!StringUtil.isEmpty(param.getName())) {
+      return new PageResult<>(pointsAccountDao.findAllByNameContaining(param.getName(), pageable));
     }
+    return new PageResult<>(pointsAccountDao.findAll(pageable));
+  }
 
-    @Override
-    public JsonResult saveUser(TPerson person) {
-        if (!StringUtil.isEmpty(person.getUserid())) {
-            Optional<TPerson> temp = personDao.findById(person.getUserid());
-            if (!temp.isPresent()) {
-                return JsonResult.error("参数错误");
-            }
-            TPerson it = temp.get();
-            if (!person.getIdno().equals(it.getIdno())
-                    || !person.getIdtype().equals(it.getIdtype())) {
-                TPerson has = personDao.findByIdentity(person.getIdtype(), person.getIdno());
-                if (has != null && !has.getUserid().equals(person.getUserid())) {
-                    return JsonResult.error("证件类型、证件号已存在");
-                }
-            }
-            if (!person.getName().equals(it.getName())) {
-                TAccount account = accountDao.findByUserid(person.getUserid());
-                if (account != null) {
-                    account.setAccname(person.getName());
-                    accountDao.save(account);
-                }
-            }
-            if (StringUtil.isEmpty(person.getStatus())) {
-                person.setStatus(TradeDict.STATUS_NORMAL);
-            }
-            personDao.save(person);
-        } else {
-            TPerson has = personDao.findByIdentity(person.getIdtype(), person.getIdno());
-            if (has != null) {
-                return JsonResult.error("证件类型、证件号已存在");
-            }
-            SystemDateTime systemDateTime = systemUtilService.getSysdatetime();
-            person.setStatus(TradeDict.STATUS_NORMAL);
-            person.setLastsaved(systemDateTime.getHostdatetime());
-            person = personDao.save(person);
-
-            TAccount account = new TAccount();
-            account.setAccname(person.getName());
-            account.setSubjno(Subject.SUBJNO_PERSONAL_DEPOSIT);
-            account.setUserid(person.getUserid());
-            account.setStatus(person.getStatus());
-            account.setBalance(0.0);
-            account.setAvailbal(0.0);
-            account.setFrozebal(0.0);
-            account.setLowfreeFlag(false);
-            account.setMaxbal(systemUtilService.getSysparaValueAsDouble(SysparaUtil.SYSPARAID_NO1, SysparaUtil.SYSPARA_NO1_DEFAULT));
-            account.setLasttransdate(systemDateTime.getHostdate());
-            account.setLastdayDpsamt(0.0);
-            account.setLastdayTransamt(0.0);
-            account.setOpendate(systemDateTime.getHostdate());
-            account.setTac(account.generateTac());
-            accountDao.save(account);
+  @Override
+  public JsonResult saveUser(TPerson person) {
+    if (!StringUtil.isEmpty(person.getUserid())) {
+      Optional<TPerson> temp = personDao.findById(person.getUserid());
+      if (!temp.isPresent()) {
+        return JsonResult.error("参数错误");
+      }
+      TPerson it = temp.get();
+      if (!person.getIdno().equals(it.getIdno())
+              || !person.getIdtype().equals(it.getIdtype())) {
+        TPerson has = personDao.findByIdentity(person.getIdtype(), person.getIdno());
+        if (has != null && !has.getUserid().equals(person.getUserid())) {
+          return JsonResult.error("证件类型、证件号已存在");
         }
-        return JsonResult.ok("添加成功");
-    }
-
-    @Override
-    public JsonResult deleteUser(String userid) {
-        TAccount account = accountDao.findByUserid(userid);
+      }
+      if (!person.getName().equals(it.getName())) {
+        TAccount account = accountDao.findByUserid(person.getUserid());
         if (account != null) {
-            if (!TradeDict.STATUS_CLOSED.equals(account.getStatus()) && account.getBalance() != 0) {
-                return JsonResult.error("该用户账户未注销且余额不为0，无法删除");
-            } else {
-                accountDao.delete(account);
-            }
+          account.setAccname(person.getName());
+          accountDao.save(account);
         }
-        TPointsAccount pointsAccount = pointsAccountDao.findByUserid(userid);
-        if (pointsAccount != null) {
-            if (pointsAccount.getPoints() != 0) {
-                return JsonResult.error("该用户账户积分不为0，无法删除，若要删除请先删除积分账户");
-            } else {
-                pointsAccountDao.delete(pointsAccount);
-            }
-        }
-        personDao.deleteById(userid);
-        return JsonResult.ok("操作成功");
-    }
+      }
+      if (StringUtil.isEmpty(person.getStatus())) {
+        person.setStatus(TradeDict.STATUS_NORMAL);
+      }
+      personDao.save(person);
+    } else {
+      TPerson has = personDao.findByIdentity(person.getIdtype(), person.getIdno());
+      if (has != null) {
+        return JsonResult.error("证件类型、证件号已存在");
+      }
+      SystemDateTime systemDateTime = systemUtilService.getSysdatetime();
+      person.setStatus(TradeDict.STATUS_NORMAL);
+      person.setLastsaved(systemDateTime.getHostdatetime());
+      person = personDao.save(person);
 
-    @Override
-    public JsonResult closeAccount(String accno) {
-        Optional<TAccount> opt = accountDao.findById(accno);
-        if (opt.isPresent()) {
-            TAccount acc = opt.get();
-            acc.setStatus(TradeDict.STATUS_CLOSED);
-            accountDao.save(acc);
-            return JsonResult.ok("操作成功");
-        } else {
-            return JsonResult.error("参数错误");
-        }
+      TAccount account = new TAccount();
+      account.setAccname(person.getName());
+      account.setSubjno(Subject.SUBJNO_PERSONAL_DEPOSIT);
+      account.setUserid(person.getUserid());
+      account.setStatus(person.getStatus());
+      account.setBalance(0.0);
+      account.setAvailbal(0.0);
+      account.setFrozebal(0.0);
+      account.setLowfreeFlag(false);
+      account.setMaxbal(systemUtilService.getSysparaValueAsDouble(SysparaUtil.SYSPARAID_NO1, SysparaUtil.SYSPARA_NO1_DEFAULT));
+      account.setLasttransdate(systemDateTime.getHostdate());
+      account.setLastdayDpsamt(0.0);
+      account.setLastdayTransamt(0.0);
+      account.setOpendate(systemDateTime.getHostdate());
+      account.setTac(account.generateTac());
+      accountDao.save(account);
     }
+    return JsonResult.ok("添加成功");
+  }
 
-    @Override
-    public JsonResult deletePoint(String userid) {
-        Optional<TPointsAccount> pointsAccount = pointsAccountDao.findById(userid);
-        if (pointsAccount.isPresent()) {
-            pointsAccountDao.delete(pointsAccount.get());
-            return JsonResult.ok("操作成功");
-        }else {
-            return JsonResult.error("参数错误");
-        }
+  @Override
+  public JsonResult deleteUser(String userid) {
+    TAccount account = accountDao.findByUserid(userid);
+    if (account != null) {
+      if (!TradeDict.STATUS_CLOSED.equals(account.getStatus()) && account.getBalance() != 0) {
+        return JsonResult.error("该用户账户未注销且余额不为0，无法删除");
+      } else {
+        accountDao.delete(account);
+      }
     }
+    TPointsAccount pointsAccount = pointsAccountDao.findByUserid(userid);
+    if (pointsAccount != null) {
+      if (pointsAccount.getPoints() != 0) {
+        return JsonResult.error("该用户账户积分不为0，无法删除，若要删除请先删除积分账户");
+      } else {
+        pointsAccountDao.delete(pointsAccount);
+      }
+    }
+    personDao.deleteById(userid);
+    return JsonResult.ok("操作成功");
+  }
 
-    @Override
-    public List<TPersonIdentity> getPersonIdentity(String userid) {
-        return null;
+  @Override
+  public JsonResult closeAccount(String accno) {
+    Optional<TAccount> opt = accountDao.findById(accno);
+    if (opt.isPresent()) {
+      TAccount acc = opt.get();
+      acc.setStatus(TradeDict.STATUS_CLOSED);
+      accountDao.save(acc);
+      return JsonResult.ok("操作成功");
+    } else {
+      return JsonResult.error("参数错误");
     }
+  }
 
-    @Override
-    public PageResult<TPointsAccount> getUserPointDTL(PersonParamBean param) {
-        return null;
+  @Override
+  public JsonResult deletePoint(String userid) {
+    Optional<TPointsAccount> pointsAccount = pointsAccountDao.findById(userid);
+    if (pointsAccount.isPresent()) {
+      pointsAccountDao.delete(pointsAccount.get());
+      return JsonResult.ok("操作成功");
+    }else {
+      return JsonResult.error("参数错误");
     }
+  }
 
-    @Override
-    public TPerson getPersonByThirdUid(String thirdUid) {
-        TPersonIdentity personIdentity = personIdentityDao.getByThirdUid(thirdUid);
-        if (personIdentity != null) {
-           return personIdentity.getPerson();
-        }
-        return null;
+  @Override
+  public List<TPersonIdentity> getPersonIdentity(String userid) {
+    return null;
+  }
+
+  @Override
+  public PageResult<TPointsAccount> getUserPointDTL(PersonParamBean param) {
+    return null;
+  }
+
+  @Override
+  public TPerson getPersonByThirdUid(String thirdUid) {
+    TPersonIdentity personIdentity = personIdentityDao.getByThirdUid(thirdUid);
+    if (personIdentity != null) {
+      return personIdentity.getPerson();
     }
+    return null;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/util/DESedeUtil.java b/src/main/java/com/supwisdom/dlpay/util/DESedeUtil.java
new file mode 100644
index 0000000..0d0e4cf
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/util/DESedeUtil.java
@@ -0,0 +1,107 @@
+package com.supwisdom.dlpay.util;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang.StringUtils;
+
+import javax.crypto.*;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * 加密/解密工具类
+ */
+public class DESedeUtil {
+  /**
+   * 加密工具类唯一实例
+   */
+  private static DESedeUtil instance = null;
+  /**
+   *
+   */
+  private Cipher cipher;
+  /**
+   *
+   */
+  private SecretKey secretKey;
+  /**
+   *
+   */
+  private IvParameterSpec ivSpec;
+
+  /**
+   * 初始化、创建密钥数据
+   *
+   * @throws NoSuchPaddingException
+   * @throws NoSuchAlgorithmException
+   */
+  private DESedeUtil(String deskey) throws NoSuchAlgorithmException, NoSuchPaddingException {
+    byte[] keyData = Base64.decodeBase64(deskey);
+    String fullAlg = "DESede/CBC/PKCS5Padding";
+    cipher = Cipher.getInstance(fullAlg);
+    int blockSize = cipher.getBlockSize();
+    byte[] iv = new byte[blockSize];
+    for (int i = 0; i < blockSize; ++i) {
+      iv[i] = 0;
+    }
+    secretKey = new SecretKeySpec(keyData, StringUtils.substringBefore(fullAlg, "/"));
+    ivSpec = new IvParameterSpec(iv);
+  }
+
+  /**
+   * 获取唯一实例
+   *
+   * @return
+   * @throws NoSuchPaddingException
+   * @throws NoSuchAlgorithmException
+   */
+  public static DESedeUtil getInstance(String deskey) throws NoSuchAlgorithmException, NoSuchPaddingException {
+    if (null == instance) {
+      synchronized (DESedeUtil.class) {
+        if (null == instance) {
+          instance = new DESedeUtil(deskey);
+        }
+      }
+    }
+    return instance;
+  }
+
+  /**
+   * 加密
+   *
+   * @param s 待加密字符串
+   * @return 返回BASE64编码加密字符串
+   * @throws InvalidAlgorithmParameterException
+   * @throws InvalidKeyException
+   * @throws BadPaddingException
+   * @throws IllegalBlockSizeException
+   * @throws UnsupportedEncodingException
+   */
+  public String encode(String s) throws InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
+    cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
+    byte[] cipherBytes = cipher.doFinal(s.getBytes("UTF-8"));
+    return new String(Base64.encodeBase64(cipherBytes));
+  }
+
+  /**
+   * 解密
+   *
+   * @param s 待解密字符串
+   * @return 返回明文
+   * @throws InvalidAlgorithmParameterException
+   * @throws InvalidKeyException
+   * @throws BadPaddingException
+   * @throws IllegalBlockSizeException
+   * @throws UnsupportedEncodingException
+   */
+  public String decode(String s) throws InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
+    cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
+    byte[] resultBytes = cipher.doFinal(Base64.decodeBase64(s));
+    return new String(resultBytes, "UTF-8");
+  }
+
+}
+
diff --git a/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java b/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java
new file mode 100644
index 0000000..d4521d5
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java
@@ -0,0 +1,76 @@
+package com.supwisdom.dlpay.util;
+
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+import java.io.*;
+import java.net.Socket;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class DlpayUtil {
+  /**
+   * socket方式请求农商行
+   */
+  public static String send(String ip, int port, int timeout, String data) throws UnknownHostException, IOException {
+    Socket client = new Socket(ip, port);
+    client.setSoTimeout(timeout * 1000); //timeout秒
+    PrintWriter printWriter = new PrintWriter(client.getOutputStream());
+    // 发送消息
+    printWriter.println(data);
+    printWriter.flush();
+
+    // 读取返回信息
+    InputStreamReader streamReader = new InputStreamReader(client.getInputStream());
+    BufferedReader reader = new BufferedReader(streamReader);
+    StringBuffer content = new StringBuffer(); //存返回信息
+    int ch;
+    while ((ch = reader.read()) != -1) {
+      content.append((char) ch);
+    }
+    reader.close();
+    client.close();
+    return content.toString();
+  }
+
+  /**
+   * XML解析返回Map
+   * */
+  public static Map<String, Object> getXMLValue(String xml, String charset) {
+    if (null == xml) return null;
+    if (null == charset) charset = "UTF-8"; //默认 UTF-8
+    try {
+      byte[] data = xml.getBytes(charset);
+      ByteArrayInputStream bin = new ByteArrayInputStream(data);
+      SAXReader reader = new SAXReader();
+      Document document = reader.read(bin);
+      Element root = document.getRootElement();
+      List<Element> elementList = root.elements();
+      Map<String, Object> map = new HashMap<>(0);
+      for (Element e : elementList) {
+        map.put(e.getName(), getElementValue(e));
+      }
+      return map;
+    } catch (Exception e) {
+      e.printStackTrace();
+      return null;
+    }
+  }
+
+  private static Object getElementValue(Element root) {
+    if (null == root) return null;
+    if (root.elements().size() > 0) {
+      List<Element> elementList = root.elements();
+      Map<String, Object> map = new HashMap<>(0);
+      for (Element e : elementList) {
+        map.put(e.getName(), getElementValue(e));
+      }
+      return map;
+    } else {
+      return root.getText();
+    }
+  }
+}
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt
index c8d359f..3d2e5d2 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt
@@ -9,12 +9,12 @@
 
 
 @RestController
-@RequestMapping("/common")
+@RequestMapping("/api/common")
 class AboutController {
     @GetMapping("/version")
     fun version(): ResponseEntity<Any> {
         return try {
-            Manifests.read("Water-Version").let {
+            Manifests.read("Payapi-Version").let {
                 ResponseEntity.ok(ResponseBodyBuilder.create()
                         .data("version", it)
                         .success())
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
index e4644a1..b1bb17c 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay.framework.controller
 
+import com.google.code.kaptcha.Producer
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
 import com.supwisdom.dlpay.framework.core.JwtConfig
 import com.supwisdom.dlpay.framework.core.JwtTokenUtil
@@ -13,9 +14,7 @@
 import com.supwisdom.dlpay.framework.security.validate.VerifyCode
 import com.supwisdom.dlpay.framework.service.CommonService
 import com.supwisdom.dlpay.framework.service.SystemUtilService
-import com.supwisdom.dlpay.framework.util.DateUtil
-import com.supwisdom.dlpay.framework.util.HmacUtil
-import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.system.service.FunctionService
 import mu.KotlinLogging
 import org.springframework.beans.factory.annotation.Autowired
@@ -28,11 +27,11 @@
 import org.springframework.social.connect.web.HttpSessionSessionStrategy
 import org.springframework.stereotype.Controller
 import org.springframework.ui.Model
-import org.springframework.web.bind.annotation.GetMapping
-import org.springframework.web.bind.annotation.PathVariable
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RestController
+import org.springframework.web.bind.annotation.*
 import org.springframework.web.context.request.ServletWebRequest
+import java.io.IOException
+import java.lang.Exception
+import java.security.Principal
 import java.util.*
 import javax.imageio.ImageIO
 import javax.servlet.http.HttpServletRequest
@@ -57,34 +56,6 @@
     @Autowired
     lateinit var jwtConfig: JwtConfig
 
-    @GetMapping(value = ["/gettoken", "/gettoken/{clientid}"])
-    fun loginInit(appid: String, @PathVariable clientid: String?): ResponseEntity<Any> {
-        apiClientDao.findById(appid).run {
-            if (!isPresent) {
-                return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
-            }
-            if (get().status != "normal") {
-                return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(1, "API状态错误"))
-            }
-            get()
-        }.let {
-            val token = generateRandomToken()
-            val now = systemUtil.sysdatetime.hostdatetime
-            ApiClientRedis().apply {
-                id = if (clientid == null) appid else "$appid-$clientid"
-                loginTimestamp = now
-                roles = it.roles
-                this.token = HmacUtil.HMACSHA256(token, it.secret)
-            }.also {
-                apiClientRepository.save(it)
-            }
-            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                    .data("token", token)
-                    .data("timestamp", now)
-                    .success())
-        }
-    }
 
     private fun generateRandomToken(): String {
         val random = ByteArray(12) { 0x00 }
@@ -96,35 +67,6 @@
         return (api.token == secret)
     }
 
-    @GetMapping(value = ["/authentication", "/authentication/{clientid}"])
-    fun login(appid: String, secret: String, @PathVariable clientid: String?): ResponseEntity<Any> {
-        val requestId = if (clientid == null) appid else "$appid-$clientid"
-        return apiClientRepository.findById(requestId).let {
-            if (it.isPresent && checkSecretToken(it.get(), secret)) {
-                apiClientRepository.deleteById(requestId)
-                val token = JwtTokenUtil(jwtConfig).generateToken(
-                        mapOf("uid" to appid, "issuer" to "payapi",
-                                "audience" to (clientid ?: appid),
-                                "authorities" to it.get().roles.split(";")))
-                JwtRedis().apply {
-                    jti = token.jti
-                    uid = appid
-                    status = TradeDict.JWT_STATUS_NORMAL
-                    expiration = token.expiration.valueInMillis
-                }.apply {
-                    apiJwtRepository.save(this)
-                }
-
-                ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .data("jwt", token.jwtToken)
-                        .data("appid", appid)
-                        .data("expiredAt", DateUtil.getUTCTime(token.expiration.valueInMillis))
-                        .success())
-            } else {
-                ResponseEntity.status(HttpStatus.UNAUTHORIZED).build()
-            }
-        }
-    }
 
     @GetMapping("/refresh")
     fun refresh(request: HttpServletRequest): ResponseEntity<Any> {
@@ -138,9 +80,10 @@
             if (it.isPresent && it.get().status == TradeDict.STATUS_NORMAL) {
                 // 新证书
                 val token = JwtTokenUtil(jwtConfig).generateToken(
-                        mapOf("uid" to appid, "issuer" to "payapi",
+                        mapOf(Constants.JWT_CLAIM_UID to appid,
+                                "issuer" to "payapi",
                                 "audience" to jwt["audience"],
-                                "authorities" to it.get().roles.split(";")))
+                                Constants.JWT_CLAIM_AUTHORITIES to it.get().roles.split(";")))
                 JwtRedis().apply {
                     jti = token.jti
                     uid = appid
@@ -165,11 +108,40 @@
 @RestController
 class ValidateCodeController {
 
+    @Autowired
+    private lateinit var captchaProducer: Producer
+
     @GetMapping("/code/image")
     fun createCode(request: HttpServletRequest, response: HttpServletResponse) {
         val imageCode = VerifyCode(60)
         HttpSessionSessionStrategy().setAttribute(ServletWebRequest(request), ImageCodeUtil.LOGIN_IMAGECODE_SESSIONKEY, imageCode)
-        ImageIO.write(imageCode.image, "JPEG", response.outputStream)
+        val session = request.session
+        response.setDateHeader("Expires", 0)
+        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate")
+        response.addHeader("Cache-Control", "post-check=0, pre-check=0")
+        response.setHeader("Pragma", "no-cache")
+        response.contentType = "image/jpeg"
+        //生成验证码
+        val capText = captchaProducer.createText()
+        session.setAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY, capText)
+        //向客户端写出
+        val bi = captchaProducer.createImage(capText);
+        ImageIO.write(bi, "JPEG", response.outputStream)
+        try {
+            response.outputStream.flush()
+        } catch (ex: Exception) {
+            response.outputStream.close()
+        }
+    }
+}
+
+@RestController
+class UserInforController {
+
+    @RequestMapping("/api/userinfor")
+    fun user(user: Principal): Principal {
+        System.out.println(user)
+        return user
     }
 }
 
@@ -186,6 +158,23 @@
     @GetMapping("/login")
     fun loginView() = "login"
 
+    @RequestMapping("/third/logout")
+    fun oauthLogout(request: HttpServletRequest, response: HttpServletResponse) {
+        val back = request.getParameter("redirect_uri")
+        SecurityContextLogoutHandler().logout(request, null, null);
+        try {
+            SecurityContextHolder.getContext().authentication = null
+            if (back != null) {
+                response.sendRedirect(back)
+            } else {
+                logger.debug { request.getHeader("referer") }
+                response.sendRedirect(request.getHeader("referer"))
+            }
+        } catch (e: IOException) {
+            e.printStackTrace()
+        }
+    }
+
     @GetMapping("/logout")
     fun logout(request: HttpServletRequest, response: HttpServletResponse): String {
         SecurityContextHolder.getContext().authentication?.also {
@@ -200,9 +189,10 @@
         model.addAttribute("loginOper", operUser as TOperator)
         val funclist = functionService.getFunctionsByOperid(operUser.operid)
         model.addAttribute("menus", functionService.getMenuTree(funclist, -1))
-        model.addAttribute("waterVersion", commonService.getSystemVersion())
+        model.addAttribute("payapiVersion", commonService.getSystemVersion())
         return "index"
     }
+
 }
 
 @Controller
@@ -212,7 +202,7 @@
      * 控制台
      */
     @GetMapping("/console")
-    fun console() :String{
+    fun console(): String {
         return "home/console"
     }
 
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 b35904b..8379ea6 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
@@ -80,7 +80,7 @@
         if (retCode == INVALIDE_RETCODE) {
             throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "未设置返回码!")
         } else if (retCode != 0) {
-            LOGGER.error("【 ==== ERROR ==== 】: " + Gson().toJson(this.respData))
+            LOGGER.error(" ==== ERROR ==== 【retcode=[$retCode],retmsg=[$retMsg]】: data=" + Gson().toJson(this.respData))
         } else {
             LOGGER.info("retcode=[0],retmsg=[$retMsg] return success!!! \n" + Gson().toJson(this.respData))
         }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt
index 7cfa16f..d5a13dd 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
@@ -30,7 +30,7 @@
 
     override fun getSystemVersion(): String {
         return try {
-            Manifests.read("Water-Version") ?: "Unknown"
+            Manifests.read("Payapi-Version") ?: "version 1.0"
         } catch (ex: Exception) {
 //            ex.printStackTrace()
             "unknown"
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/tenant.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/tenant.kt
new file mode 100644
index 0000000..dc8bbe7
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/tenant.kt
@@ -0,0 +1,42 @@
+package com.supwisdom.dlpay.framework
+
+import com.supwisdom.dlpay.framework.tenant.TenantInterceptor
+import mu.KotlinLogging
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.context.annotation.Configuration
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
+import javax.annotation.PostConstruct
+
+
+//@Order(1)
+//@WebFilter(filterName = "multi_tenant_filter", urlPatterns = ["/*"])
+//class TenantNameFilter : Filter {
+//    override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {
+//        if (request is HttpServletRequest) {
+//            request.getHeader(Constants.HEADER_TETANTID)?.also {
+//                // set tanent datasource
+//                TenantContext.setTenantSchema(it)
+//            } ?: TenantContext.setTenantSchema("default")
+//        }
+//        chain.doFilter(request, response)
+//    }
+//}
+
+@Configuration
+class MultiTenantDatasourceConfiguration : WebMvcConfigurer {
+
+    private val logger = KotlinLogging.logger { }
+    @Autowired
+    private lateinit var tenantInterceptor: TenantInterceptor
+
+    @PostConstruct
+    fun post() {
+        logger.info("MultiTenantDatasourceConfiguration post constructor.")
+    }
+
+    override fun addInterceptors(registry: InterceptorRegistry) {
+        logger.info("adding interceptor(s).")
+        registry.addInterceptor(tenantInterceptor)
+    }
+}
diff --git a/src/main/kotlin/com/supwisdom/dlpay/security.kt b/src/main/kotlin/com/supwisdom/dlpay/security.kt
index d6a30ea..87963fe 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/security.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/security.kt
@@ -4,11 +4,9 @@
 import com.supwisdom.dlpay.framework.core.JwtTokenUtil
 import com.supwisdom.dlpay.framework.core.PasswordBCryptConfig
 import com.supwisdom.dlpay.framework.redisrepo.ApiJwtRepository
-import com.supwisdom.dlpay.framework.security.MyPermissionEvaluator
 import com.supwisdom.dlpay.framework.security.ValidateCodeSecurityConfig
 import com.supwisdom.dlpay.framework.service.OperatorDetailService
 import com.supwisdom.dlpay.framework.util.TradeDict
-import com.supwisdom.dlpay.system.common.DictPool
 import org.jose4j.jwt.consumer.InvalidJwtException
 import org.jose4j.lang.JoseException
 import org.springframework.beans.factory.annotation.Autowired
@@ -122,7 +120,7 @@
 //                                UsernamePasswordAuthenticationFilter::class.java)
                         .antMatcher("/api/**")
                         .authorizeRequests()
-                        .antMatchers("/api/**").permitAll()
+                        .antMatchers("/api/device/**").permitAll()
                         .antMatchers("/api/auth/**").permitAll()
                         .antMatchers("/api/notify/**").permitAll()
                         .antMatchers("/api/common/**").hasAnyRole("THIRD_COMMON", "THIRD_ADMIN")
@@ -152,8 +150,6 @@
             lateinit var authenticationSuccessHandler: AuthenticationSuccessHandler
             @Autowired
             lateinit var passwordBCryptConfig: PasswordBCryptConfig
-            @Autowired
-            lateinit var dictPool: DictPool
 
             @Autowired
             lateinit var userDetailsService: OperatorDetailService
@@ -188,7 +184,6 @@
             }
 
             override fun configure(http: HttpSecurity) {
-                dictPool.init() //初始化字典
 
                 // 设置 Web MVC 应用权限
                 http.apply(validateCodeSecurityConfig)
diff --git a/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
index 21ff75a..49a8b82 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/water/controller/api_controller.kt
@@ -18,7 +18,7 @@
 
 
 @RestController
-@RequestMapping("/api")
+@RequestMapping("/api/device")
 class WaterApiController {
 
     @Autowired
diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html
index 4201180..a1607f8 100644
--- a/src/main/resources/templates/login.html
+++ b/src/main/resources/templates/login.html
@@ -45,7 +45,7 @@
                     <div class="layui-input-block">
                         <div class="layui-row inline-block">
                             <div class="layui-col-xs7">
-                                <input name="imageCode" type="text"  placeholder="验证码"
+                                <input name="verifyCodeActual" type="text"  placeholder="验证码"
                                        class="layui-input" id="imageCode">
                             </div>
                             <div class="layui-col-xs5" style="padding-left: 10px;">
