修改数据字典
diff --git a/build.gradle b/build.gradle
index 8146c48..0fa1842 100644
--- a/build.gradle
+++ b/build.gradle
@@ -28,6 +28,7 @@
     implementation 'org.springframework.boot:spring-boot-starter-data-redis'
     implementation 'org.springframework.boot:spring-boot-starter-web'
     implementation 'org.springframework.boot:spring-boot-starter-security'
+    implementation 'org.springframework.boot:spring-boot-starter-cache'
     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'
diff --git a/src/main/java/com/supwisdom/dlpay/AppPreparedEvent.java b/src/main/java/com/supwisdom/dlpay/AppPreparedEvent.java
index 4dead6a..0ccb0eb 100644
--- a/src/main/java/com/supwisdom/dlpay/AppPreparedEvent.java
+++ b/src/main/java/com/supwisdom/dlpay/AppPreparedEvent.java
@@ -1,21 +1,16 @@
 package com.supwisdom.dlpay;
 
-import com.supwisdom.dlpay.system.common.DictPool;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.event.ApplicationReadyEvent;
-import org.springframework.context.annotation.Configuration;
 import org.springframework.context.event.EventListener;
 
 //@Configuration
 public class AppPreparedEvent {
-  private final DictPool dictPool;
 
-  public AppPreparedEvent(@Autowired DictPool dictPool) {
-    this.dictPool = dictPool;
+  public AppPreparedEvent() {
+
   }
 
   @EventListener(ApplicationReadyEvent.class)
   public void setupDictPool() {
-    dictPool.init(); //初始化字典
   }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TSourceType.java b/src/main/java/com/supwisdom/dlpay/api/domain/TSourceType.java
index 41d8ea9..1748dc5 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TSourceType.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TSourceType.java
@@ -1,17 +1,20 @@
 package com.supwisdom.dlpay.api.domain;
 
+import com.supwisdom.dlpay.framework.domain.DictionaryTable;
+
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
+import java.io.Serializable;
 
 /**
  * Created by shuwei on 2019/4/9.
  */
 @Entity
 @Table(name = "TB_SOURCETYPE")
-public class TSourceType {
+public class TSourceType implements DictionaryTable, Serializable {
   @Id
   @Column(name = "SOURCETYPE", nullable = false, length = 20)
   private String sourceType;
@@ -118,4 +121,14 @@
   public void setTenantid(String tenantid) {
     this.tenantid = tenantid;
   }
+
+  @Override
+  public String getDictKey() {
+    return this.sourceType;
+  }
+
+  @Override
+  public Object getDictValue() {
+    return this.paydesc;
+  }
 }
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..efdd384 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/DictionaryDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/DictionaryDao.java
@@ -2,6 +2,8 @@
 
 import com.supwisdom.dlpay.framework.domain.TDictionary;
 import com.supwisdom.dlpay.framework.domain.TDictionaryPK;
+import org.springframework.cache.annotation.CacheConfig;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
@@ -9,5 +11,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/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/TDictionary.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionary.java
index 24fccb2..16c4a9a 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionary.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TDictionary.java
@@ -2,14 +2,15 @@
 
 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)
@@ -25,11 +26,11 @@
   @NotNull
   private String tenantId;
 
-  public Integer getDicttype() {
+  public String getDicttype() {
     return dicttype;
   }
 
-  public void setDicttype(Integer dicttype) {
+  public void setDicttype(String dicttype) {
     this.dicttype = dicttype;
   }
 
@@ -56,4 +57,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/TTranscode.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TTranscode.java
index d63b46b..ac42871 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TTranscode.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TTranscode.java
@@ -5,10 +5,11 @@
 import javax.persistence.Id;
 import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
+import java.io.Serializable;
 
 @Entity
 @Table(name = "TB_TRANSCODE")
-public class TTranscode {
+public class TTranscode implements DictionaryTable, Serializable {
   @Id
   @Column(name = "TRANSCODE", nullable = false, precision = 4)
   private Integer transcode;
@@ -43,4 +44,14 @@
   public void setTenantId(String tenantId) {
     this.tenantId = tenantId;
   }
+
+  @Override
+  public String getDictKey() {
+    return String.valueOf(this.transcode);
+  }
+
+  @Override
+  public Object getDictValue() {
+    return this.transname;
+  }
 }
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..af7b9e2
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/Dictionary.java
@@ -0,0 +1,12 @@
+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 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/system/common/DictPool.java b/src/main/java/com/supwisdom/dlpay/system/common/DictPool.java
deleted file mode 100644
index 2a83dd1..0000000
--- a/src/main/java/com/supwisdom/dlpay/system/common/DictPool.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.supwisdom.dlpay.system.common;
-
-import com.supwisdom.dlpay.system.service.DictionaryDataService;
-import com.supwisdom.dlpay.util.ConstantUtil;
-import kotlin.Suppress;
-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 final HashMap<String, Object> dictmap = new HashMap<>();
-
-  private DictionaryDataService dictionaryDataService;
-
-  public DictPool(@Autowired DictionaryDataService dataService) {
-    this.dictionaryDataService = dataService;
-  }
-
-  @SuppressWarnings("unchecked")
-  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..af00076 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,12 @@
 package com.supwisdom.dlpay.system.controller;
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.system.service.DictionaryDataService;
+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 +14,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
index 1bd3bd8..0b3a882 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/DtlController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/DtlController.java
@@ -2,11 +2,16 @@
 
 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.domain.TTranscode;
+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 com.supwisdom.dlpay.system.service.ShopDataService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -20,10 +25,11 @@
 @Controller
 public class DtlController {
   @Autowired
-  private ShopDataService shopDataService;
-  @Autowired
   private DtlDataService dtlDataService;
 
+  @Autowired
+  private DictionaryProxy dictionaryProxy;
+
   /**
    * ====================================================
    * 个人流水查询
@@ -31,9 +37,16 @@
    */
   @GetMapping("/dtl/userdtl")
   public String userdtlView(Model model) {
-    model.addAttribute("paytypelist", shopDataService.getConsumePaytypes());
-    model.addAttribute("transcodelist", dtlDataService.getAllTranscodes());
-    model.addAttribute("dtlstatuslist", dtlDataService.getAllDtlStatus());
+//    model.addAttribute("paytypelist", shopDataService.getConsumePaytypes());
+//    model.addAttribute("transcodelist", dtlDataService.getAllTranscodes());
+//    model.addAttribute("dtlstatuslist", dtlDataService.getAllDtlStatus());
+
+    model.addAttribute(Dictionary.TRANS_CODE,
+        dictionaryProxy.<TTranscode>getDictionaryAsList(Dictionary.TRANS_CODE));
+    model.addAttribute(Dictionary.DTL_STATUS,
+        dictionaryProxy.<TDictionary>getDictionaryAsList(Dictionary.DTL_STATUS));
+    model.addAttribute(Dictionary.PAY_TYPE,
+        dictionaryProxy.<TSourceType>getDictionaryAsList(Dictionary.SOURCE_TYPE));
     return "system/dtl/userdtl";
   }
 
@@ -60,9 +73,12 @@
    */
   @GetMapping("/dtl/shopdtl")
   public String shopdtlView(Model model) {
-    model.addAttribute("paytypelist", shopDataService.getConsumePaytypes());
-    model.addAttribute("transcodelist", dtlDataService.getAllTranscodes());
-    model.addAttribute("dtlstatuslist", dtlDataService.getAllDtlStatus());
+    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";
   }
 
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java b/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
index 53af3c4..7a16f3b 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
@@ -369,7 +369,7 @@
     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);
+      return paramService.getSourceTypePage(paytype, pageNo, pageSize);
     } catch (Exception e) {
       e.printStackTrace();
       return new PageResult<>(99, "系统查询错误");
@@ -393,7 +393,7 @@
       return JsonResult.error("参数传递错误");
     }
     try {
-      TSourceType tPaytype = paramService.getPaytype(paytype);
+      TSourceType tPaytype = paramService.getSourceType(paytype);
       if (null == tPaytype) {
         return JsonResult.error("支付方式不存在!");
       }
@@ -419,7 +419,7 @@
         tPaytype.setEnable(state); //默认切换主状态
       }
 
-      if (paramService.saveOrUpdatePaytype(tPaytype)) {
+      if (paramService.saveOrUpdateSourceType(tPaytype)) {
         return JsonResult.ok(state ? "启用成功" : "关闭成功");
       } else {
         return JsonResult.error(!state ? "启用失败" : "关闭失败");
@@ -439,12 +439,12 @@
       return JsonResult.error("参数传递错误");
     }
     try {
-      TSourceType tPaytype = paramService.getPaytype(paytype);
+      TSourceType tPaytype = paramService.getSourceType(paytype);
       if (null == tPaytype) {
         return JsonResult.error("支付方式不存在!");
       }
       tPaytype.setPaydesc(paydesc.trim());
-      if (paramService.saveOrUpdatePaytype(tPaytype)) {
+      if (paramService.saveOrUpdateSourceType(tPaytype)) {
         return JsonResult.ok("修改成功");
       } else {
         return JsonResult.error("修改失败");
@@ -460,11 +460,11 @@
   @ResponseBody
   public JsonResult deletePaytype(@RequestParam("paytype") String paytype) {
     try {
-      TSourceType tPaytype = paramService.getPaytype(paytype);
+      TSourceType tPaytype = paramService.getSourceType(paytype);
       if (null == tPaytype) {
         return JsonResult.error("支付方式不存在!");
       }
-      if (paramService.deletePaytype(tPaytype)) {
+      if (paramService.deleteSourceType(tPaytype)) {
         return JsonResult.ok("删除成功");
       } else {
         return JsonResult.error("删除失败");
@@ -485,7 +485,7 @@
                                @RequestParam(value = "anonymousEnable", required = false, defaultValue = "no") String anonymousEnable,
                                @RequestParam("paydesc") String paydesc) {
     try {
-      TSourceType tPaytype = paramService.getPaytype(paytype);
+      TSourceType tPaytype = paramService.getSourceType(paytype);
       if (null != tPaytype) {
         return JsonResult.error("支付方式已经存在");
       }
@@ -497,7 +497,7 @@
       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)) {
+      if (paramService.saveOrUpdateSourceType(tPaytype)) {
         return JsonResult.ok("新增成功");
       } else {
         return JsonResult.error("新增失败");
@@ -511,7 +511,7 @@
   @GetMapping("/param/checkpaytype")
   @ResponseBody
   public JsonResult checkPaytype(@RequestParam("paytype") String paytype) {
-    TSourceType tPaytype = paramService.getPaytype(paytype);
+    TSourceType tPaytype = paramService.getSourceType(paytype);
     if (null != tPaytype) {
       return JsonResult.error("支付方式已经存在");
     } else {
@@ -522,7 +522,7 @@
   @GetMapping("/param/load4paytypeconfig")
   @PreAuthorize("hasPermission('/param/load4paytypeconfig','')")
   public String load4PaytypeConfig(@RequestParam("paytype") String paytype, Model model) {
-    List<TPaytypeConfig> configList = paramService.getPaytypeConfigList(paytype);
+    List<TPaytypeConfig> configList = paramService.getSourceTypeConfigList(paytype);
     model.addAttribute("configlist", configList);
     model.addAttribute("paytype", paytype);
     return "system/param/paytypeconfig";
@@ -540,7 +540,7 @@
     try {
       String paytype = param.get(paytypeHtmlKey).trim();
       param.remove(paytypeHtmlKey);
-      if (paramService.savePaytypeConfig(paytype, param)) {
+      if (paramService.saveSourceTypeConfig(paytype, param)) {
         return JsonResult.ok("配置成功");
       } else {
         return JsonResult.error("配置失败");
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/ShopController.java b/src/main/java/com/supwisdom/dlpay/system/controller/ShopController.java
index 91f12f8..f7f69bb 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/ShopController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/ShopController.java
@@ -7,11 +7,9 @@
 import com.supwisdom.dlpay.framework.domain.TShop;
 import com.supwisdom.dlpay.framework.domain.TShopacc;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
-import com.supwisdom.dlpay.framework.util.PageResult;
-import com.supwisdom.dlpay.framework.util.StringUtil;
-import com.supwisdom.dlpay.framework.util.TradeDict;
-import com.supwisdom.dlpay.framework.util.WebConstant;
+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.ConstantUtil;
@@ -34,6 +32,9 @@
   @Autowired
   private SystemUtilService systemUtilService;
 
+  @Autowired
+  private DictionaryProxy dictionaryProxy;
+
   @GetMapping("/shop/index")
   public String shopView() {
     return "system/shop/index";
@@ -157,7 +158,9 @@
    */
   @GetMapping("/shop/config")
   public String shopConfigView(Model model) {
-    model.addAttribute("paytypelist", shopDataService.getConsumePaytypes());
+//    model.addAttribute("paytypelist", shopDataService.getConsumePaytypes());
+    model.addAttribute(Dictionary.PAY_TYPE,
+        dictionaryProxy.<TSourceType>getDictionaryObject(Dictionary.SOURCE_TYPE));
     return "system/shop/config";
   }
 
@@ -233,7 +236,8 @@
   @GetMapping("/shop/load4addpaytype")
   @PreAuthorize("hasPermission('/shop/load4addpaytype','')")
   public String load4AddShopPaytype(Model model) {
-    model.addAttribute("paytypelist", shopDataService.getConsumePaytypes());
+    model.addAttribute(Dictionary.PAY_TYPE,
+        dictionaryProxy.getDictionaryAsList(Dictionary.SOURCE_TYPE));
     return "system/shop/configform";
   }
 
@@ -250,7 +254,7 @@
     }
     try {
       TShopacc shopacc = shopDataService.getShopaccByAccno(shopaccno.trim());
-      TSourceType tPaytype = paramService.getPaytype(paytype.trim());
+      TSourceType tPaytype = paramService.getSourceType(paytype.trim());
       if (null == shopacc) {
         return JsonResult.error("商户账户不存在!");
       }
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..48cc4df 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,13 @@
 package com.supwisdom.dlpay.system.service;
 
-import java.util.HashMap;
+import com.supwisdom.dlpay.framework.domain.TDictionary;
+import com.supwisdom.dlpay.framework.domain.TTranscode;
+
+import java.util.List;
 
 public interface DictionaryDataService {
-  HashMap<String, Object> getSystemAllSourcetype();
+  List<TDictionary> getDictionaryByDictType(String dicttype);
 
-  HashMap<String, Object> getDictionaryByDicttype(int dicttype);
-
-
+  List<TTranscode> getTransCode();
 
 }
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..7f8d814
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/service/DictionaryProxy.java
@@ -0,0 +1,56 @@
+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) {
+    if (Dictionary.SOURCE_TYPE.equals(dictType)) {
+      return (List<T>) paramService.getAllSourceType();
+    } else if (Dictionary.TRANS_CODE.equals(dictType)) {
+      return (List<T>) dictionaryDataService.getTransCode();
+    } else {
+      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..59afc6d 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/DtlDataService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/DtlDataService.java
@@ -21,11 +21,5 @@
   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/ParamService.java b/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
index 3d2b0e8..dc9d180 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
@@ -49,23 +49,25 @@
   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);
+  boolean saveOrUpdateSourceType(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/ShopDataService.java b/src/main/java/com/supwisdom/dlpay/system/service/ShopDataService.java
index b2eb69b..9f5bd1a 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/ShopDataService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/ShopDataService.java
@@ -29,9 +29,6 @@
   boolean saveOrUpdateShop(TShop shop) throws WebCheckException;
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
-  List<TSourceType> getConsumePaytypes();
-
-  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
   PageResult<ShopConfigBean> getShopPaytypeInfos(String shopaccno, String paytype, int pageNo, int pageSize);
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
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..523bded 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,45 @@
 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.dao.TranscodeDao;
 import com.supwisdom.dlpay.framework.domain.TDictionary;
-import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.framework.domain.TTranscode;
 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;
+  private final TranscodeDao transcodeDao;
 
-  @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,
+                                   TranscodeDao transcodeDao) {
+    this.dictionaryDao = dictionaryDao;
+    this.transcodeDao = transcodeDao;
   }
 
   @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<>();
+  }
+
+
+  @Override
+  @Cacheable(cacheNames = "trans_code_cache")
+  public List<TTranscode> getTransCode() {
+    List<TTranscode> list = transcodeDao.findAll();
+    if (!list.isEmpty()) {
+      return list;
+    }
+    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
index 869bf31..82fbdc2 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/DtlDataServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/DtlDataServiceImpl.java
@@ -4,20 +4,20 @@
 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.dao.DictionaryDao;
 import com.supwisdom.dlpay.framework.dao.ShopDao;
 import com.supwisdom.dlpay.framework.dao.TranscodeDao;
 import com.supwisdom.dlpay.framework.domain.TDictionary;
 import com.supwisdom.dlpay.framework.domain.TShop;
 import com.supwisdom.dlpay.framework.domain.TTranscode;
 import com.supwisdom.dlpay.framework.util.DateUtil;
+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.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 com.supwisdom.dlpay.util.ConstantUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
@@ -32,6 +32,7 @@
 import javax.persistence.criteria.Root;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 @Service
 public class DtlDataServiceImpl implements DtlDataService {
@@ -42,7 +43,7 @@
   @Autowired
   private TranscodeDao transcodeDao;
   @Autowired
-  private DictionaryDao dictionaryDao;
+  private DictionaryProxy dictionaryProxy;
   @Autowired
   private ShopDao shopDao;
 
@@ -53,32 +54,32 @@
       @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.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.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.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.getEndTransdate())) {
+          predicates.add(criteriaBuilder.le(root.get("transdate").as(Integer.class), Integer.valueOf(DateUtil.unParseToDateFormat(searchBean.getEndTransdate()))));
         }
-        if(!StringUtil.isEmpty(searchBean.getPersonname())){
+        if (!StringUtil.isEmpty(searchBean.getPersonname())) {
           predicates.add(criteriaBuilder.like(root.get("userName").as(String.class), "%" + searchBean.getPersonname().trim() + "%"));
         }
-        if(!StringUtil.isEmpty(searchBean.getSourcetype())){
+        if (!StringUtil.isEmpty(searchBean.getSourcetype())) {
           predicates.add(criteriaBuilder.equal(root.get("sourceType").as(String.class), searchBean.getSourcetype().trim()));
         }
-        if(!StringUtil.isEmpty(searchBean.getTradeflag())){
+        if (!StringUtil.isEmpty(searchBean.getTradeflag())) {
           predicates.add(criteriaBuilder.equal(root.get("tradeflag").as(String.class), searchBean.getTradeflag().trim()));
         }
-        if(!StringUtil.isEmpty(searchBean.getTranscode())){
+        if (!StringUtil.isEmpty(searchBean.getTranscode())) {
           predicates.add(criteriaBuilder.equal(root.get("transcode").as(String.class), searchBean.getTranscode().trim()));
         }
-        if(!StringUtil.isEmpty(searchBean.getStatus())){
+        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]));
@@ -90,62 +91,45 @@
   @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(new Specification<TShopdtl>() {
-      @Override
-      public Predicate toPredicate(Root<TShopdtl> 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.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]));
+    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);
   }
 
   @Override
-  public List<TTranscode> getAllTranscodes(){
-    return transcodeDao.findAll();
-  }
-
-  @Override
-  public List<TDictionary> getAllDtlStatus(){
-    List<TDictionary> list = dictionaryDao.findAllByDicttype(ConstantUtil.DICTTYPE_NO2);
-    if(!StringUtil.isEmpty(list)){
-      return list;
-    }
-    return new ArrayList<>(0);
-  }
-
-  @Override
   public List<TreeSelectNode> getTreeSelectShops() {
     List<TShop> shoplist = shopDao.getNormalShops();
     if (StringUtil.isEmpty(shoplist)) {
@@ -160,7 +144,7 @@
       if (fshopid.equals(shop.getFshopid())) {
         TreeSelectNode node = new TreeSelectNode();
         node.setId(String.valueOf(shop.getShopid()));
-        if(!StringUtil.isEmpty(shop.getShopaccno())){
+        if (!StringUtil.isEmpty(shop.getShopaccno())) {
           node.setId(shop.getShopaccno()); //替换商户账号
         }
         node.setName(shop.getShopname());
@@ -168,9 +152,9 @@
         node.setChecked(false);
         node.setAccno(shop.getShopaccno());
         List<TreeSelectNode> children = getShopSelectTree(shoplist, shop.getShopid());
-        if(null!=children && children.size()>0){
+        if (null != children && children.size() > 0) {
           node.setChildren(children);
-        }else{
+        } else {
           node.setChildren(null);
         }
         result.add(node);
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 babde31..4fe84f7 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
@@ -16,6 +16,8 @@
 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 +43,7 @@
   @Autowired
   private ApiClientDao apiClientDao;
   @Autowired
-  private SourceTypeDao paytypeDao;
+  private SourceTypeDao sourceTypeDao;
   @Autowired
   private PaytypeConfigDao paytypeConfigDao;
 
@@ -150,42 +152,52 @@
   }
 
   @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) {
+  @Cacheable(cacheNames = "source_type_cache")
+  public List<TSourceType> getAllSourceType() {
+    return sourceTypeDao.findAll();
+  }
+
+  @Override
+  @Cacheable(cacheNames = "source_type_cache", key = "#paytype.sourceType")
+  public boolean saveOrUpdateSourceType(TSourceType paytype) {
     if (null != paytype) {
-      paytypeDao.save(paytype);
+      sourceTypeDao.save(paytype);
       return true;
     }
     return false;
   }
 
   @Override
-  public boolean deletePaytype(TSourceType paytype) {
+  @CacheEvict(cacheNames = "source_type_cache", key = "#paytype.sourceType")
+  public boolean deleteSourceType(TSourceType paytype) {
     if (null != paytype) {
-      paytypeDao.delete(paytype);
+      sourceTypeDao.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,8 +207,9 @@
   }
 
   @Override
-  public boolean savePaytypeConfig(String paytype, Map<String, String> param) throws WebCheckException {
-    TSourceType tPaytype = getPaytype(paytype);
+  @Cacheable(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);
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
index 0594fcc..88d4deb 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/ShopDataServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/ShopDataServiceImpl.java
@@ -160,15 +160,6 @@
   }
 
   @Override
-  public List<TSourceType> getConsumePaytypes() {
-    List<TSourceType> list = paytypeDao.getConsumeSourceTypes();
-    if (!StringUtil.isEmpty(list)) {
-      return list;
-    }
-    return new ArrayList<TSourceType>(0);
-  }
-
-  @Override
   public PageResult<ShopConfigBean> getShopPaytypeInfos(String shopaccno, String paytype, int pageNo, int pageSize) {
     Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("shopaccno", "paytype"));
 
diff --git a/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt b/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt
index 944944f..0181d2d 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/PayApiApplication.kt
@@ -4,6 +4,7 @@
 import org.springframework.beans.factory.annotation.Value
 import org.springframework.boot.autoconfigure.SpringBootApplication
 import org.springframework.boot.runApplication
+import org.springframework.cache.annotation.EnableCaching
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient
 import org.springframework.context.annotation.Bean
 import org.springframework.context.annotation.Configuration
@@ -70,6 +71,7 @@
 @SpringBootApplication
 @EnableDiscoveryClient
 @EnableScheduling
+@EnableCaching
 class PayApiApplication
 
 fun main(args: Array<String>) {
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
index 6b60981..5e91f80 100644
--- a/src/main/resources/data.sql
+++ b/src/main/resources/data.sql
@@ -490,21 +490,21 @@
 VALUES (3500, '账户充值', '{tenantid}');
 
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('cancel', 1, '冲正', '冲正状态', '{tenantid}');
+VALUES ('cancel', 'reverseFlagList', '冲正', '冲正状态', '{tenantid}');
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('reverse', 1, '手工撤销', '冲正状态', '{tenantid}');
+VALUES ('reverse', 'reverseFlagList', '手工撤销', '冲正状态', '{tenantid}');
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('none', 1, ' ', '冲正状态', '{tenantid}');
+VALUES ('none', 'reverseFlagList', '-', '冲正状态', '{tenantid}');
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('init', 2, '初始化', '流水状态', '{tenantid}');
+VALUES ('init', 'dtlStatusList', '初始化', '流水状态', '{tenantid}');
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('success', 2, '交易成功', '流水状态', '{tenantid}');
+VALUES ('success', 'dtlStatusList', '交易成功', '流水状态', '{tenantid}');
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('fail', 2, '交易失败', '流水状态', '{tenantid}');
+VALUES ('fail', 'dtlStatusList', '交易失败', '流水状态', '{tenantid}');
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('wip', 2, '待支付', '流水状态', '{tenantid}');
+VALUES ('wip', 'dtlStatusList','待支付', '流水状态', '{tenantid}');
 INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('cancel', 2, '交易取消', '流水状态', '{tenantid}');
+VALUES ('cancel','dtlStatusList', '交易取消', '流水状态', '{tenantid}');
 
 ----------------------------------------------------
 commit;
\ No newline at end of file
diff --git a/src/main/resources/static/libs/custom.js b/src/main/resources/static/libs/custom.js
index 24dc9ad..e91928d 100644
--- a/src/main/resources/static/libs/custom.js
+++ b/src/main/resources/static/libs/custom.js
@@ -21,7 +21,7 @@
                         data: "dicttype=" + dictType,
                         contentType: "application/x-www-form-urlencoded",
                         success: function (data) {
-                            if (data == null || data == "") {
+                            if (data == null || data === "") {
                                 that.storage.removeItem(dictType);
                             } else {
                                 that.storage.setItem(dictType, JSON.stringify(data));
@@ -60,15 +60,15 @@
             },
             initAll: function (url) {
                 this.url = url;
-                this.addNewDict("allSourcetypeList").addNewDict("allReverseflagList");
+                this.addNewDict("sourcetypeList").addNewDict("reverseFlagList");
             },
             getDict: function (dictType) {
                 var dict, that = this;
-                if (that.pool[dictType] != undefined) {
+                if (that.pool[dictType] !== undefined) {
                     return that.pool[dictType];
                 } else {
                     dict = that.storage.getItem(dictType);
-                    if (dict == undefined) {
+                    if (dict === undefined) {
                         return null;
                     } else {
                         that.pool[dictType] = JSON.parse(dict);
@@ -83,7 +83,7 @@
                     return code;
                 } else {
                     var c = "" + code;
-                    return dict[c] == undefined ? code : dict[c];
+                    return dict[c] === undefined ? code : dict[c];
                 }
             }
         }
diff --git a/src/main/resources/templates/system/dtl/userdtl.html b/src/main/resources/templates/system/dtl/userdtl.html
index 4291d59..a2e9d96 100644
--- a/src/main/resources/templates/system/dtl/userdtl.html
+++ b/src/main/resources/templates/system/dtl/userdtl.html
@@ -12,7 +12,8 @@
                 <div class="layui-inline">
                     <label class="layui-form-label">记账日期</label>
                     <div class="layui-input-inline" style="width: 120px;">
-                        <input type="text" name="startAccdate" id="userdtl-search-startAccdate" placeholder="开始日期"
+                        <input type="text" name="startAccdate" id="userdtl-search-startAccdate"
+                               placeholder="开始日期"
                                autocomplete="off" class="layui-input"/>
                     </div>
                     <div class="layui-form-mid">-</div>
@@ -47,7 +48,7 @@
                     <div class="layui-input-block">
                         <select name="transStatus" id="userdtl-search-transStatus" class="layui-select">
                             <option value=""> 全部</option>
-                            <option th:each="st:${dtlstatuslist}" th:value="${st.dictval}"
+                            <option th:each="st:${dtlStatusList}" th:value="${st.dictval}"
                                     th:text="${st.dictcaption}"></option>
                         </select>&emsp;
                     </div>
@@ -58,12 +59,14 @@
                 <div class="layui-inline">
                     <label class="layui-form-label">交易日期</label>
                     <div class="layui-input-inline" style="width: 120px;">
-                        <input type="text" name="startTransdate" id="userdtl-search-startTransdate" placeholder="开始日期"
+                        <input type="text" name="startTransdate" id="userdtl-search-startTransdate"
+                               placeholder="开始日期"
                                autocomplete="off" class="layui-input"/>
                     </div>
                     <div class="layui-form-mid">-</div>
                     <div class="layui-input-inline" style="width: 120px;">
-                        <input type="text" name="endTransdate" id="userdtl-search-endTransdate" placeholder="结束日期"
+                        <input type="text" name="endTransdate" id="userdtl-search-endTransdate"
+                               placeholder="结束日期"
                                autocomplete="off" class="layui-input"/>
                     </div>
                 </div>
@@ -92,7 +95,7 @@
                     <div class="layui-input-block">
                         <select name="transcode" id="userdtl-search-transcode" class="layui-select">
                             <option value=""> 全部</option>
-                            <option th:each="tc:${transcodelist}" th:value="${tc.transcode}"
+                            <option th:each="tc:${transcodeList}" th:value="${tc.transcode}"
                                     th:text="${tc.transname}"></option>
                         </select>
                     </div>
@@ -181,25 +184,33 @@
                     {field: 'userName', title: '姓名', align: 'center', width: 150},
                     {field: 'amount', title: '交易金额', align: 'center', width: 120, sort: true},
                     {
-                        field: 'transStatus', title: '状态', align: 'center', width: 90, templet: function (item) {
-                            if (item.transStatus == 'init') {
+                        field: 'status',
+                        title: '状态',
+                        align: 'center',
+                        width: 90,
+                        templet: function (item) {
+                            if (item.status === 'init') {
                                 return '<span class="layui-badge layui-bg-gray">初始化</span>';
-                            } else if (item.transStatus == 'success') {
+                            } else if (item.status === 'success') {
                                 return '<span class="layui-badge layui-bg-green">成功</span>';
-                            } else if (item.transStatus == 'fail') {
+                            } else if (item.status === 'fail') {
                                 return '<span class="layui-badge">失败</span>';
-                            } else if (item.transStatus == 'wip') {
+                            } else if (item.status === 'wip') {
                                 return '<span class="layui-badge layui-bg-orange">待支付</span>';
                             } else {
-                                return item.transStatus;
+                                return item.status;
                             }
                         }
                     },
                     {
-                        field: 'tradeflag', title: '类型', align: 'center', width: 60, templet: function (item) {
-                            if (item.tradeflag == 'in') {
+                        field: 'tradeflag',
+                        title: '类型',
+                        align: 'center',
+                        width: 60,
+                        templet: function (item) {
+                            if (item.tradeflag === 'in') {
                                 return '<span style="color: green;">收入</span>';
-                            } else if (item.tradeflag == 'out') {
+                            } else if (item.tradeflag === 'out') {
                                 return '<span style="color: red;">支出</span>';
                             } else {
                                 return item.tradeflag;
@@ -215,12 +226,16 @@
                         width: 130,
                         sort: true,
                         templet: function (item) {
-                            return getTempDictValue('allSourcetypeList', item.sourceType);
+                            return getTempDictValue('sourcetypeList', item.sourceType);
                         }
                     },
                     {
-                        field: 'reverseFlag', title: '冲正状态', align: 'center', width: 100, templet: function (item) {
-                            return getTempDictValue('allReverseflagList', item.reverseFlag);
+                        field: 'reverseFlag',
+                        title: '冲正状态',
+                        align: 'center',
+                        width: 100,
+                        templet: function (item) {
+                            return getTempDictValue('reverseFlagList', item.reverseFlag);
                         }
                     },
                     {field: 'oppositeAccName', title: '交易对象', align: 'center', width: 250},