diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeConfigDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeConfigDao.java
index 036161a..a7164c8 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeConfigDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeConfigDao.java
@@ -11,4 +11,7 @@
 public interface ShopPaytypeConfigDao extends JpaRepository<TShopPaytypeConfig, String> {
   @Query("select a from TShopPaytypeConfig a where a.paytype=?1 and a.shopaccno=?2 ")
   List<TShopPaytypeConfig> getShopPaytypeConfigs(String paytype, String shopaccno);
+
+  @Query("select a from TShopPaytypeConfig a where a.shopaccno=?1 and a.paytype=?2 and a.configid=?3 ")
+  TShopPaytypeConfig getShopPaytypeConfigById(String shopaccno,String paytype, String configid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypeConfig.java b/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypeConfig.java
index 4d9fd72..acea209 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypeConfig.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypeConfig.java
@@ -11,7 +11,7 @@
   @GenericGenerator(name = "idGenerator", strategy = "uuid")
   @GeneratedValue(generator = "idGenerator")
   @Column(name = "CFGID", nullable = false, length = 32)
-  private Integer cfgid;
+  private String cfgid;
 
   @Column(name = "SHOPACCNO", nullable = false, length = 10)
   private String shopaccno;
@@ -39,11 +39,11 @@
     this.configName = configName;
   }
 
-  public Integer getCfgid() {
+  public String getCfgid() {
     return cfgid;
   }
 
-  public void setCfgid(Integer cfgid) {
+  public void setCfgid(String cfgid) {
     this.cfgid = cfgid;
   }
 
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/ZTreeNode.java b/src/main/java/com/supwisdom/dlpay/system/bean/ZTreeNode.java
index cd18d0a..61e122e 100644
--- a/src/main/java/com/supwisdom/dlpay/system/bean/ZTreeNode.java
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/ZTreeNode.java
@@ -9,6 +9,7 @@
     private boolean open;
 
     private Integer shoptype; //商户类别，商户树用到
+    private String shopaccno; //商户账号
     private String iconSkin; //自定义图标
 
     public boolean isOpen() {
@@ -59,6 +60,14 @@
         this.shoptype = shoptype;
     }
 
+    public String getShopaccno() {
+        return shopaccno;
+    }
+
+    public void setShopaccno(String shopaccno) {
+        this.shopaccno = shopaccno;
+    }
+
     public String getIconSkin() {
         return iconSkin;
     }
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 5f09c4e..2aba10b 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/ShopController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/ShopController.java
@@ -3,13 +3,18 @@
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.api.domain.TPaytype;
 import com.supwisdom.dlpay.api.domain.TShopPaytype;
+import com.supwisdom.dlpay.api.domain.TShopPaytypeConfig;
 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.system.bean.ShopConfigBean;
+import com.supwisdom.dlpay.system.service.ParamService;
 import com.supwisdom.dlpay.system.service.ShopDataService;
+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;
@@ -17,10 +22,17 @@
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+import java.util.Map;
+
 @Controller
 public class ShopController {
   @Autowired
   private ShopDataService shopDataService;
+  @Autowired
+  private ParamService paramService;
+  @Autowired
+  private SystemUtilService systemUtilService;
 
   @GetMapping("/shop/index")
   public String shopView() {
@@ -30,7 +42,7 @@
   @GetMapping("/shop/shoptree")
   @PreAuthorize("hasPermission('/shop/index','')")
   @ResponseBody
-  public JsonResult shopTreeData(){
+  public JsonResult shopTreeData() {
     return JsonResult.ok("OK").put("data", shopDataService.getAllShopNodes());
   }
 
@@ -39,19 +51,19 @@
   @ResponseBody
   public JsonResult deleteShop(@RequestParam("shopid") Integer shopid) {
     TShop shop = shopDataService.getShopByShopid(shopid);
-    if(null==shop){
+    if (null == shop) {
       return JsonResult.error("商户不存在，请重新查询");  //商户不存在，请重新查询
     }
 
-    try{
-      if(shopDataService.deleteShop(shop)){
+    try {
+      if (shopDataService.deleteShop(shop)) {
         return JsonResult.ok("删除成功");
-      }else{
+      } else {
         return JsonResult.error("删除失败");
       }
-    }catch (WebCheckException ex){
+    } catch (WebCheckException ex) {
       return JsonResult.error(ex.getMessage());
-    }catch (Exception e){
+    } catch (Exception e) {
       return JsonResult.error("系统处理异常").put("exception", e);
     }
   }
@@ -124,22 +136,23 @@
     shop.setAddr(addr == null ? null : addr.trim());
     shop.setZipcode(zipcode == null ? null : zipcode.trim());
 
-    try{
-      if(shopDataService.saveOrUpdateShop(shop)){
-        return JsonResult.ok(addflag?"新增成功":"修改成功").put("shop",shop);
-      }else{
-        return JsonResult.error(addflag?"新增失败":"修改失败");
+    try {
+      if (shopDataService.saveOrUpdateShop(shop)) {
+        return JsonResult.ok(addflag ? "新增成功" : "修改成功").put("shop", shop);
+      } else {
+        return JsonResult.error(addflag ? "新增失败" : "修改失败");
       }
-    }catch (WebCheckException ex){
+    } catch (WebCheckException ex) {
       return JsonResult.error(ex.getMessage());
-    }catch (Exception e){
+    } catch (Exception e) {
+      e.printStackTrace();
       return JsonResult.error("系统处理异常").put("exception", e);
     }
   }
 
   /**
    * ====================================================
-   *              商户支付能力配置
+   * 商户支付能力配置
    * ====================================================
    */
   @GetMapping("/shop/config")
@@ -151,7 +164,7 @@
   @GetMapping("/shop/shopacctree")
   @PreAuthorize("hasPermission('/shop/config','')")
   @ResponseBody
-  public JsonResult shopaccTreeData(){
+  public JsonResult shopaccTreeData() {
     return JsonResult.ok("OK").put("data", shopDataService.getAllShopNodes());
   }
 
@@ -160,17 +173,151 @@
   @ResponseBody
   public PageResult<ShopConfigBean> getShopPaytypeList(@RequestParam("page") Integer pageNo,
                                                        @RequestParam("limit") Integer pageSize,
-                                                       @RequestParam(value = "shopid", required = false) Integer shopid,
                                                        @RequestParam(value = "paytype", required = false) String paytype,
                                                        @RequestParam(value = "shopaccno", required = false) String shopaccno) {
     try {
       if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
       if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
-      return shopDataService.getShopPaytypeInfos(shopaccno, paytype, shopid, pageNo, pageSize);
+      return shopDataService.getShopPaytypeInfos(shopaccno, paytype, pageNo, pageSize);
     } catch (Exception e) {
       e.printStackTrace();
       return new PageResult<>(99, "系统查询错误");
     }
   }
 
+  @PostMapping("/shop/updatepaytypestat")
+  @PreAuthorize("hasPermission('/shop/updatepaytypestat','')")
+  @ResponseBody
+  public JsonResult updateShopPaytypeStat(@RequestParam("shopaccno") String shopaccno, @RequestParam("paytype") String paytype,
+                                          @RequestParam("state") String state, @RequestParam("optype") String optype) {
+    if (StringUtil.isEmpty(shopaccno) || StringUtil.isEmpty(paytype)
+        || (!ConstantUtil.ENABLE_NO.equals(state) && !ConstantUtil.ENABLE_YES.equals(state))
+        || (!"consume".equals(optype) && !"anonymous".equals(optype) && !"reverse".equals(optype))) {
+      return JsonResult.error("参数传递错误");
+    }
+
+    try {
+      TShopPaytype shopPaytype = shopDataService.getShopPaytype(shopaccno.trim(), paytype.trim());
+      if (null == shopPaytype) {
+        return JsonResult.error("商户支付能力不存在！");
+      }
+
+      if ("consume".equals(optype)) {
+        if (state.equals(shopPaytype.getConsumeEnable())) {
+          return JsonResult.error("状态错误，请重新查询后操作");
+        }
+        shopPaytype.setConsumeEnable(state);
+      } else if ("anonymous".equals(optype)) {
+        if (state.equals(shopPaytype.getAnonymousEnable())) {
+          return JsonResult.error("状态错误，请重新查询后操作");
+        }
+        shopPaytype.setAnonymousEnable(state);
+      } else if ("reverse".equals(optype)) {
+        if (state.equals(shopPaytype.getReverseEnable())) {
+          return JsonResult.error("状态错误，请重新查询后操作");
+        }
+        shopPaytype.setReverseEnable(state);
+      }
+
+      if (shopDataService.saveOrUpdateShopPaytype(shopPaytype)) {
+        return JsonResult.ok(ConstantUtil.ENABLE_YES.equals(state) ? "启用成功" : "关闭成功");
+      } else {
+        return JsonResult.error(ConstantUtil.ENABLE_YES.equals(state) ? "启用失败" : "关闭失败");
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      return JsonResult.error("系统处理异常").put("exception", e);
+    }
+  }
+
+  @GetMapping("/shop/load4addpaytype")
+  @PreAuthorize("hasPermission('/shop/load4addpaytype','')")
+  public String load4AddShopPaytype(Model model){
+    model.addAttribute("paytypelist", shopDataService.getConsumePaytypes());
+    return "system/shop/configform";
+  }
+
+  @PostMapping("/shop/addshoppaytype")
+  @PreAuthorize("hasPermission('/shop/addshoppaytype','')")
+  @ResponseBody
+  public JsonResult addShoppaytype(@RequestParam("shopaccno") String shopaccno,
+                                   @RequestParam("paytype") String paytype,
+                                   @RequestParam(value = "consumeEnable", required = false, defaultValue = "no") String consumeEnable,
+                                   @RequestParam(value = "anonymousEnable", required = false, defaultValue = "no") String anonymousEnable,
+                                   @RequestParam(value = "reverseEnable", required = false, defaultValue = "no") String reverseEnable) {
+    if(StringUtil.isEmpty(shopaccno) || StringUtil.isEmpty(paytype)){
+      return JsonResult.error("参数传递错误");
+    }
+    try {
+      TShopacc shopacc = shopDataService.getShopaccByAccno(shopaccno.trim());
+      TPaytype tPaytype = paramService.getPaytype(paytype.trim());
+      if (null == shopacc) {
+        return JsonResult.error("商户账户不存在！");
+      }
+      if (null == tPaytype) {
+        return JsonResult.error("支付方式在系统中不存在！");
+      }
+      TShopPaytype shopPaytype = shopDataService.getShopPaytype(shopaccno.trim(), paytype.trim());
+      if (null != shopPaytype) {
+        return JsonResult.error("商户该支付能力已经存在！");
+      }
+      shopPaytype = new TShopPaytype();
+      shopPaytype.setShopaccno(shopacc.getShopaccno());
+      shopPaytype.setPaytype(tPaytype.getPaytype());
+      shopPaytype.setConsumeEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(consumeEnable) ? ConstantUtil.ENABLE_YES : ConstantUtil.ENABLE_NO);
+      shopPaytype.setAnonymousEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(anonymousEnable) ? ConstantUtil.ENABLE_YES : ConstantUtil.ENABLE_NO);
+      shopPaytype.setReverseEnable(ConstantUtil.ENABLE_YES.equalsIgnoreCase(reverseEnable) ? ConstantUtil.ENABLE_YES : ConstantUtil.ENABLE_NO);
+      shopPaytype.setCreatetime(systemUtilService.getSysdatetime().getHostdatetime());
+      if (shopDataService.saveOrUpdateShopPaytype(shopPaytype)) {
+        return JsonResult.ok("新增成功");
+      } else {
+        return JsonResult.error("新增失败");
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      return JsonResult.error("系统处理异常").put("exception", e);
+    }
+  }
+
+  @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";
+  }
+
+  @PostMapping("/shop/addpaytypepara")
+  @PreAuthorize("hasPermission('/shop/addpaytypepara','')")
+  @ResponseBody
+  public JsonResult addShopPaytypePara(@RequestBody Map<String, String> param) {
+    String shopaccnoHtmlKey = "hid_shopaccno"; //页面上传来shopaccno的KEY
+    String paytypeHtmlKey = "hid_paytype"; //页面上传来paytype的KEY
+    if (null == param || StringUtil.isEmpty(param.get(paytypeHtmlKey)) || StringUtil.isEmpty(param.get(shopaccnoHtmlKey))) {
+      return JsonResult.error("参数传递错误");
+    }
+    try {
+      String shopaccno = param.get(shopaccnoHtmlKey).trim();
+      String paytype = param.get(paytypeHtmlKey).trim();
+      param.remove(shopaccnoHtmlKey);
+      param.remove(paytypeHtmlKey);
+      if (shopDataService.saveOrUpdateShopPaytypeConfig(shopaccno, 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/service/ShopDataService.java b/src/main/java/com/supwisdom/dlpay/system/service/ShopDataService.java
index fe9ce27..63b9f27 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/ShopDataService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/ShopDataService.java
@@ -1,7 +1,10 @@
 package com.supwisdom.dlpay.system.service;
 
 import com.supwisdom.dlpay.api.domain.TPaytype;
+import com.supwisdom.dlpay.api.domain.TShopPaytype;
+import com.supwisdom.dlpay.api.domain.TShopPaytypeConfig;
 import com.supwisdom.dlpay.framework.domain.TShop;
+import com.supwisdom.dlpay.framework.domain.TShopacc;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.system.bean.ShopConfigBean;
 import com.supwisdom.dlpay.system.bean.ZTreeNode;
@@ -10,6 +13,7 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Map;
 
 public interface ShopDataService {
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
@@ -28,5 +32,22 @@
   List<TPaytype> getConsumePaytypes();
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
-  PageResult<ShopConfigBean> getShopPaytypeInfos(String shopaccno, String paytype, Integer shopid, int pageNo, int pageSize);
+  PageResult<ShopConfigBean> getShopPaytypeInfos(String shopaccno, String paytype, int pageNo, int pageSize);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+  TShopPaytype getShopPaytype(String shopaccno, String paytype);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+  TShopacc getShopaccByAccno(String shopaccno);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  boolean saveOrUpdateShopPaytype(TShopPaytype shopPaytype);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,readOnly = true)
+  List<TShopPaytypeConfig> getShopPaytypeConfigs(String shopaccno, String paytype);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  boolean saveOrUpdateShopPaytypeConfig(String shopaccno, String paytype, Map<String, String> param) throws WebCheckException;
+
+
 }
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 75722c7..37101ad 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
@@ -1,9 +1,13 @@
 package com.supwisdom.dlpay.system.service.impl;
 
+import com.supwisdom.dlpay.api.dao.PaytypeConfigDao;
 import com.supwisdom.dlpay.api.dao.PaytypeDao;
+import com.supwisdom.dlpay.api.dao.ShopPaytypeConfigDao;
 import com.supwisdom.dlpay.api.dao.ShopPaytypeDao;
 import com.supwisdom.dlpay.api.domain.TPaytype;
+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.framework.dao.ShopDao;
 import com.supwisdom.dlpay.framework.dao.ShopaccDao;
 import com.supwisdom.dlpay.framework.data.SystemDateTime;
@@ -30,6 +34,7 @@
 import javax.persistence.criteria.*;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 @Service
 public class ShopDataServiceImpl implements ShopDataService {
@@ -43,6 +48,10 @@
   private SystemUtilService systemUtilService;
   @Autowired
   private PaytypeDao paytypeDao;
+  @Autowired
+  private PaytypeConfigDao paytypeConfigDao;
+  @Autowired
+  private ShopPaytypeConfigDao shopPaytypeConfigDao;
 
   @Override
   public List<ZTreeNode> getAllShopNodes() {
@@ -53,12 +62,13 @@
         if (null == shop || !TradeDict.STATUS_NORMAL.equals(shop.getStatus())) continue; //跳过注销商户
         ZTreeNode node = new ZTreeNode();
         node.setId(shop.getShopid().toString());
-        node.setName(shop.getShopid()+"_"+shop.getShopname());
+        node.setName(shop.getShopid() + "_" + shop.getShopname());
         node.setpId(shop.getFshopid() == null ? "" : shop.getFshopid().toString());
         node.setChecked(false);
         node.setOpen(true);
         node.setShoptype(shop.getShoptype());
-        node.setIconSkin(shop.getShoptype()==0?"pIcon01":"pIcon02");
+        node.setShopaccno(StringUtil.isEmpty(shop.getShopaccno()) ? "" : shop.getShopaccno());
+        node.setIconSkin(shop.getShoptype() == 0 ? "pIcon01" : "pIcon02");
         result.add(node);
       }
     }
@@ -74,17 +84,17 @@
   }
 
   @Override
-  public boolean deleteShop(TShop shop) throws WebCheckException{
-    if(null!=shop){
+  public boolean deleteShop(TShop shop) throws WebCheckException {
+    if (null != shop) {
       List<TShop> childShops = shopDao.getChildShopsByShopid(shop.getShopid());
-      if(!StringUtil.isEmpty(childShops))
+      if (!StringUtil.isEmpty(childShops))
         throw new WebCheckException("请先删除下级商户");
       shop.setStatus(TradeDict.STATUS_CLOSED);
       shop.setClosedate(systemUtilService.getSysdatetime().getHostdate());
       shopDao.save(shop);
-      if(!StringUtil.isEmpty(shop.getShopaccno())){
-        TShopacc shopacc=shopaccDao.getByShopaccno(shop.getShopaccno());
-        if(null==shopacc) throw new WebCheckException("数据异常！对应的商户账户不存在！");
+      if (!StringUtil.isEmpty(shop.getShopaccno())) {
+        TShopacc shopacc = shopaccDao.getByShopaccno(shop.getShopaccno());
+        if (null == shopacc) throw new WebCheckException("数据异常！对应的商户账户不存在！");
         shopacc.setStatus(TradeDict.STATUS_CLOSED);
         shopacc.setClosedate(shop.getClosedate());
         shopaccDao.save(shopacc);
@@ -100,7 +110,7 @@
       TShop fshop = shopDao.getTShopByShopid(shop.getFshopid());
       if (null == fshop) {
         throw new WebCheckException("上级商户不存在！");
-      }else if(fshop.getShoptype()==1){
+      } else if (fshop.getShoptype() == 1) {
         throw new WebCheckException("上级商户不是商户组！");
       }
     }
@@ -130,6 +140,9 @@
         shopacc.setBalance(0D);
         shopaccDao.save(shopacc);
 
+        shop.setShopaccno(shopacc.getShopaccno());
+        shopDao.save(shop);
+
         TShopPaytype shopPaytype = new TShopPaytype();
         shopPaytype.setShopaccno(shopacc.getShopaccno());
         shopPaytype.setPaytype(TradeDict.PAYTYPE_BALANCE);
@@ -153,7 +166,7 @@
   }
 
   @Override
-  public PageResult<ShopConfigBean> getShopPaytypeInfos(String shopaccno, String paytype, Integer shopid, int pageNo, int pageSize) {
+  public PageResult<ShopConfigBean> getShopPaytypeInfos(String shopaccno, String paytype, int pageNo, int pageSize) {
     Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("shopaccno", "paytype"));
 
     Page<TShopPaytype> page = shopPaytypeDao.findAll(new Specification<TShopPaytype>() {
@@ -166,10 +179,6 @@
         if (!StringUtil.isEmpty(paytype)) {
           predicates.add(criteriaBuilder.equal(root.get("paytype").as(String.class), paytype.trim()));
         }
-        if (null != shopid) {
-          Join<TShopPaytype, TShopacc> joinShopacc = root.join("shopaccno", JoinType.LEFT);
-          predicates.add(criteriaBuilder.equal(joinShopacc.get("shopid").as(Integer.class), shopid));
-        }
         return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
       }
     }, pageable);
@@ -194,5 +203,76 @@
     return new PageResult<>(page.getTotalElements(), list);
   }
 
+  @Override
+  public TShopPaytype getShopPaytype(String shopaccno, String paytype) {
+    return shopPaytypeDao.getById(paytype, shopaccno);
+  }
+
+  @Override
+  public TShopacc getShopaccByAccno(String shopaccno) {
+    if(!StringUtil.isEmpty(shopaccno)){
+      return shopaccDao.getByShopaccno(shopaccno.trim());
+    }
+    return null;
+  }
+
+  @Override
+  public boolean saveOrUpdateShopPaytype(TShopPaytype shopPaytype) {
+    if (null != shopPaytype) {
+      shopPaytypeDao.save(shopPaytype);
+      return true;
+    }
+    return false;
+  }
+
+  @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;
+  }
+
+  @Override
+  public boolean saveOrUpdateShopPaytypeConfig(String shopaccno, String paytype, Map<String, String> param) throws WebCheckException {
+    TShopPaytype shopPaytype = getShopPaytype(shopaccno, paytype);
+    if (null == shopPaytype) {
+      throw new WebCheckException("此商户[" + shopaccno + "]还不具有该支付能力[" + paytype + "]");
+    }
+    for (String key : param.keySet()) {
+      String value = param.get(key);
+      TShopPaytypeConfig spc = shopPaytypeConfigDao.getShopPaytypeConfigById(shopPaytype.getShopaccno(), shopPaytype.getPaytype(), key);
+      if (null != spc) {
+        spc.setConfigValue(StringUtil.isEmpty(value) ? null : value.trim());
+      } else {
+        spc = new TShopPaytypeConfig();
+        spc.setShopaccno(shopPaytype.getShopaccno());
+        spc.setPaytype(shopPaytype.getPaytype());
+        spc.setConfigid(key);
+        spc.setConfigValue(StringUtil.isEmpty(value) ? null : value.trim());
+        TPaytypeConfig paytypeConfig = paytypeConfigDao.getByPaytypeAndAndConfigid(shopPaytype.getPaytype(), key);
+        if (null != paytypeConfig) {
+          spc.setConfigName(paytypeConfig.getConfigName());
+        }
+      }
+      shopPaytypeConfigDao.save(spc);
+    }
+    return true;
+  }
 
 }
diff --git a/src/main/resources/templates/system/param/businesspara.html b/src/main/resources/templates/system/param/businesspara.html
index 80ddac4..0caaab0 100644
--- a/src/main/resources/templates/system/param/businesspara.html
+++ b/src/main/resources/templates/system/param/businesspara.html
@@ -9,12 +9,12 @@
     <div class="layui-card-body">
         <div class="layui-form toolbar">
             搜索：
-            <input id="search-paraname" class="layui-input search-input" type="text" maxlength="40" style="width: 300px;"
+            <input id="search-business-paraname" class="layui-input search-input" type="text" maxlength="40" style="width: 300px;"
                    placeholder="输入参数名查询"/>&emsp;
-            <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            <button id="search-business-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
             </button>
-            <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon">&#xe654;</i>新 增</button>
-            <button id="btn-reset" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空</button>
+            <button id="search-business-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon">&#xe654;</i>新 增</button>
+            <button id="search-business-reset" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空</button>
         </div>
         <table class="layui-table" id="businessparaTable" lay-filter="businessparaTable-filter"></table>
     </div>
@@ -44,12 +44,12 @@
             ]
         });
         // 搜索按钮点击事件
-        $('#btn-search').click(function () {
-            var paraname = $("#search-paraname").val();
+        $('#search-business-search').click(function () {
+            var paraname = $("#search-business-paraname").val();
             table.reload('businessparaTable', {where: {paraname: paraname}, page: {curr: 1}});
         });
 
-        $('#btn-add').click(function () {
+        $('#search-business-add').click(function () {
             admin.popupCenter({
                 title: "新增业务参数",
                 area:["600px","300px"],
@@ -60,8 +60,8 @@
             });
         });
 
-        $('#btn-reset').click(function () {
-            $("#search-paraname").val("");
+        $('#search-business-reset').click(function () {
+            $("#search-business-paraname").val("");
         });
 
         //监听单元格
diff --git a/src/main/resources/templates/system/param/paytype.html b/src/main/resources/templates/system/param/paytype.html
index f7909f4..a235ff9 100644
--- a/src/main/resources/templates/system/param/paytype.html
+++ b/src/main/resources/templates/system/param/paytype.html
@@ -9,7 +9,7 @@
     <div class="layui-card-body">
         <div class="layui-form toolbar">
             搜索：
-            <input id="search-paytype" class="layui-input search-input" type="text" maxlength="40" style="width: 300px;"
+            <input id="search-global-paytype" class="layui-input search-input" type="text" maxlength="40" style="width: 300px;"
                    placeholder="输入支付方式查询"/>
             <button id="btn-search-param" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
             </button>
@@ -106,7 +106,7 @@
         });
         // 搜索按钮点击事件
         $('#btn-search-param').click(function () {
-            var paytype = $("#search-paytype").val();
+            var paytype = $("#search-global-paytype").val();
             table.reload('paytypeTable', {where: {paytype: paytype}, page: {curr: 1}});
         });
 
@@ -121,7 +121,7 @@
         });
 
         $('#btn-reset-param').click(function () {
-            $("#search-paytypeTable").val("");
+            $("#search-global-paytype").val("");
         });
 
         // 修改总状态
diff --git a/src/main/resources/templates/system/param/paytypeconfig.html b/src/main/resources/templates/system/param/paytypeconfig.html
index c087c94..5f81755 100644
--- a/src/main/resources/templates/system/param/paytypeconfig.html
+++ b/src/main/resources/templates/system/param/paytypeconfig.html
@@ -12,7 +12,7 @@
             <label class="layui-form-label" style="float: right;width: 100%;" th:text="${config.configid}">参数名</label>
         </div>
         <div class="layui-input-block" style="margin:0;display: inline;float: right;width: 80%;">
-            <input type="text" th:name="${config.configid}" class="layui-input" th:value="${config.configValue}"/>
+            <input type="text" th:name="${config.configid}" class="layui-input" th:value="${config.configValue}" autocomplete="off"/>
         </div>
     </div>
 
diff --git a/src/main/resources/templates/system/param/syspara.html b/src/main/resources/templates/system/param/syspara.html
index 79d94ec..56f7755 100644
--- a/src/main/resources/templates/system/param/syspara.html
+++ b/src/main/resources/templates/system/param/syspara.html
@@ -9,8 +9,8 @@
     <div class="layui-card-body">
         <div class="layui-form toolbar">
             搜索：
-            <input id="search-paraid" class="layui-input search-input" maxlength="9" type="text" placeholder="输入参数ID"/>&emsp;
-            <input id="search-paraname" class="layui-input search-input" type="text" maxlength="30" placeholder="输入参数名称"/>&emsp;
+            <input id="search-syspara-paraid" class="layui-input search-input" maxlength="9" type="text" placeholder="输入参数ID"/>&emsp;
+            <input id="search-syspara-paraname" class="layui-input search-input" type="text" maxlength="30" placeholder="输入参数名称"/>&emsp;
             <button id="btn-search-sysparam" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
             </button>
             <button id="btn-reset-sysparam" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空</button>
@@ -51,8 +51,8 @@
         });
         // 搜索按钮点击事件
         $('#btn-search-sysparam').click(function () {
-            var paraid = $("#search-paraid").val();
-            var paraname = $("#search-paraname").val();
+            var paraid = $("#search-syspara-paraid").val();
+            var paraname = $("#search-syspara-paraname").val();
             if (null != paraid && paraid.length > 0 && !(/^\d+$/.test(paraid))) {
                 layer.msg("参数ID请输入数字", {icon: 2});
             }else{
@@ -61,8 +61,8 @@
         });
 
         $('#btn-reset-sysparam').click(function () {
-            $("#search-paraid").val("");
-            $("#search-paraname").val("");
+            $("#search-syspara-paraid").val("");
+            $("#search-syspara-paraname").val("");
         });
 
 
diff --git a/src/main/resources/templates/system/shop/config.html b/src/main/resources/templates/system/shop/config.html
index 9765eb6..070295a 100644
--- a/src/main/resources/templates/system/shop/config.html
+++ b/src/main/resources/templates/system/shop/config.html
@@ -11,7 +11,7 @@
             <div class="layui-col-xs5 layui-col-md3">
                 <div class="layui-card">
                     <div class="layui-card-header">
-                        商户树<span style="font-size: 12px;">（双击末级商户查询）</span>
+                        商户树<span style="font-size: 12px;">（双击结算商户查询）</span>
                     </div>
                     <div class="layui-card-body layui-show"
                          style="background-color: #D7F9F7;max-height: 560px;overflow:auto;">
@@ -23,18 +23,18 @@
                 <div class="layui-card" style="min-height: 600px;">
                     <div class="layui-card-body">
                         <div class="layui-form toolbar">
-                            搜索：
+                            支付方式：
                             <select id="search-paytype">
                                 <option value=""> 全部</option>
                                 <option th:each="pt:${paytypelist}" th:value="${pt.paytype}"
                                         th:text="${pt.paydesc}"></option>
                             </select>&emsp;
-                            <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+                            <button id="btn-search-shoppaytype" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
                             </button>
-                            <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon">&#xe654;</i>新
+                            <button id="btn-add-shoppaytype" class="layui-btn icon-btn" data-type="add"><i class="layui-icon">&#xe654;</i>新
                                 增
                             </button>
-                            <button id="btn-reset" class="layui-btn layui-btn-primary" data-type="reset"><i
+                            <button id="btn-reset-shoppaytype" class="layui-btn layui-btn-primary" data-type="reset"><i
                                     class="layui-icon"></i>清 空
                             </button>
                         </div>
@@ -48,22 +48,22 @@
 
 <!-- 表格状态列 -->
 <script type="text/html" id="consumeenable-tpl-state">
-    <input type="checkbox" lay-filter="consumeenable-tpl-state" value="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
+    <input type="checkbox" lay-filter="consumeenable-tpl-state" value="{{d.shopaccno}}" def-paytype="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
            {{d.consumeEnable=='yes'?'checked':''}}/>
 </script>
 <script type="text/html" id="anonymousenable-tpl-state">
     {{# if(d.consumeEnable =='yes' ){ }}
-    <input type="checkbox" lay-filter="anonymousenable-tpl-state" value="{{d.paytype}}" lay-skin="switch"
+    <input type="checkbox" lay-filter="anonymousenable-tpl-state" value="{{d.shopaccno}}" def-paytype="{{d.paytype}}" lay-skin="switch"
            lay-text="启用|关闭"
            {{(d.consumeEnable=='yes' && d.anonymousEnable=='yes')?'checked':''}}/>
     {{# }else{ }}
-    <input type="checkbox" lay-filter="anonymousenable-tpl-state" value="{{d.paytype}}" lay-skin="switch"
+    <input type="checkbox" lay-filter="anonymousenable-tpl-state" value="{{d.shopaccno}}" def-paytype="{{d.paytype}}" lay-skin="switch"
            lay-text="启用|关闭"
            {{(d.consumeEnable=='yes' && d.anonymousEnable=='yes')?'checked':''}} disabled/>
     {{# } }}
 </script>
 <script type="text/html" id="reverseenable-tpl-state">
-    <input type="checkbox" lay-filter="reverseenable-tpl-state" value="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
+    <input type="checkbox" lay-filter="reverseenable-tpl-state" value="{{d.shopaccno}}" def-paytype="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
            {{d.reverseEnable=='yes'?'checked':''}}/>
 </script>
 
@@ -108,22 +108,22 @@
             layer.msg('查询商户树失败了，请稍后再试', {icon: 2});
         });
 
-        $('#btn-reset').click(function () {
+        $('#btn-reset-shoppaytype').click(function () {
             $("#search-paytype").val("");
             form.render('select');
         });
-        $('#btn-search').click(function(){
+        $('#btn-search-shoppaytype').click(function(){
             var ptype = $("#search-paytype").val();
-            table.reload('shopPaytypeTable', {where: {paytype: ptype, shopid:""}, page: {curr: 1}});
+            table.reload('shopPaytypeTable', {where: {paytype: ptype, shopaccno:""}, page: {curr: 1}});
         });
 
         function ondblclick(event, treeId, treeNode) {
-            if (treeNode.shoptype != 1) {
-                layer.msg("请选择末级商户", {icon: 2, time: 1000});
+            if (treeNode.shoptype != 1 || ""==treeNode.shopaccno) {
+                layer.msg("请选择结算商户查询", {icon: 2, time: 1000});
                 return;
             }
             var ptype = $("#search-paytype").val();
-            table.reload('shopPaytypeTable', {where: {paytype: ptype, shopid: treeNode.id}, page: {curr: 1}});
+            table.reload('shopPaytypeTable', {where: {paytype: ptype, shopaccno: treeNode.shopaccno}, page: {curr: 1}});
         }
 
         // 渲染表格
@@ -171,5 +171,115 @@
                 ]
             ]
         });
+
+        // 修改总状态
+        form.on('switch(consumeenable-tpl-state)', function (obj) {
+            var token = $("meta[name='_csrf_token']").attr("value");
+            admin.go('/shop/updatepaytypestat', {
+                shopaccno: obj.elem.value,
+                paytype: $(obj.elem).attr("def-paytype"),
+                optype: "consume",
+                state: obj.elem.checked ? 'yes' : 'no',
+                _csrf: token
+            }, function (data) {
+                if (data.code == 200) {
+                    layer.msg(data.msg, {icon: 1, time:1000});
+                    table.reload('shopPaytypeTable');
+                } else if (data.code == 401) {
+                    layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                        location.replace('/login');
+                    }, 1000);
+                    return;
+                } else {
+                    layer.msg(data.msg, {icon: 2});
+                    $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+                }
+            },function () {
+                layer.msg('请求失败了，请稍后再试', {icon: 2});
+                $(obj.elem).prop('checked', !obj.elem.checked);
+                form.render('checkbox');
+            });
+        });
+
+        form.on('switch(anonymousenable-tpl-state)', function (obj) {
+            var token = $("meta[name='_csrf_token']").attr("value");
+            updateShopPaytypeState(obj, "anonymous", token);
+        });
+
+        form.on('switch(reverseenable-tpl-state)', function (obj) {
+            var token = $("meta[name='_csrf_token']").attr("value");
+            updateShopPaytypeState(obj, "reverse", token);
+        });
+
+        function updateShopPaytypeState(obj, optype, token) {
+            admin.go('/shop/updatepaytypestat', {
+                shopaccno: obj.elem.value,
+                paytype: $(obj.elem).attr("def-paytype"),
+                state: obj.elem.checked ? 'yes' : 'no',
+                optype: optype,
+                _csrf: token
+            }, function (data) {
+                if (data.code == 200) {
+                    layer.msg(data.msg, {icon: 1, time: 1000});
+                } else if (data.code == 401) {
+                    layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                        location.replace('/login');
+                    }, 1000);
+                    return;
+                } else {
+                    layer.msg(data.msg, {icon: 2});
+                    $(obj.elem).prop('checked', !obj.elem.checked);
+                    form.render('checkbox');
+                }
+            }, function () {
+                layer.msg('请求失败了，请稍后再试', {icon: 2});
+                $(obj.elem).prop('checked', !obj.elem.checked);
+                form.render('checkbox');
+            });
+        }
+
+        $('#btn-add-shoppaytype').click(function () {
+            var ztree = $.fn.zTree.getZTreeObj("shopacctree");
+            var shopNodes = ztree.getSelectedNodes();
+            if (undefined == shopNodes || null == shopNodes || shopNodes.length < 1) {
+                layer.msg("请先选中左侧的一个结算商户", {icon: 2, time: 1000});
+                return;
+            }
+            var shopNode = shopNodes[0]; //选中商户
+            if(shopNode.shoptype!=1 || ""==shopNode.shopaccno){
+                layer.msg("请选择结算商户！", {icon: 2, time: 1000});
+                return;
+            }
+            admin.putTempData('t_addshoppaytype', {
+                shopaccno:shopNode.shopaccno,
+                shopname: shopNode.name.slice(shopNode.id.length+1)  //23_第一食堂，截取商户名称
+            });
+            admin.popupCenter({
+                title: "新增支付能力",
+                path: '/shop/load4addpaytype',
+                finish: function () {
+                    table.reload('shopPaytypeTable', {
+                        where: {paytype: "", shopaccno: shopNode.shopaccno},
+                        page: {curr: 1}
+                    });
+                }
+            });
+        });
+
+        //监听单元格
+        table.on('tool(shopPaytypeTable-filter)', function (obj) {
+            var data = obj.data;
+            if ('config' == obj.event) {
+                admin.popupCenter({
+                    title: "配置参数【" + data.shopname + "_" + data.paydesc + "】",
+                    path: '/shop/load4paytypepara?shopaccno=' + data.shopaccno + '&paytype=' + data.paytype,
+                    area: '800px',
+                    finish: function () {
+                        table.reload('shopPaytypeTable');
+                    }
+                });
+            }
+        });
     });
 </script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/shop/configform.html b/src/main/resources/templates/system/shop/configform.html
new file mode 100644
index 0000000..9f60ecf
--- /dev/null
+++ b/src/main/resources/templates/system/shop/configform.html
@@ -0,0 +1,101 @@
+<form id="shop-paytype-form" lay-filter="shop-paytype-form" class="layui-form model-form">
+    <div class="layui-form-item">
+        <label class="layui-form-label">商户账号</label>
+        <div class="layui-input-block">
+            <input name="shopaccno" class="layui-input" readonly="readonly" lay-verify="required"/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">商户名称</label>
+        <div class="layui-input-block">
+            <input name="shopname" class="layui-input" readonly="readonly"/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">支付方式</label>
+        <div class="layui-input-block">
+            <select name="paytype" lay-verify="required">
+                <option th:each="pt:${paytypelist}" th:value="${pt.paytype}"
+                        th:text="${pt.paydesc}"></option>
+            </select>&emsp;
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">能否消费</label>
+        <div class="layui-input-block">
+            <input name="consumeEnable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">匿名消费</label>
+        <div class="layui-input-block">
+            <input name="anonymousEnable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+        </div>
+    </div>
+
+    <div class="layui-form-item">
+        <label class="layui-form-label">能否冲正</label>
+        <div class="layui-input-block">
+            <input name="reverseEnable" type="checkbox" lay-skin="switch" lay-text="启用|关闭" value="yes" lay-verify="required" checked/>
+        </div>
+    </div>
+
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+        <button class="layui-btn" lay-filter="form-submit" lay-submit  id="submitbtn">保存</button>
+    </div>
+</form>
+
+
+<script>
+    layui.use(['layer', 'admin', 'form'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        form.render('checkbox');
+        form.render('select');
+        // 回显数据
+        var shop = admin.getTempData('t_addshoppaytype');
+        if (shop) {
+            form.val('shop-paytype-form', {
+                shopaccno: shop.shopaccno,
+                shopname: shop.shopname
+            });
+        }
+
+        // 表单提交事件
+        form.on('submit(form-submit)', function (data) {
+            layer.load(2);
+            var vdata = data.field;
+            vdata["_csrf"] = $("meta[name='_csrf_token']").attr("value");
+            $.ajax({
+                type : "POST",
+                dataType : "json",
+                url : '/shop/addshoppaytype',
+                data : vdata,
+                success : function(result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        admin.finishPopupCenter();
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        console.log('err:', result);
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error : function() {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/shop/configpara.html b/src/main/resources/templates/system/shop/configpara.html
new file mode 100644
index 0000000..231b6ae
--- /dev/null
+++ b/src/main/resources/templates/system/shop/configpara.html
@@ -0,0 +1,79 @@
+<form id="shop-paytype-config-form" lay-filter="shop-paytype-config-form" class="layui-form model-form">
+    <div class="layui-form-item" style="display: none;">
+        <input type="hidden" class="layui-input" id="hid_shopaccno" th:value="${shopaccno}"/>
+        <input type="hidden" class="layui-input" id="hid_paytype" th:value="${paytype}"/>
+    </div>
+
+    <div class="layui-form-item" style="text-align: center;" th:if="${configlist.size()} le 0">
+        无配置项
+    </div>
+
+    <div class="layui-form-item" th:if="${configlist.size()} gt 0" th:each="config:${configlist}">
+        <div class="layui-input-block" style="margin:0;display: inline;float: left;width: 20%;">
+            <label class="layui-form-label" style="float: right;width: 100%;" th:text="${config.configid}">参数名</label>
+        </div>
+        <div class="layui-input-block" style="margin:0;display: inline;float: right;width: 80%;">
+            <input type="text" th:name="${config.configid}" class="layui-input" th:value="${config.configValue}" autocomplete="off"/>
+        </div>
+    </div>
+
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+        <button class="layui-btn" lay-filter="form-submit" lay-submit  id="submitbtn">保存</button>
+    </div>
+</form>
+
+
+<script>
+    layui.use(['layer', 'admin', 'form'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        // 表单提交事件
+        form.on('submit(form-submit)', function (data) {
+            layer.load(2);
+            var vdata = data.field;
+            if(JSON.stringify(vdata)=="{}"){
+                layer.closeAll('loading');
+                admin.closePopupCenter();
+                return; //无配置项，直接关闭
+            }
+            var token = $("meta[name='_csrf_token']").attr("value");
+            vdata["hid_paytype"] = $("#hid_paytype").val();
+            vdata["hid_shopaccno"] = $("#hid_shopaccno").val();
+            console.log('addShopPaytype:', vdata);
+            debugger
+            $.ajax({
+                type : "POST",
+                dataType : "json",
+                url : '/shop/addpaytypepara',
+                headers: {
+                    'Accept': 'application/json',
+                    'Content-Type': 'application/json',
+                    'X-CSRF-TOKEN':token,
+                },
+                data : JSON.stringify(vdata),
+                success : function(result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        admin.finishPopupCenter();
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        console.log('err:' + result.code);
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error : function() {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
