支付能力配置临时提交
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeDao.java
index f782db4..0b0b998 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeDao.java
@@ -1,6 +1,8 @@
 package com.supwisdom.dlpay.api.dao;
 
 import com.supwisdom.dlpay.api.domain.TPaytype;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
@@ -10,4 +12,6 @@
 @Repository
 public interface PaytypeDao extends JpaRepository<TPaytype, String> {
   TPaytype getByPaytype(String paytype);
+
+  Page<TPaytype> findByPaytypeContaining(String paytype, Pageable pageable);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java b/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java
index aa195a7..694e7a9 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java
@@ -33,7 +33,10 @@
   private Double befbal;
 
   @Column(name = "AMOUNT", precision = 9, scale = 2)
-  private Double amount;
+  private Double amount; //实际付款金额
+
+  @Column(name = "TOTAL_AMOUNT", precision = 9, scale = 2)
+  private Double totalAmount; //订单总金额
 
   @Column(name = "AFTBAL", precision = 9, scale = 2)
   private Double aftbal;
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 50ab6a2..0313df1 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.system.controller;
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.api.domain.TPaytype;
 import com.supwisdom.dlpay.framework.domain.TApiClient;
 import com.supwisdom.dlpay.framework.domain.TBusinesspara;
 import com.supwisdom.dlpay.framework.domain.TSyspara;
@@ -346,5 +347,30 @@
     }
   }
 
+  /**
+   * ====================================================
+   *            支付能力配置
+   * ====================================================
+   */
+  @GetMapping("/param/paytype")
+  public String paytypeView() {
+    return "system/param/paytype";
+  }
+
+  @GetMapping("/param/paytypelist")
+  @PreAuthorize("hasPermission('/param/paytype','')")
+  @ResponseBody
+  public PageResult<TPaytype> getPaytypeDataList(@RequestParam("page") Integer pageNo,
+                                                 @RequestParam("limit") Integer pageSize,
+                                                 @RequestParam(value = "paytype", required = false) String paytype) {
+    try {
+      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+      return paramService.getPaytypePage(paytype, pageNo, pageSize);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
+    }
+  }
 
 }
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 3097754..aa5f7ea 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay.system.service;
 
+import com.supwisdom.dlpay.api.domain.TPaytype;
 import com.supwisdom.dlpay.framework.domain.TApiClient;
 import com.supwisdom.dlpay.framework.domain.TBusinesspara;
 import com.supwisdom.dlpay.framework.domain.TSyspara;
@@ -42,4 +43,7 @@
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   boolean deleteApiClient(TApiClient apiClient);
 
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  PageResult<TPaytype> getPaytypePage(String paytype, int pageNo, int pageSize);
+
 }
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 8d63932..5ed8ca9 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
@@ -1,5 +1,7 @@
 package com.supwisdom.dlpay.system.service.impl;
 
+import com.supwisdom.dlpay.api.dao.PaytypeDao;
+import com.supwisdom.dlpay.api.domain.TPaytype;
 import com.supwisdom.dlpay.framework.dao.ApiClientDao;
 import com.supwisdom.dlpay.framework.dao.BusinessparaDao;
 import com.supwisdom.dlpay.framework.dao.SysparaDao;
@@ -34,6 +36,8 @@
   private BusinessparaDao businessparaDao;
   @Autowired
   private ApiClientDao apiClientDao;
+  @Autowired
+  private PaytypeDao paytypeDao;
 
   @Override
   public PageResult<TSyspara> getSysparaPage(Integer paraid, String paraname, int pageNo, int pageSize) {
@@ -139,4 +143,13 @@
     return false;
   }
 
+  @Override
+  public PageResult<TPaytype> getPaytypePage(String paytype, int pageNo, int pageSize) {
+    Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("paytype"));
+    if (!StringUtil.isEmpty(paytype)) {
+      return new PageResult<>(paytypeDao.findByPaytypeContaining(paytype.trim(), pageable));
+    }
+    return new PageResult<>(paytypeDao.findAll(pageable));
+  }
+
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt b/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
index 2cb6caa..32ced96 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt
@@ -6,7 +6,6 @@
 class PersonTranactionBuilder(val parent: TransactionBuilder) {
     var userid: String = ""
     var userName: String = ""
-    var payCode: String = ""
     var amount: Double = 0.0
     var summary: String = ""
     var oppositeAccno: String = ""
@@ -27,8 +26,6 @@
     var oppositeName: String = ""
     var oppositeType: String = ""
 
-
-    var payCode: String = ""
     fun and(): TransactionBuilder {
         return parent
     }
@@ -53,8 +50,11 @@
 
     var transDate: String = ""
     var transTime: String = ""
-    var payCode: String = ""
+    var transCode: Int = 0 //交易码,各明细流水统一
     var refno: String = ""
+    var outtradeno:String="" //第三方流水号
+    val extendMap = mutableMapOf<String, String>() //存调第三方需要的参数信息,存数据库 TB_USERDTL_BUSINESS
+    val resultMap = mutableMapOf<String, String>() //存调第三方结果数据
 
     fun person(): PersonTranactionBuilder {
         return PersonTranactionBuilder(this).also {
@@ -92,7 +92,7 @@
             val builder = TransactionBuilder().apply {
                 this.transDate = transDate
                 this.transTime = transTime
-                this.payCode = "3001"
+                this.transCode = 3001
             }.person().apply {
                 this.userid = userid // 可以再优化,直接用 person 对象
                 this.userName = person.accname
@@ -104,7 +104,6 @@
                 this.amount = amount / 100.0 // 金额考虑减和加
                 this.summary = "POS消费"
             }.and()
-
             if (manageFee > 0) {
                 builder.subject().apply {
                     val subject = accountUtilServcie.readSubject("2001")
diff --git a/src/main/resources/templates/system/param/paytype.html b/src/main/resources/templates/system/param/paytype.html
new file mode 100644
index 0000000..8f9883a
--- /dev/null
+++ b/src/main/resources/templates/system/param/paytype.html
@@ -0,0 +1,191 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">支付能力配置</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">参数管理</a>
+          <a><cite>支付能力配置</cite></a>
+        </span>
+    </div>
+    <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;"
+                   placeholder="输入支付方式查询"/>
+            <button id="btn-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>
+        </div>
+        <table class="layui-table" id="paytypeTable" lay-filter="paytypeTable-filter"></table>
+    </div>
+</div>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="paytype-table-bar">
+    {{# if(d.paytype == 'balance') { }}
+        <span></span>
+    {{# }else{ }}
+        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+    {{# } }}
+</script>
+
+<!-- 表格状态列 -->
+<script type="text/html" id="enable-tpl-state">
+    <input type="checkbox" lay-filter="enable-tpl-state" value="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
+           {{d.enable=='yes'?'checked':''}} />
+</script>
+<script type="text/html" id="chargeenable-tpl-state">
+    <input type="checkbox" lay-filter="chargeenable-tpl-state" value="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
+           {{(d.enable=='yes' && d.chargeEnable=='yes')?'checked':''}} />
+</script>
+<script type="text/html" id="consumeenable-tpl-state">
+    <input type="checkbox" lay-filter="consumeenable-tpl-state" value="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
+           {{(d.enable=='yes' && d.consumeEnable=='yes')?'checked':''}} />
+</script>
+<script type="text/html" id="anonymousenable-tpl-state">
+    <input type="checkbox" lay-filter="anonymousenable-tpl-state" value="{{d.paytype}}" lay-skin="switch" lay-text="启用|关闭"
+           {{(d.enable=='yes' && d.anonymousEnable=='yes')?'checked':''}} />
+</script>
+
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var admin = layui.admin;
+        // 渲染表格
+        table.render({
+            elem: '#paytypeTable',
+            url: '/param/paytypelist',
+            page: true,
+            cols: [
+                [
+                    {field: 'paytype', title: '支付方式', width: 200, align: 'center', fixed: 'left', sort: true},
+                    {field: 'paydesc', title: '名称', align: 'center', sort: true},
+                    {field: 'enable', title: '状态', align: 'center', templet: '#enable-tpl-state',sort: true},
+                    {field: 'chargeEnable', title: '能否充值', align: 'center', templet: '#chargeenable-tpl-state',sort: true},
+                    {field: 'consumeEnable', title: '能否消费', align: 'center', templet: '#consumeenable-tpl-state',sort: true},
+                    {field: 'anonymousEnable', title: '匿名消费', align: 'center', templet: '#anonymousenable-tpl-state',sort: true},
+                    {align: 'center', title: '操作', width: 100, fixed: 'right', templet: function(item){
+                        if(item.paytype!='balance') {
+                           return '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
+                        }else{
+                            return '';
+                        }
+                    }}
+                ]
+            ]
+        });
+        // 搜索按钮点击事件
+        $('#btn-search').click(function () {
+            var paytype = $("#search-paytype").val();
+            table.reload('paytypeTable', {where: {paytype: paytype}, page: {curr: 1}});
+        });
+
+        $('#btn-add').click(function () {
+            showEditModel();
+        });
+
+        $('#btn-reset').click(function () {
+            $("#search-paytypeTable").val("");
+        });
+
+        // function showEditModel(data) {
+        //     var title = data ? '修改角色' : '新增应用';
+        //     admin.putTempData('t_appclient', data);
+        //     admin.popupCenter({
+        //         title: title,
+        //         path: '/param/load4addapiclient',
+        //         finish: function () {
+        //             table.reload('apiClientTable');
+        //         }
+        //     });
+        // }
+        //
+        // // 修改user状态
+        // form.on('switch(api-tpl-state)', function (obj) {
+        //     var token = $("meta[name='_csrf_token']").attr("value");
+        //     admin.go('/param/updateapiclientstate', {
+        //         appid: obj.elem.value,
+        //         state: obj.elem.checked ? 'normal' : 'closed',
+        //         _csrf: token
+        //     }, function (data) {
+        //         if (data.code == 200) {
+        //             layer.msg(data.msg, {icon: 1});
+        //         } 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');
+        //     });
+        // });
+        //
+        // //监听单元格
+        // table.on('tool(apiClientTable-filter)', function (obj) {
+        //     var data = obj.data;
+        //     if('del' == obj.event){
+        //         if(confirm("确定要删除应用参数["+data.appid+"]吗?")){
+        //             layer.load(2);
+        //             admin.go('/param/deleteapiclient', {
+        //                 appid: data.appid,
+        //                 _csrf: $("meta[name='_csrf_token']").attr("value")
+        //             }, function (data) {
+        //                 console.log(data.code);
+        //                 layer.closeAll('loading');
+        //                 if (data.code == 200) {
+        //                     layer.msg(data.msg, {icon: 1});
+        //                 } 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});
+        //                 }
+        //                 table.reload('apiClientTable');
+        //             }, function (ret) {
+        //                 console.log(ret);
+        //                 layer.closeAll('loading');
+        //                 layer.msg('请求失败了,请稍后再试', {icon: 2});
+        //             });
+        //         }
+        //     }else if('editRole' ==obj.event){
+        //         showEditModel(data);
+        //     }
+        // });
+        //
+        // table.on('edit(apiClientTable-filter)', function (obj) {
+        //     var row = obj.data; //得到所在行所有键值
+        //     var newval = obj.value; //得到修改后的值
+        //     admin.go('/param/updateapiclientpara', {
+        //         appid: row.appid,
+        //         secret: newval,
+        //         _csrf: $("meta[name='_csrf_token']").attr("value"),
+        //     }, function (data) {
+        //         if (data.code == 200) {
+        //             layer.msg("修改成功", {icon: 1});
+        //         } 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});
+        //             table.reload('apiClientTable');
+        //         }
+        //     },function () {
+        //         layer.msg('修改失败了,请稍后再试', {icon: 2});
+        //         table.reload('apiClientTable');
+        //     });
+        // })
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/role/func.html b/src/main/resources/templates/system/role/func.html
index d838bb5..61cc1b1 100755
--- a/src/main/resources/templates/system/role/func.html
+++ b/src/main/resources/templates/system/role/func.html
@@ -1,5 +1,5 @@
 <div style="padding: 0 20px">

-    <div class="layui-form-item">

+    <div class="layui-form-item" style="max-height: 490px;overflow: auto;">

         <ul id="funclist" class="ztree"></ul>

     </div>

     <div class="layui-form-item model-form-footer">

diff --git a/src/main/resources/templates/system/role/index.html b/src/main/resources/templates/system/role/index.html
index 93c755d..5dcd1f7 100644
--- a/src/main/resources/templates/system/role/index.html
+++ b/src/main/resources/templates/system/role/index.html
@@ -72,6 +72,7 @@
             admin.putTempData('roleId', data.roleId);
             admin.popupCenter({
                 title: title,
+                area:['400px','600px'],
                 path: '/role/loadfunc'
             });
         };