• layui 表格 展开


     一、表格嵌套表格(手风琴打开)

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>设备上下线统计title>
    6. <script type="text/javascript" src="../../../language/language.js">script>
    7. <script type="text/javascript" src="../../proto/protobuf.min.js">script>
    8. <script type="text/javascript" src="../../component/js/common.js">script>
    9. <script type="text/javascript" src="../../component/js/commonNew.js">script>
    10. <script type="text/javascript" src="../../layui/layui.js?r=3.0">script>
    11. <link type="text/css" rel="stylesheet" href="../../layui/css/layui_base.css"/>
    12. <script type="text/javascript" src="../../component/js/jquery-2.1.0.min.js">script>
    13. <script src="../../component/js/xlsx.js">script>
    14. <script src="../../component/xlsx/dom.js">script>
    15. <script src="../../component/xlsx/xlsx.core.min.js">script>
    16. <script type="text/javascript" src="./error.js?r=1.3.3">script>
    17. head>
    18. <body>
    19. <form class="layui-form">
    20. <div id="none">
    21. <table class="layui-table" lay-filter="tabView" id="tabView">table>
    22. div>
    23. form>
    24. body>
    25. <script>
    26. var userPerson = getUser();
    27. var httpUser = { userName: userPerson.name, userGuid: userPerson.sessionId };
    28. let IPS;
    29. let str = document.domain;
    30. if (document.domain == 'localhost' || document.domain == "192.168.100.50") {
    31. IPS = 'https://xxc.chinamdvr.com:7050/v1/api/web/mgmt/deviceSetup/setupTicket/statistic';
    32. } else {
    33. IPS = 'https://www.chinamdvr.com:9201/v1/api/web/mgmt/deviceSetup/setupTicket/statistic';
    34. }
    35. let $, element, form, laydate, layer, tableView, util;
    36. let listData = [], listDataDetail = [], radioIndex = 0, objData = {}, dataDetail = {};
    37. let colsList = [
    38. { field: 'id', title: '', width: 50, //给需要展开的列添加状态event,添加模板
    39. event:'collapse',
    40. templet: function(res) {
    41. return '
      '
    42. +'
      '
  • }
  • },
  • { field: 'region', title: "网点所在区", align: 'center' },
  • { field: 'required', title: "安装总数", align: 'center' },
  • { field: 'installed', title: "已安装总数", align: 'center' },
  • { field: 'checked', title: "已验收数量", align: 'center' },
  • { field: 'installNo', title: "未验收数量", align: 'center' },
  • { field: 'process', title: "安装进度", align: 'center', templet: schedule },
  • ];
  • layui.use(['element', 'form', 'laydate', 'layer', "util"], function(){
  • form = layui.form, laydate = layui.laydate, layer = layui.layer;
  • util = layui.util
  • element = layui.element;
  • $ = layui.$;
  • tableRender();
  • interfaceParam();
  • });
  • /** 进度条 */
  • function schedule(d) {
  • //设置页面进度条
  • return '
    ' +
  • '
    'layui-bg-green' + '" lay-percent="' + d.process + '">' +
  • '
    '
  • }
  • function tableRender () {
  • layui.use('table', function () {
  • tableView = layui.table;
  • // 渲染第一个表格
  • tableView.render({
  • elem: '#tabView',
  • data: listData,
  • height: '700',
  • toolbar: '#toolbarDemo',
  • defaultToolbar: [{
  • title: languageTL.historyMap.exportXls,
  • layEvent: 'export',
  • icon: 'layui-icon-export'
  • }],
  • cellMinWidth: 80,
  • cols: [colsList],
  • page: true, //是否显示分页
  • limits: [10, 20, 50, 100],
  • page: {
  • count: listData.length,
  • prev:languageTL.common. previousStr,
  • next: languageTL.common.nextStr,
  • layout: ['prev', 'page', 'next', 'count', 'limit']
  • },
  • done: function (res, curr, count) {
  • element.render();
  • // element.progress('rate', '75%');
  • }
  • });
  • //头工具栏事件 统计信息导出
  • tableView.on('toolbar(tabView)', function (obj) {
  • switch (obj.event) {
  • //自定义头工具栏右侧图标 - 提示
  • case 'export':
  • if (listData.length == 0) {
  • layer.msg(languageTL.deviceVideo.loss[3]);
  • return;
  • }
  • let tHeader = [], filterVal = [];
  • colsList.map((item, index) => {
  • tHeader.push(item.title);
  • filterVal.push(item.field);
  • });
  • // 导出的数据
  • const data = PlExportExcel.formatJson(filterVal, listData);
  • // 导出表格
  • PlExportExcel.exportJsonToExcel({
  • header: tHeader,
  • data: data,
  • filename: "Install",
  • autoWidth: true,
  • bookType: 'xlsx'
  • });
  • break;
  • };
  • });
  • tableView.on('tool(tabView)',function(obj){
  • //获取单行数据
  • var data=obj.data;
  • //判断状态
  • if(obj.event==='collapse'){
  • var trObj = layui.$(this).parent('tr'); //当前行
  • var accordion = true //开启手风琴,那么在进行折叠操作时,始终只会展现当前展开的表格。
  • var content = '
    '
    //内容
  • //折叠方法
  • collapseTable({
  • elem: trObj,
  • accordion: accordion,
  • content: content,
  • success:function(trObjChildren, index){
  • //给当前table添加id和lay-filter
  • trObjChildren.find('table').attr("id", index);
  • trObjChildren.find('table').attr("lay-filter", index);
  • //渲染table
  • tableView.render({
  • elem: "#" + index,
  • data: [{region: 1111, required: 2222, installed: 3333, checked: 4444, installNo: 5555, process: "76%"}],
  • limit: 3,
  • // id:index,//用于表格重载
  • cellMinWidth: 80,
  • cols: [[
  • { field: 'region', title: "网点所在区", align: 'center' },
  • { field: 'required', title: "安装总数", align: 'center' },
  • { field: 'installed', title: "已安装总数", align: 'center' },
  • { field: 'checked', title: "已验收数量", align: 'center' },
  • { field: 'installNo', title: "未验收数量", align: 'center' },
  • { field: 'process', title: "安装进度", align: 'center', templet: schedule },
  • ]],
  • done: function (res, curr, count) {
  • element.render();
  • $('th').hide()
  • }
  • });
  • //重新加载element
  • element.init();
  • //监听当前table的头部工具栏点击事件
  • tableView.on('toolbar('+index+')',function(obj){
  • var checkStatus = tableView.checkStatus(obj.config.id);
  • var data=checkStatus.data;
  • console.log(data);
  • switch(obj.event){
  • case'selecttime':
  • }
  • })
  • }
  • })
  • }
  • });
  • });
  • }
  • function collapseTable(options) {
  • var trObj = options.elem;
  • if (!trObj) return;
  • var accordion = options.accordion,
  • success = options.success,
  • content = options.content || '';
  • var tableView = trObj.parents('.layui-table-view'); //当前表格视图
  • var id = tableView.attr('lay-id'); //当前表格标识
  • var index = trObj.data('index'); //当前行索引
  • var leftTr = tableView.find('.layui-table-fixed.layui-table-fixed-l tr[data-index="' + index + '"]'); //左侧当前固定行
  • var rightTr = tableView.find('.layui-table-fixed.layui-table-fixed-r tr[data-index="' + index + '"]'); //右侧当前固定行
  • var colspan = trObj.find('td').length; //获取合并长度
  • var trObjChildren = trObj.next(); //展开行Dom
  • var indexChildren = id + '-' + index + '-children'; //展开行索引
  • var leftTrChildren = tableView.find('.layui-table-fixed.layui-table-fixed-l tr[data-index="' + indexChildren +
  • '"]'); //左侧展开固定行
  • var rightTrChildren = tableView.find('.layui-table-fixed.layui-table-fixed-r tr[data-index="' + indexChildren +
  • '"]'); //右侧展开固定行
  • var lw = leftTr.width() + 15; //左宽
  • var rw = rightTr.width() + 15; //右宽
  • //不存在就创建展开行
  • if (trObjChildren.data('index') != indexChildren) {
  • //装载HTML元素
  • var tr = ''">
    '">
    'px;padding-right:' + rw + 'px" class="layui-table-cell">' +
  • content + '
    ';
  • trObjChildren = trObj.after(tr).next().hide(); //隐藏展开行
  • var fixTr = ''">'; //固定行
  • leftTrChildren = leftTr.after(fixTr).next().hide(); //左固定
  • rightTrChildren = rightTr.after(fixTr).next().hide(); //右固定
  • }
  • //展开|折叠箭头图标
  • trObj.find('td[lay-event="collapse"] i.layui-colla-icon').toggleClass("layui-icon-right layui-icon-down");
  • //显示|隐藏展开行
  • trObjChildren.toggle();
  • //开启手风琴折叠和折叠箭头
  • if (accordion) {
  • trObj.siblings().find('td[lay-event="collapse"] i.layui-colla-icon').removeClass("layui-icon-down").addClass(
  • "layui-icon-right");
  • trObjChildren.siblings('[data-index$="-children"]').hide(); //展开
  • rightTrChildren.siblings('[data-index$="-children"]').hide(); //左固定
  • leftTrChildren.siblings('[data-index$="-children"]').hide(); //右固定
  • }
  • success(trObjChildren, indexChildren); //回调函数
  • heightChildren = trObjChildren.height(); //展开高度固定
  • rightTrChildren.height(heightChildren + 115).toggle(); //左固定
  • leftTrChildren.height(heightChildren + 115).toggle(); //右固定
  • }
  • // 调用接口
  • function interfaceParam() {
  • let url = IPS + "/progress";
  • let timerTimeOut, loadingTimeOut;
  • layui.use('layer', function () {
  • layer = layui.layer;
  • loadingTimeOut = layer.load(2, { shade: false });
  • timerTimeOut = setTimeout(function () {
  • layer.open({
  • title: languageTL.common.promptTitle,
  • content: languageTL.count.btns2[5],
  • btn: [languageTL.confirm]
  • });
  • layer.close(loadingTimeOut);
  • }, 1000 * 10);
  • });
  • proPostNew(url, "FtpManage.EpibolyTicketProgressReq", "FtpManage.EpibolyTicketProgressResp", { userInfo: httpUser }, function (code, result) {
  • clearTimeout(timerTimeOut); // 关闭定时器
  • layer.close(loadingTimeOut);
  • if (code == 200) {
  • console.log(result)
  • result.epibolyTicketProgressList.map(item => {
  • item.installNo = item.installed - item.checked;
  • item.process = percentNum(item.installed , item.required);
  • })
  • listData = result.epibolyTicketProgressList;
  • tableRender();
  • } else {
  • layer.msg(errLayer(result.code));
  • }
  • }, 'ftpManage', 'FtpManage.Error');
  • }
  • //小数点后两位百分比
  • function percentNum(num,num2) {
  • return (Math.round(num / num2 * 10000) / 100.00 + "%");
  • }
  • script>
  • html>
  •  二、树结构展开(数据写死的)

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>设备上下线统计title>
    6. <script type="text/javascript" src="../../../language/language.js">script>
    7. <script type="text/javascript" src="../../proto/protobuf.min.js">script>
    8. <script type="text/javascript" src="../../component/js/common.js">script>
    9. <script type="text/javascript" src="../../component/js/commonNew.js">script>
    10. <script type="text/javascript" src="../../layui/layui.js?r=3.0">script>
    11. <link type="text/css" rel="stylesheet" href="../../layui/css/layui_base.css"/>
    12. <script type="text/javascript" src="../../component/js/jquery-2.1.0.min.js">script>
    13. <script src="../../component/js/xlsx.js">script>
    14. <script src="../../component/xlsx/dom.js">script>
    15. <script src="../../component/xlsx/xlsx.core.min.js">script>
    16. <script type="text/javascript" src="./error.js?r=1.3.3">script>
    17. head>
    18. <body>
    19. <form class="layui-form">
    20. <div id="none">
    21. <table class="layui-table" lay-filter="tabView" id="tabView">table>
    22. div>
    23. form>
    24. body>
    25. <script>
    26. var userPerson = getUser();
    27. var httpUser = { userName: userPerson.name, userGuid: userPerson.sessionId };
    28. let IPS;
    29. let str = document.domain;
    30. if (document.domain == 'localhost' || document.domain == "192.168.100.50") {
    31. IPS = 'https://xxc.chinamdvr.com:7050/v1/api/web/mgmt/deviceSetup/setupTicket/statistic';
    32. } else {
    33. IPS = 'https://www.chinamdvr.com:9201/v1/api/web/mgmt/deviceSetup/setupTicket/statistic';
    34. }
    35. let $, element, form, laydate, layer, tableView, util, treeTable;
    36. let listData = [
    37. {
    38. "region": "系统管理",
    39. "required": 1,
    40. "installed": 2,
    41. "checked": 3,
    42. "installNo": 4,
    43. "process": "60%",
    44. "parentId": -1,
    45. id: 1,
    46. "open": true
    47. },
    48. {
    49. "region": "用户管理",
    50. "required": 11,
    51. "installed": 22,
    52. "checked": 33,
    53. "installNo": 44,
    54. "process": "61%",
    55. "parentId": 1,
    56. id: 2,
    57. "open": true
    58. },
    59. {
    60. "region": "查询用户",
    61. "required": 111,
    62. "installed": 222,
    63. "checked": 333,
    64. "installNo": 444,
    65. "process": "63%",
    66. "parentId": 2,
    67. id: 3,
    68. "open": true
    69. },
    70. {
    71. "region": "添加用户",
    72. "required": 1111,
    73. "installed": 2222,
    74. "checked": 3333,
    75. "installNo": 4444,
    76. "process": "64%",
    77. "parentId": 2,
    78. id: 4,
    79. "open": true
    80. },
    81. {
    82. "region": "修改用户",
    83. "required": 11111,
    84. "installed": 22222,
    85. "checked": 33333,
    86. "installNo": 44444,
    87. "parentId": 2,
    88. "process": "67%",
    89. "parentId": 2,
    90. id: 5,
    91. "open": true
    92. },
    93. {
    94. "region": "删除用户",
    95. "required": 111111,
    96. "installed": 222222,
    97. "checked": 333333,
    98. "installNo": 444444,
    99. "process": "69%",
    100. "parentId": 2,
    101. id: 6,
    102. "open": true
    103. }];
    104. layui.config({
    105. base: './'
    106. }).use(['element', 'form', 'laydate', 'layer', "util", "treeTable"], function(){
    107. form = layui.form, laydate = layui.laydate, layer = layui.layer;
    108. util = layui.util;
    109. element = layui.element;
    110. $ = layui.$;
    111. treeTable = layui.treeTable;
    112. // 渲染
    113. var inst = treeTable.render({
    114. elem: '#tabView',
    115. data: listData,
    116. tree: {
    117. iconIndex: 0,
    118. isPidData: true,
    119. idName: 'id', // 父ID
    120. pidName: 'parentId', // 子ID
    121. // openName: 'open',// 是否默认展开的字段名
    122. },
    123. maxHeight: '501px',
    124. cols: [[
    125. { field: 'region', title: "网点所在区", align: 'center' },
    126. { field: 'required', title: "安装总数", align: 'center' },
    127. { field: 'installed', title: "已安装总数", align: 'center' },
    128. { field: 'checked', title: "已验收数量", align: 'center' },
    129. { field: 'installNo', title: "未验收数量", align: 'center' },
    130. { field: 'process', title: "安装进度", align: 'center', templet: schedule },
    131. ]],
    132. toolbar: true,
    133. defaultToolbar: ['exports'],
    134. page: true,
    135. done: function (res, curr, count) {
    136. element.render();
    137. // element.progress('rate', '75%');
    138. }
    139. });
    140. interfaceParam();
    141. });
    142. /** 进度条 */
    143. function schedule(d) {
    144. //设置页面进度条
    145. return '
      ' +
    146. '
      'layui-bg-green' + '" lay-percent="' + d.process + '">' +
    147. '
      '
    148. }
    149. // 调用接口
    150. function interfaceParam() {
    151. let url = IPS + "/progress";
    152. let timerTimeOut, loadingTimeOut;
    153. layui.use('layer', function () {
    154. layer = layui.layer;
    155. loadingTimeOut = layer.load(2, { shade: false });
    156. timerTimeOut = setTimeout(function () {
    157. layer.open({
    158. title: languageTL.common.promptTitle,
    159. content: languageTL.count.btns2[5],
    160. btn: [languageTL.confirm]
    161. });
    162. layer.close(loadingTimeOut);
    163. }, 1000 * 10);
    164. });
    165. proPostNew(url, "FtpManage.EpibolyTicketProgressReq", "FtpManage.EpibolyTicketProgressResp", { userInfo: httpUser }, function (code, result) {
    166. clearTimeout(timerTimeOut); // 关闭定时器
    167. layer.close(loadingTimeOut);
    168. if (code == 200) {
    169. console.log(result)
    170. result.epibolyTicketProgressList.map(item => {
    171. item.installNo = item.installed - item.checked;
    172. item.process = percentNum(item.installed , item.required);
    173. })
    174. listData = result.epibolyTicketProgressList;
    175. } else {
    176. layer.msg(errLayer(result.code));
    177. }
    178. }, 'ftpManage', 'FtpManage.Error');
    179. }
    180. //小数点后两位百分比
    181. function percentNum(num,num2) {
    182. return (Math.round(num / num2 * 10000) / 100.00 + "%");
    183. }
    184. script>
    185. html>

     有一个需要引入的文件:treeTable.js

    1. /** 树形表格3.x Created by wangfan on 2020-05-12 https://gitee.com/whvse/treetable-lay */
    2. layui.define(["laytpl","form","util"],function(s){var g=layui.jquery;var d=layui.laytpl;var c=layui.form;var b=layui.util;var o=layui.device();var h="treeTable";var k={};var e={elem:undefined,cols:undefined,url:undefined,method:undefined,where:undefined,contentType:undefined,headers:undefined,parseData:undefined,request:{pidName:"pid"},toolbar:undefined,defaultToolbar:undefined,width:undefined,height:undefined,cellMinWidth:90,done:undefined,data:undefined,title:undefined,skin:undefined,even:undefined,size:undefined,text:{none:"无数据"},reqData:undefined,useAdmin:false,tree:{idName:"id",pidName:"pid",childName:"children",haveChildName:"haveChild",openName:"open",iconIndex:0,arrowType:undefined,onlyIconControl:undefined,getIcon:function(u){var t=u[this.haveChildName];if(t!==undefined){t=t===true||t==="true"}else{if(u[this.childName]){t=u[this.childName].length>0}}if(t){return''}else{return''}}}};var r={field:undefined,title:undefined,width:undefined,minWidth:undefined,type:"normal",fixed:undefined,hide:undefined,unresize:undefined,style:undefined,align:undefined,colspan:undefined,rowspan:undefined,templet:undefined,toolbar:undefined,"class":undefined,singleLine:undefined};var p=function(t){k[t.elem.substring(1)]=this;this.reload(t)};p.prototype.initOptions=function(t){var D=this;function B(J){if(!J.INIT_OK){J=g.extend({INIT_OK:true},r,J)}if(J.type==="space"){if(!J.width){J.width=15}J.minWidth=J.width}else{if(J.type==="numbers"){if(!J.width){J.width=40}J.minWidth=J.width;if(!J.singleLine){J.singleLine=false}if(!J.unresize){J.unresize=true}if(!J.align){J.align="center"}}else{if(J.type==="checkbox"||J.type==="radio"){if(!J.width){J.width=48}J.minWidth=J.width;if(!J.singleLine){J.singleLine=false}if(!J.unresize){J.unresize=true}if(!J.align){J.align="center"}}}}if(J.toolbar){J.type="tool"}return J}if("Array"!==l(t.cols[0])){t.cols=[t.cols]}for(var w=0;wcols.length;w++){for(var u=0;ucols[w].length;u++){t.cols[w][u].INIT_OK=undefined;t.cols[w][u].key=undefined;t.cols[w][u].colGroup=undefined;t.cols[w][u].HAS_PARENT=undefined;t.cols[w][u].parentKey=undefined;t.cols[w][u].PARENT_COL_INDEX=undefined}}var F=[],G=0;for(var y=0;ycols.length;y++){var C=t.cols[y];for(var x=0;xlength;x++){var A=C[x];if(!A){C.splice(x,1);continue}A=B(A);A.key=y+"-"+x;var I=undefined;if(A.colGroup||A.colspan>1){A.colGroup=true;A.type="group";I=[];G++;var z=0;for(var v=0;vcols[y+1].length;v++){var H=g.extend({INIT_OK:true},r,t.cols[y+1][v]);if(H.HAS_PARENT||(z>1&&z==A.colspan)){t.cols[y+1][v]=H;continue}H.HAS_PARENT=true;H.parentKey=y+"-"+x;H.key=(y+1)+"-"+v;H.PARENT_COL_INDEX=G;H=B(H);I.push(H);z=z+parseInt(H.colspan>1?H.colspan:1);t.cols[y+1][v]=H}}A.CHILD_COLS=I;if(!A.PARENT_COL_INDEX){F.push(A)}t.cols[y][x]=A}}this.options=g.extend(true,{},e,t);this.options.colArrays=F;if(this.options.url){this.options.reqData=function(J,K){if(!D.options.where){D.options.where={}}if(J){D.options.where[D.options.request.pidName]=J[D.options.tree.idName]}(D.options.useAdmin?layui.admin:g).ajax({url:D.options.url,data:D.options.contentType&&D.options.contentType.indexOf("application/json")===0?JSON.stringify(D.options.where):D.options.where,headers:D.options.headers,type:D.options.method,dataType:"json",contentType:D.options.contentType,success:function(L){if(D.options.parseData){L=D.options.parseData(L)}if(L.code==0){K(L.data)}else{K(L.msg||"加载失败")}},error:function(L){K(L.status+" - "+L.statusText)}})}}else{if(this.options.data&&this.options.data.length>0&&this.options.tree.isPidData){this.options.data=a.pidToChildren(this.options.data,this.options.tree.idName,this.options.tree.pidName,this.options.tree.childName)}}if("default"===this.options.toolbar){this.options.toolbar=["
      ",'
      ',' ',"
      "
      ,'
      ',' ',"
      "
      ,'
      ',' ',"
      "
      ,"
      "
      ].join("")}if(this.options.defaultToolbar===undefined){this.options.defaultToolbar=["filter","exports","print"]}if(typeof this.options.tree.getIcon==="string"){var E=this.options.tree.getIcon;this.options.tree.getIcon=function(K){if(E!=="ew-tree-icon-style2"){return E}var J=K[this.haveChildName];if(J!==undefined){J=J===true||J==="true"}else{if(K[this.childName]){J=K[this.childName].length>0}}if(J){return''}else{return''}}}};p.prototype.init=function(){var E=this.options;var u=g(E.elem);var B=E.elem.substring(1);u.removeAttr("lay-filter");if(u.next(".ew-tree-table").length===0){u.css("display","none");u.after(['
      '" style="',E.style||"",'">',' ','
      ','
      '
      ,"
      "
      ,'
      ','
      '
      ,'
      ',' ',"
      "
      ,'
      ',E.text.none||"","
      "
      ,"
      "
      ,"
      "
      ].join(""))}var A=this.getComponents();if(E.skin){A.$table.attr("lay-skin",E.skin)}if(E.size){A.$table.attr("lay-size",E.size)}if(E.even){A.$table.attr("lay-even",E.even)}A.$toolbar.empty();if(E.toolbar===false||E.toolbar===undefined){A.$toolbar.hide()}else{A.$toolbar.show();if(typeof E.toolbar==="string"){d(g(E.toolbar).html()).render({},function(F){A.$toolbar.html('
      '+F+"
      "
      )})}var C=['
      '];for(var y=0;ydefaultToolbar.length;y++){var w;if("filter"===E.defaultToolbar[y]){w={title:"筛选",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"}}else{if("exports"===E.defaultToolbar[y]){w={title:"导出",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"}}else{if("print"===E.defaultToolbar[y]){w={title:"打印",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}}else{w=E.defaultToolbar[y]}}}if(w){C.push('
      );C.push(' title="'+w.title+'"');C.push(' lay-event="'+w.layEvent+'">');C.push('icon+'">
      '
      )}}A.$toolbar.append(C.join("")+"
      "
      )}if(E.width){A.$view.css("width",E.width);A.$tHeadGroup.css("width",E.width);A.$tBodyGroup.css("width",E.width)}var v=this.resize(true);var D=""+this.renderBodyTh()+"";A.$tBodyGroup.children("style").remove();if(E.height){A.$tHead.html(v+D);A.$tBody.html(v+"");if(E.height.indexOf("full-")===0){var z=parseFloat(E.height.substring(5))+A.$toolbar.outerHeight()+A.$tHeadGroup.outerHeight()+1;A.$tBodyGroup.append(['"].join(""));A.$tBodyGroup.data("full",z);A.$tBodyGroup.css("height","")}else{A.$tBodyGroup.css("height",E.height);A.$tBodyGroup.data("full","")}A.$tHeadGroup.show()}else{A.$tHeadGroup.hide();var x={lg:50,sm:30,md:38};A.$tBodyGroup.append(['"].join(""));A.$tBody.html(v+D+"")}c.render("checkbox",B);function t(H){var F=H.data("parent"),G;if(!F){return}var I=A.$table.children("thead").children("tr").children('[data-key="'+F+'"]');var J=I.attr("colspan")-1;I.attr("colspan",J);if(J===0){I.addClass("layui-hide")}t(I)}A.$table.children("thead").children("tr").children("th.layui-hide").each(function(){t(g(this))});if(E.reqData){this.options.data=undefined;this.renderBodyAsync()}else{if(E.data&&E.data.length>0){this.renderBodyData(E.data)}else{A.$loading.hide();A.$empty.show()}}};p.prototype.bindEvents=function(){var v=this;var t=this.options;var u=this.getComponents();var w=u.$table.children("tbody");var x=function(y){var z=g(this);if(!z.is("tr")){var C=z.parent("tr");if(C.length>0){z=C}else{z=z.parentsUntil("tr").last().parent()}}var A=v.getDataByTr(z);var B={tr:z,data:A,del:function(){var F=z.data("index");var D=parseInt(z.data("indent"));z.nextAll("tr").each(function(){if(parseInt(g(this).data("indent"))<=D){return false}g(this).remove()});var G=(typeof F==="number"?1:F.split("-").length);z.nextAll("tr").each(function(){var H=g(this);if(parseInt(H.data("indent"))return false}var I=H.data("index").toString().split("-");I[G-1]=parseInt(I[G-1])-1;H.data("index",I.join("-"))});var E=z.prevAll("tr");v.del(undefined,F);z.remove();v.renderNumberCol();E.each(function(){var H=parseInt(g(this).data("indent"));if(H>=D){return true}v.checkParentCB(g(this));D=H});v.checkChooseAllCB();if(t.data.length===0){u.$empty.show()}f(u.$view)},update:function(E){A=g.extend(true,A,E);var D=parseInt(z.data("indent"));v.renderBodyTr(A,D,undefined,z);c.render(null,u.filter);v.renderNumberCol();z.prevAll("tr").each(function(){var F=parseInt(g(this).data("indent"));if(F>=D){return true}v.checkParentCB(g(this));D=F});v.checkChooseAllCB()}};return g.extend(B,y)};w.off("click.fold").on("click.fold",".ew-tree-pack",function(C){layui.stope(C);var A=g(this).parentsUntil("tr").last().parent();if(A.hasClass("ew-tree-table-loading")){return}var y=A.data("have-child");if(y!==true&&y!=="true"){return}var z=A.hasClass("ew-tree-table-open");var B=v.getDataByTr(A);if(!z&&!B[t.tree.childName]){v.renderBodyAsync(B,A)}else{B[t.tree.openName]=i(A)}});w.off("click.tool").on("click.tool","*[lay-event]",function(z){layui.stope(z);var y=g(this);layui.event.call(this,h,"tool("+u.filter+")",x.call(this,{event:y.attr("lay-event")}))});c.on("radio("+u.radioFilter+")",function(y){var z=v.getDataByTr(g(y.elem).parentsUntil("tr").last().parent());v.removeAllChecked();z.LAY_CHECKED=true;z.LAY_INDETERMINATE=false;layui.event.call(this,h,"checkbox("+u.filter+")",{checked:true,data:z,type:"one"})});c.on("checkbox("+u.checkboxFilter+")",function(C){var B=C.elem.checked;var E=g(C.elem);var z=E.next(".layui-form-checkbox");if(!B&&E.hasClass("ew-form-indeterminate")){B=true;E.prop("checked",B);z.addClass("layui-form-checked");E.removeClass("ew-form-indeterminate")}var A=E.parentsUntil("tr").last().parent();var D=v.getDataByTr(A);D.LAY_CHECKED=B;D.LAY_INDETERMINATE=false;if(D[t.tree.childName]&&D[t.tree.childName].length>0){v.checkSubCB(A,B)}var y=parseInt(A.data("indent"));A.prevAll("tr").each(function(){var F=parseInt(g(this).data("indent"));if(FcheckParentCB(g(this));y=F}});v.checkChooseAllCB();layui.event.call(this,h,"checkbox("+u.filter+")",{checked:B,data:D,type:"more"})});c.on("checkbox("+u.chooseAllFilter+")",function(A){var z=A.elem.checked;var B=g(A.elem);var y=B.next(".layui-form-checkbox");if(!t.data||t.data.length===0){B.prop("checked",false);y.removeClass("layui-form-checked");B.removeClass("ew-form-indeterminate");return}if(!z&&B.hasClass("ew-form-indeterminate")){z=true;B.prop("checked",z);y.addClass("layui-form-checked");B.removeClass("ew-form-indeterminate")}layui.event.call(this,h,"checkbox("+u.filter+")",{checked:z,type:"all"});v.checkSubCB(u.$tBody.children("tbody"),z)});w.off("click.row").on("click.row","tr",function(){layui.event.call(this,h,"row("+u.filter+")",x.call(this,{}))});w.off("dblclick.rowDouble").on("dblclick.rowDouble","tr",function(){layui.event.call(this,h,"rowDouble("+u.filter+")",x.call(this,{}))});w.off("click.cell").on("click.cell","td",function(C){var y=g(this);var E=y.data("type");if(E==="checkbox"||E==="radio"){return layui.stope(C)}var H=y.data("edit");var G=y.data("field");if(H){layui.stope(C);if(w.find(".ew-tree-table-edit").length>0){return}var B=y.data("index");var z=y.find(".ew-tree-table-indent").length;var D=v.getDataByTr(y.parent());if("text"===H||"number"===H){var F=g(''" class="layui-input ew-tree-table-edit"/>');F[0].value=D[G];y.append(F);F.focus();F.blur(function(){var K=g(this).val();if(K==D[G]){return g(this).remove()}var I=layui.event.call(this,h,"edit("+u.filter+")",x.call(this,{value:K,field:G}));if(I===false){g(this).addClass("layui-form-danger");g(this).focus()}else{D[G]=K;var J=y.data("key").split("-");v.renderBodyTd(D,z,B,y,t.cols[J[0]][J[1]])}})}else{console.error("不支持的单元格编辑类型:"+H)}}else{var A=layui.event.call(this,h,"cell("+u.filter+")",x.call(this,{td:y,field:G}));if(A===false){layui.stope(C)}}});w.off("dblclick.cellDouble").on("dblclick.cellDouble","td",function(C){var D=g(this);var z=D.data("type");if(z==="checkbox"||z==="radio"){return layui.stope(C)}var A=D.data("edit");var B=D.data("field");if(A){return layui.stope(C)}var y=layui.event.call(this,h,"cellDouble("+u.filter+")",x.call(this,{td:D,field:B}));if(y===false){layui.stope(C)}});u.$toolbar.off("click.toolbar").on("click.toolbar","*[lay-event]",function(A){layui.stope(A);var z=g(this);var y=z.attr("lay-event");if("LAYTABLE_COLS"===y){v.toggleCol()}else{if("LAYTABLE_EXPORT"===y){v.exportData("show")}else{if("LAYTABLE_PRINT"===y){v.printTable()}else{layui.event.call(this,h,"toolbar("+u.filter+")",{event:y,elem:z})}}}});u.$tBodyGroup.on("scroll",function(){var y=g(this);u.$tHeadGroup.scrollLeft(y.scrollLeft())});u.$toolbar.off("click.export").on("click.export",".layui-table-tool-panel>[data-type]",function(){var y=g(this).data("type");if("csv"===y||"xls"===y){v.exportData(y)}});u.$toolbar.off("click.panel").on("click.panel",".layui-table-tool-panel",function(y){layui.stope(y)});c.on("checkbox("+u.colsToggleFilter+")",function(y){v.toggleCol(y.elem.checked,undefined,y.value)})};p.prototype.getComponents=function(){var v=g(this.options.elem).next(".ew-tree-table");var t=v.attr("lay-filter");var w=v.children(".ew-tree-table-head");var u=v.children(".ew-tree-table-box");return{$view:v,filter:t,$tHeadGroup:w,$tBodyGroup:u,$tHead:w.children(".layui-table"),$tBody:u.children(".layui-table"),$table:v.find(".layui-table"),$toolbar:v.children(".ew-tree-table-tool"),$empty:u.children(".ew-tree-table-empty"),$loading:u.children(".ew-tree-table-loading"),checkboxFilter:"ew_tb_checkbox_"+t,radioFilter:"ew_tb_radio_"+t,chooseAllFilter:"ew_tb_choose_all_"+t,colsToggleFilter:"ew_tb_toggle_cols"+t}};p.prototype.eachCols=function(w,v){if(!v){v=this.options.colArrays}for(var t=0;tlength;t++){var u=v[t];w&&w(t,u);if(u.CHILD_COLS){this.eachCols(w,u.CHILD_COLS)}}};p.prototype.eachData=function(w,v){if(!v){v=this.options.data}for(var t=0;tlength;t++){var u=v[t];w&&w(t,u);if(u[this.options.tree.childName]){this.eachData(w,u[this.options.tree.childName])}}};p.prototype.renderBodyAsync=function(x,w){var v=this;var t=this.options;var u=this.getComponents();if(w){w.addClass("ew-tree-table-loading");w.find(".ew-tree-pack").children(".ew-tree-table-arrow").addClass("layui-anim layui-anim-rotate layui-anim-loop")}else{u.$empty.hide();if(t.data&&t.data.length>0){u.$loading.addClass("ew-loading-float")}u.$loading.show()}t.reqData(x,function(y){if(typeof y!=="string"&&y&&y.length>0&&t.tree.isPidData){y=a.pidToChildren(y,t.tree.idName,t.tree.pidName,t.tree.childName)}v.renderBodyData(y,x,w)})};p.prototype.renderBodyData=function(w,A,x){var u;if(typeof w==="string"){u=w;w=[]}var z=this;var C=this.options;var y=this.getComponents();if(A===undefined){C.data=w}else{A[C.tree.childName]=w}var v;if(x){v=parseInt(x.data("indent"))+1;A[C.tree.openName]=true}var t=this.renderBody(w,v,A);if(x){x.nextAll("tr").each(function(){if(parseInt(g(this).data("indent"))<=(v-1)){return false}g(this).remove()});x.after(t).addClass("ew-tree-table-open")}else{y.$tBody.children("tbody").html(t)}c.render(null,y.filter);this.renderNumberCol();if(x){this.checkParentCB(x);x.prevAll("tr").each(function(){var D=parseInt(g(this).data("indent"));if(D<(v-1)){z.checkParentCB(g(this));v=D+1}});x.removeClass("ew-tree-table-loading");var B=x.find(".ew-tree-pack").children(".ew-tree-table-arrow");B.removeClass("layui-anim layui-anim-rotate layui-anim-loop");if(u){x.removeClass("ew-tree-table-open")}else{if(w&&w.length===0){A[C.tree.haveChildName]=false;x.data("have-child",false);B.addClass("ew-tree-table-arrow-hide");B.next(".ew-tree-icon").after(C.tree.getIcon(A)).remove()}}}else{y.$loading.hide();y.$loading.removeClass("ew-loading-float");if(w&&w.length>0){y.$empty.hide()}else{y.$empty.show();if(u){y.$empty.text(u)}else{y.$empty.html(C.text.none)}}}this.checkChooseAllCB();f(y.$view);C.done&&C.done(w)};p.prototype.renderBody=function(z,t,y){var u=this.options;if(!t){t=0}var x="";if(!z||z.length===0){return x}var w=y?!y[u.tree.openName]:undefined;for(var v=0;vlength;v++){var A=z[v];A.LAY_INDEX=(y?y.LAY_INDEX+"-":"")+v;x+=this.renderBodyTr(A,t,w);x+=this.renderBody(A[u.tree.childName],t+1,A)}return x};p.prototype.renderBodyTr=function(B,u,x,w){var z=this;var C=this.options;if(!u){u=0}var A=B[C.tree.haveChildName];if(A===undefined){A=B[C.tree.childName]&&B[C.tree.childName].length>0}if(w){w.data("have-child",A?"true":"false");w.data("indent",u);w.removeClass("ew-tree-table-loading")}var v=";var t="";if(A&&B[C.tree.openName]){t+="ew-tree-table-open"}if(x){t+="ew-tree-tb-hide"}v+=(' class="'+t+'"');if(A){v+=(' data-have-child="'+A+'"')}v+=(' data-index="'+B.LAY_INDEX+'"');v+=(' data-indent="'+u+'">');var y=0;this.eachCols(function(E,D){if(D.colGroup){return}v+=z.renderBodyTd(B,u,y,w?w.children("td").eq(y):undefined,D);y++});v+="";return v};p.prototype.renderBodyTd=function(C,v,A,t,u){if(u.colGroup){return""}var F=this.options;var y=this.getComponents();if(!v){v=0}var B="",E="",D="";if(u.type==="numbers"){B=''}else{if(u.type==="checkbox"){B=[',C.LAY_CHECKED?' checked="checked"':"",' lay-filter="',y.checkboxFilter,'"',' lay-skin="primary" class="ew-tree-table-checkbox',C.LAY_INDETERMINATE?" ew-form-indeterminate":"",'" />'].join("")}else{if(u.type==="radio"){B=[',C.LAY_CHECKED?' checked="checked"':"",' lay-filter="',y.radioFilter,'"',' name="',y.radioFilter,'"',' class="ew-tree-table-radio" />'].join("")}else{if(u.templet){if(typeof u.templet==="function"){B=u.templet(C)}else{if(typeof u.templet==="string"){d(g(u.templet).html()).render(C,function(G){B=G})}}}else{if(u.toolbar){if(typeof u.toolbar==="function"){B=u.toolbar(C)}else{if(typeof u.toolbar==="string"){d(g(u.toolbar).html()).render(C,function(G){B=G})}}}else{if(u.field&&C[u.field]!==undefined&&C[u.field]!==null){B=b.escape(C[u.field]===0?"0":C[u.field])}}}}}}if(A===F.tree.iconIndex){for(var w=0;w''}D+='';var z=C[F.tree.haveChildName];if(z===undefined){z=C[F.tree.childName]&&C[F.tree.childName].length>0}D+=('"":" ew-tree-table-arrow-hide"));D+=(" "+(F.tree.arrowType||"")+'">');D+=F.tree.getIcon(C);B=""+B+"";if(F.tree.onlyIconControl){B=D+""+B}else{B=D+B+""}}E=['
      singleLine===undefined||u.singleLine?" single-line":"",'"',u.align?' align="'+u.align+'"':"",">",'
      ',B,"
      "
      ,' ',' ',"
      "
      ].join("");if(t){t.html(E)}var x=";if(u.field){x+=(' data-field="'+u.field+'"')}if(u.edit){x+=(' data-edit="'+u.edit+'"')}if(u.type){x+=(' data-type="'+u.type+'"')}if(u.key){x+=(' data-key="'+u.key+'"')}if(u.style){x+=(' style="'+u.style+'"')}if(u["class"]){x+=(' class="'+u["class"]+(u.hide?" layui-hide":"")+'"')}else{if(u.hide){x+=(' class="layui-hide"')}}x+=(">"+E+"");return x};p.prototype.renderBodyTh=function(){var t=this.options;var v=this.getComponents();var u=[];g.each(t.cols,function(x,w){u.push("");g.each(w,function(A,z){u.push(");if(z.colspan){u.push(' colspan="'+z.colspan+'"')}if(z.rowspan){u.push(' rowspan="'+z.rowspan+'"')}if(z.type){u.push(' data-type="'+z.type+'"')}if(z.key){u.push(' data-key="'+z.key+'"')}if(z.parentKey){u.push(' data-parent="'+z.parentKey+'"')}if(z.hide){u.push(' class="layui-hide"')}u.push(">");u.push('
      singleLine===undefined||z.singleLine?" single-line":"")+'"');if(z.thAlign||z.align){u.push(' align="'+(z.thAlign||z.align)+'"')}u.push(">");u.push('
      ');var y='chooseAllFilter+'" lay-skin="primary" class="ew-tree-table-checkbox"/>';if(z.type==="checkbox"){u.push(y)}else{u.push(z.title||"")}u.push('
      '
      );u.push('
      '
      );if(!z.colGroup&&!z.unresize){u.push('')}u.push("")});u.push("")});return u.join("")};p.prototype.resize=function(z){var t=this.options;var x=this.getComponents();var v=1,u=1,A=true,w=0;this.eachCols(function(B,C){if(C.colGroup||C.hide){return}if(C.width){u+=(C.width+1);if(C.minWidth){if(C.widthminWidth
      ){C.width=C.minWidth}}else{if(C.widthcellMinWidth
      ){C.width=t.cellMinWidth}}}else{A=false}if(C.width){v+=(C.width+1)}else{if(C.minWidth){v+=(C.minWidth+1);w+=C.minWidth}else{v+=(t.cellMinWidth+1);w+=t.cellMinWidth}}});if(v){x.$tHead.css("min-width",v);x.$tBody.css("min-width",v)}else{x.$tHead.css("min-width","auto");x.$tBody.css("min-width","auto")}if(A){x.$tHead.css("width",u);x.$tBody.css("width",u)}else{x.$tHead.css("width","100%");x.$tBody.css("width","100%")}var y=[];this.eachCols(function(B,C){if(C.colGroup||C.hide){return}y.push(");if(C.width){y.push(' width="'+C.width+'"')}else{if(C.minWidth){y.push(' width="'+(C.minWidth/w*100).toFixed(2)+'%"')}else{y.push(' width="'+(t.cellMinWidth/w*100).toFixed(2)+'%"')}}if(C.type){y.push(' data-type="'+C.type+'"')}if(C.key){y.push(' data-key="'+C.key+'"')}y.push("/>")});y=y.join("");if(z){return""+y+""}x.$table.children("colgroup").html(y)};p.prototype.getDataByTr=function(v){var w,t;if(typeof v!=="string"&&typeof v!=="number"){if(v){t=v.data("index")}}else{t=v}if(t===undefined){return}if(typeof t==="number"){t=[t]}else{t=t.split("-")}for(var u=0;ulength;u++){if(w){w=w[this.options.tree.childName][t[u]]}else{w=this.options.data[t[u]]}}return w};p.prototype.checkSubCB=function(y,x){var w=this;var v=this.getComponents();var t=-1,u;if(y.is("tbody")){u=y.children("tr")}else{t=parseInt(y.data("indent"));u=y.nextAll("tr")}u.each(function(){if(parseInt(g(this).data("indent"))<=t){return false}var A=g(this).children("td").find('input[lay-filter="'+v.checkboxFilter+'"]');A.prop("checked",x);A.removeClass("ew-form-indeterminate");if(x){A.next(".layui-form-checkbox").addClass("layui-form-checked")}else{A.next(".layui-form-checkbox").removeClass("layui-form-checked")}var z=w.getDataByTr(g(this));z.LAY_CHECKED=x;z.LAY_INDETERMINATE=false})};p.prototype.checkParentCB=function(x){var u=this.options;var w=this.getComponents();var z=this.getDataByTr(x);var y=0,v=0;if(z[u.tree.childName]){function t(C){for(var B=0;Blength;B++){if(C[B].LAY_CHECKED){y++}else{v++}if(C[B][u.tree.childName]){t(C[B][u.tree.childName])}}}t(z[u.tree.childName])}var A=x.children("td").find('input[lay-filter="'+w.checkboxFilter+'"]');if(y>0&&v===0){A.prop("checked",true);A.removeClass("ew-form-indeterminate");A.next(".layui-form-checkbox").addClass("layui-form-checked");z.LAY_CHECKED=true;z.LAY_INDETERMINATE=false}else{if(y===0&&v>0){A.prop("checked",false);A.removeClass("ew-form-indeterminate");A.next(".layui-form-checkbox").removeClass("layui-form-checked");z.LAY_CHECKED=false;z.LAY_INDETERMINATE=false}else{if(y>0&&v>0){A.prop("checked",true);A.data("indeterminate","true");A.addClass("ew-form-indeterminate");A.next(".layui-form-checkbox").addClass("layui-form-checked");z.LAY_CHECKED=true;z.LAY_INDETERMINATE=true}}}};p.prototype.checkChooseAllCB=function(){var u=this.options;var w=this.getComponents();var x=0,v=0;function t(A){for(var z=0;zlength;z++){if(A[z].LAY_CHECKED){x++}else{v++}if(A[z][u.tree.childName]){t(A[z][u.tree.childName])}}}t(u.data);var y=w.$view.find('input[lay-filter="'+w.chooseAllFilter+'"]');if(x>0&&v===0){y.prop("checked",true);y.removeClass("ew-form-indeterminate");y.next(".layui-form-checkbox").addClass("layui-form-checked")}else{if((x===0&&v>0)||(x===0&&v===0)){y.prop("checked",false);y.removeClass("ew-form-indeterminate");y.next(".layui-form-checkbox").removeClass("layui-form-checked")}else{if(x>0&&v>0){y.prop("checked",true);y.addClass("ew-form-indeterminate");y.next(".layui-form-checkbox").addClass("layui-form-checked")}}}};p.prototype.renderNumberCol=function(){this.getComponents().$tBody.children("tbody").children("tr").each(function(t){g(this).children("td").find(".ew-tree-table-numbers").text(t+1)})};p.prototype.getIndexById=function(v){var t=this.options;function u(x,y){for(var w=0;wlength;w++){if(x[w][t.tree.idName]==v){return y!==undefined?y+"-"+w:w}if(x[w][t.tree.childName]){return u(x[w][t.tree.childName],y!==undefined?y+"-"+w:w)}}}return u(t.data)};p.prototype.expand=function(x,u){var w=this.getComponents();var v=w.$table.children("tbody").children('tr[data-index="'+this.getIndexById(x)+'"]');if(!v.hasClass("ew-tree-table-open")){v.children("td").find(".ew-tree-pack").trigger("click")}if(u===false){return}var t=parseInt(v.data("indent"));v.prevAll("tr").each(function(){var y=parseInt(g(this).data("indent"));if(yif(!g(this).hasClass("ew-tree-table-open")){g(this).children("td").find(".ew-tree-pack").trigger("click")}t=y}})};p.prototype.fold=function(v){var u=this.getComponents();var t=u.$table.children("tbody").children('tr[data-index="'+this.getIndexById(v)+'"]');if(t.hasClass("ew-tree-table-open")){t.children("td").find(".ew-tree-pack").trigger("click")}};p.prototype.expandAll=function(){this.getComponents().$table.children("tbody").children("tr").each(function(){if(!g(this).hasClass("ew-tree-table-open")){g(this).children("td").find(".ew-tree-pack").trigger("click")}})};p.prototype.foldAll=function(){this.getComponents().$table.children("tbody").children("tr").each(function(){if(g(this).hasClass("ew-tree-table-open")){g(this).children("td").find(".ew-tree-pack").trigger("click")}})};p.prototype.getData=function(){return this.options.data};p.prototype.reload=function(t){this.initOptions(this.options?g.extend(true,this.options,t):t);this.init();this.bindEvents()};p.prototype.checkStatus=function(t){if(t===undefined){t=true}var u=[];this.eachData(function(v,w){if((t||!w.LAY_INDETERMINATE)&&w.LAY_CHECKED){u.push(g.extend({isIndeterminate:w.LAY_INDETERMINATE},w))}});return u};p.prototype.setChecked=function(u){var w=this;var v=this.getComponents();var t=v.$table.find('input[lay-filter="'+v.radioFilter+'"]');if(t.length>0){t.each(function(){var x=w.getDataByTr(g(this).parentsUntil("tr").parent());if(x&&u[u.length-1]==x[w.options.tree.idName]){g(this).next(".layui-form-radio").trigger("click");return false}})}else{v.$table.find('input[lay-filter="'+v.checkboxFilter+'"]').each(function(){var C=g(this);var y=C.next(".layui-form-checkbox");var z=C.prop("checked");var B=C.hasClass("ew-form-indeterminate");var A=w.getDataByTr(C.parentsUntil("tr").parent());for(var x=0;xlength;x++){if(A&&u[x]==A[w.options.tree.idName]){if(A[w.options.tree.childName]&&A[w.options.tree.childName].length>0){continue}if(!z||B){y.trigger("click")}}}})}};p.prototype.removeAllChecked=function(){this.checkSubCB(this.getComponents().$table.children("tbody"),false)};p.prototype.exportData=function(w){var y=this.getComponents();if("show"===w){y.$toolbar.find(".layui-table-tool-panel").remove();y.$toolbar.find('[lay-event="LAYTABLE_EXPORT"]').append(['
        ','
      • 导出到 Csv 文件
      • '
        ,'
      • 导出到 Excel 文件
      • '
        ,"
      "
      ].join(""))}else{if(o.ie){return layer.msg("不支持ie导出")}if(!w){w="xls"}var u=[],t=[];this.eachCols(function(A,B){if(B.type!=="normal"||B.hide){return}u.push(B.title||"")});y.$tBody.children("tbody").children("tr").each(function(){var A=[];g(this).children("td").each(function(){var B=g(this);if(B.data("type")!=="normal"||B.hasClass("layui-hide")){return true}A.push(B.text().trim().replace(/,/g,","))});t.push(A.join(","))});var v=document.createElement("a");var x=encodeURIComponent(u.join(",")+"\r\n"+t.join("\r\n"));var z=({csv:"text/csv",xls:"application/vnd.ms-excel"})[w];v.href="data:"+z+";charset=utf-8,\ufeff"+x;v.download=(this.options.title||"table")+"."+w;document.body.appendChild(v);v.click();document.body.removeChild(v)}};p.prototype.printTable=function(){var w=this.getComponents();var z=w.$tHead.children("thead").html();if(!z){z=w.$tBody.children("thead").html()}var x=w.$tBody.children("tbody").html();var v=w.$tBody.children("colgroup").html();var u=g([''," ",v,""," ",z,""," ",x,"","
      "
      ].join(""));u.find('col[data-type="checkbox"],col[data-type="radio"],col[data-type="tool"]').remove();u.find('td[data-type="checkbox"],td[data-type="radio"],td[data-type="tool"],.layui-hide').remove();function A(F){var C=F.data("parent"),D;if(!C){return}var E=u.children("thead").children("tr").children('[data-key="'+C+'"]');var G=parseInt(E.attr("colspan"))-1;E.attr("colspan",G);if(G===0){E.remove()}A(E)}u.find('th[data-type="checkbox"],th[data-type="radio"],th[data-type="tool"]').each(function(){A(g(this))}).remove();var t=[""].join("");var y=window.open("","_blank");y.focus();var B=y.document;B.open();B.write(u[0].outerHTML+t);B.close();y.print();y.close()};p.prototype.toggleCol=function(A,z,B){var w=this.getComponents();if(A===undefined){w.$toolbar.find(".layui-table-tool-panel").remove();var x=['
        '];this.eachCols(function(D,E){if(E.type!=="normal"){return}x.push('
      • );x.push(' lay-filter="'+w.colsToggleFilter+'"');x.push(' value="'+E.key+'" title="'+b.escape(E.title||"")+'"');x.push((E.hide?"":" checked")+">
      • "
        )});w.$toolbar.find('[lay-event="LAYTABLE_COLS"]').append(x.join("")+"
      "
      );c.render("checkbox",w.filter)}else{if(B){var u=w.$table.children("tbody").children("tr").children('[data-key="'+B+'"]');var C=w.$table.children("thead").children("tr").children('[data-key="'+B+'"]');if(A){u.removeClass("layui-hide");C.removeClass("layui-hide")}else{u.addClass("layui-hide");C.addClass("layui-hide")}var y=B.split("-");var v=this.options.cols[y[0]][y[1]];v.hide=!A;function t(G){var D=G.data("parent"),E;if(!D){return}var F=w.$table.children("thead").children("tr").children('[data-key="'+D+'"]');var H=F.attr("colspan");A?H++:H--;F.attr("colspan",H);if(H===0){F.addClass("layui-hide")}else{F.removeClass("layui-hide")}t(F)}t(C);this.eachCols(function(D,E){if(E.key===B){E.hide=v.hide}});this.resize()}}};p.prototype.filterData=function(y){var A=this.getComponents();A.$loading.show();if(this.options.data.length>0){A.$loading.addClass("ew-loading-float")}var x=A.$table.children("tbody").children("tr");var u=[];if(typeof y==="string"){x.each(function(){var B=g(this).data("index");g(this).children("td").each(function(){if(g(this).text().indexOf(y)!==-1){u.push(B);return false}})})}else{for(var w=0;wlength;w++){u.push(this.getIndexById(y[w]))}}x.addClass("ew-tree-table-filter-hide");for(var v=0;vlength;v++){var z=x.filter('[data-index="'+u[v]+'"]');z.removeClass("ew-tree-table-filter-hide");var t=parseInt(z.data("indent"));z.nextAll("tr").each(function(){if(parseInt(g(this).data("indent"))<=t){return false}g(this).removeClass("ew-tree-table-filter-hide")});if(z.hasClass("ew-tree-table-open")){i(z)}z.prevAll("tr").each(function(){var B=parseInt(g(this).data("indent"));if(Bg(this).removeClass("ew-tree-table-filter-hide");if(!g(this).hasClass("ew-tree-table-open")){i(g(this))}t=B}})}A.$loading.hide();A.$loading.removeClass("ew-loading-float");if(u.length===0){A.$empty.show()}f(A.$view)};p.prototype.clearFilter=function(){var t=this.getComponents();t.$table.children("tbody").children("tr").removeClass("ew-tree-table-filter-hide");if(this.options.data.length>0){t.$empty.hide()}f(t.$view)};p.prototype.refresh=function(x,v){if(l(x)==="Array"){v=x;x=undefined}var u=this.getComponents();var w,t;if(x!==undefined){t=u.$table.children("tbody").children('tr[data-index="'+this.getIndexById(x)+'"]');w=this.getDataByTr(t)}if(v){if(this.data.length>0){u.$loading.addClass("ew-loading-float")}u.$loading.show();if(v.length>0&&this.options.tree.isPidData){this.renderBodyData(a.pidToChildren(v,this.options.tree.idName,this.options.tree.pidName,this.options.tree.childName),w,t)}else{this.renderBodyData(v,w,t)}}else{this.renderBodyAsync(w,t)}};p.prototype.del=function(x,u){if(u===undefined){u=this.getIndexById(x)}var t=(typeof u==="number"?[u]:u.split("-"));var w=this.options.data;if(t.length>1){for(var v=0;vlength-1;v++){w=w[parseInt(t[v])][this.options.tree.childName]}}w.splice(t[t.length-1],1)};p.prototype.update=function(u,t){g.extend(true,this.getDataByTr(this.getIndexById(u)),t)};function i(v){var t=parseInt(v.data("indent"));var u=v.hasClass("ew-tree-table-open");if(u){v.removeClass("ew-tree-table-open");v.nextAll("tr").each(function(){if(parseInt(g(this).data("indent"))<=t){return false}g(this).addClass("ew-tree-tb-hide")})}else{v.addClass("ew-tree-table-open");var w;v.nextAll("tr").each(function(){var x=parseInt(g(this).data("indent"));if(x<=t){return false}if(w!==undefined&&x>w){return true}g(this).removeClass("ew-tree-tb-hide");if(!g(this).hasClass("ew-tree-table-open")){w=parseInt(g(this).data("indent"))}else{w=undefined}})}f(v.parentsUntil(".ew-tree-table").last().parent());return u}function f(w){var t=w.children(".ew-tree-table-head");var u=w.children(".ew-tree-table-box");var v=u.width()-u.prop("clientWidth");t.css("border-right",(v>0?v:0)+"px solid #f2f2f2")}g(window).resize(function(){g(".ew-tree-table").each(function(){f(g(this));var u=g(this).children(".ew-tree-table-box");var t=u.data("full");if(t&&o.ie&&o.ie<10){u.css("height",m()-t)}})});g(document).on("mouseenter",".ew-tree-table-cell.single-line",function(){var t=g(this).children(".ew-tree-table-cell-content");if(t.prop("scrollWidth")>t.outerWidth()){g(this).children(".layui-table-grid-down").show()}}).on("mouseleave",".ew-tree-table-cell.single-line",function(){g(this).children(".layui-table-grid-down").hide()});g(document).on("click",".ew-tree-table-cell>.layui-table-grid-down",function(w){w.stopPropagation();j();var u=g(this).parent();u.addClass("ew-tree-tips-open");u.children(".layui-table-grid-down").hide();var t=u.parent().outerWidth()+4;if(u.outerWidth()children(".ew-tree-table-cell-content").css({"width":t,"max-width":t})}var v=u.parents().filter(".ew-tree-table-box");if(v.length===0){v=u.parents().filter(".ew-tree-table-head")}if(v.length===0){return}if((u.outerWidth()+u.offset().left)+20>v.offset().left+v.outerWidth()){u.addClass("ew-show-left")}if((u.outerHeight()+u.offset().top+10)>v.offset().top+v.outerHeight()){u.addClass("ew-show-bottom")}});g(document).on("click",".ew-tree-table-cell>.ew-tree-tips-c",function(){j()});g(document).on("click",function(){j();g(".ew-tree-table .layui-table-tool-panel").remove()});g(document).on("click",".ew-tree-table-cell.ew-tree-tips-open",function(t){t.stopPropagation()});function j(){g(".ew-tree-table-cell").removeClass("ew-tree-tips-open ew-show-left ew-show-bottom");g(".ew-tree-table-cell>.ew-tree-table-cell-content").css({"width":"","max-width":""})}g(document).on("mousedown",".ew-tb-resize",function(x){layui.stope(x);var v=g(this);v.attr("move","true");var u=v.parent().data("key");v.data("x",x.clientX);var t=v.parent().parent().parent().parent().children("colgroup").children('col[data-key="'+u+'"]').attr("width");if(!t||t.toString().indexOf("%")!==-1){t=v.parent().outerWidth()}v.data("width",t);g("body").addClass("ew-tree-table-resizing")}).on("mousemove",function(B){var y=g('.ew-tree-table .ew-tb-resize[move="true"]');if(y.length===0){return}layui.stope(B);var t=y.data("x");var v=y.data("width");var u=parseFloat(v)+B.clientX-parseFloat(t);if(u<=0){u=1}var z=k[y.parentsUntil(".ew-tree-table").last().parent().attr("lay-filter")];var A=y.parent().data("key");var C=A.split("-");z.options.cols[C[0]][C[1]].width=u;z.eachCols(function(w,x){if(x.key===A){x.width=u}});z.resize()}).on("mouseup",function(t){g('.ew-tree-table .ew-tb-resize[move="true"]').attr("move","false");g("body").removeClass("ew-tree-table-resizing")}).on("mouseleave",function(t){g('.ew-tree-table .ew-tb-resize[move="true"]').attr("move","false");g("body").removeClass("ew-tree-table-resizing")});function q(x,u,z){var y=[];for(var w=0;wlength;w++){var t=false;for(var v=0;vlength;v++){if(x[w][z]==x[v][u]){t=true;break}}if(!t){y.push(x[w][z])}}return y}function n(u,v){if(l(v)==="Array"){for(var t=0;tlength;t++){if(u==v[t]){return true}}}return u==v}function l(t){if(t===null){return"Null"}if(t===undefined){return"Undefined"}return Object.prototype.toString.call(t).slice(8,-1)}function m(){return document.documentElement.clientHeight||document.body.clientHeight}var a={render:function(t){return new p(t)},reload:function(u,t){k[u].reload(t)},on:function(t,u){return layui.onevent.call(this,h,t,u)},pidToChildren:function(z,u,A,t,x){if(!t){t="children"}var y=[];for(var w=0;wlength;w++){if(z[w][u]==z[w][A]){return console.error("第"+w+"条数据的"+u+"与"+A+"相同",z[w])}if(x===undefined){x=q(z,u,A)}if(n(z[w][A],x)){var v=this.pidToChildren(z,u,A,t,z[w][u]);if(v.length>0){z[w][t]=v}y.push(z[w])}}return y}};g("head").append(['"].join(""));s("treeTable",a)});

    三、树结构展开(数据可懒加载)

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>设备上下线统计title>
    6. <script type="text/javascript" src="../../../language/language.js">script>
    7. <script type="text/javascript" src="../../proto/protobuf.min.js">script>
    8. <script type="text/javascript" src="../../component/js/common.js">script>
    9. <script type="text/javascript" src="../../component/js/commonNew.js">script>
    10. <script type="text/javascript" src="../../layui/layui.js?r=3.0">script>
    11. <link type="text/css" rel="stylesheet" href="../../layui/css/layui_base.css"/>
    12. <script type="text/javascript" src="../../component/js/jquery-2.1.0.min.js">script>
    13. <script src="../../component/js/xlsx.js">script>
    14. <script src="../../component/xlsx/dom.js">script>
    15. <script src="../../component/xlsx/xlsx.core.min.js">script>
    16. <script type="text/javascript" src="./error.js?r=1.3.3">script>
    17. head>
    18. <body>
    19. <form class="layui-form">
    20. <div id="none">
    21. <table class="layui-table" lay-filter="tabView" id="tabView">table>
    22. div>
    23. form>
    24. body>
    25. <script>
    26. var userPerson = getUser();
    27. var httpUser = { userName: userPerson.name, userGuid: userPerson.sessionId };
    28. let IPS;
    29. let str = document.domain;
    30. if (document.domain == 'localhost' || document.domain == "192.168.100.50") {
    31. IPS = 'https://xxc.chinamdvr.com:7050/v1/api/web/mgmt/deviceSetup/setupTicket/statistic';
    32. } else {
    33. IPS = 'https://www.chinamdvr.com:9201/v1/api/web/mgmt/deviceSetup/setupTicket/statistic';
    34. }
    35. let $, element, form, laydate, layer, tableView, util, treeTable;
    36. let listData = [
    37. {
    38. "region": "系统管理",
    39. "required": 1,
    40. "installed": 2,
    41. "checked": 3,
    42. "installNo": 4,
    43. "process": "60%",
    44. "parentId": -1,
    45. id: 1,
    46. "open": false,
    47. "haveChild": true
    48. }];
    49. layui.config({
    50. base: './'
    51. }).use(['element', 'form', 'laydate', 'layer', "util", "treeTable"], function(){
    52. form = layui.form, laydate = layui.laydate, layer = layui.layer;
    53. util = layui.util;
    54. element = layui.element;
    55. $ = layui.$;
    56. treeTable = layui.treeTable;
    57. // 渲染
    58. var inst = treeTable.render({
    59. elem: '#tabView',
    60. tree: {
    61. iconIndex: 0,
    62. isPidData: true,
    63. idName: 'id', // 父ID
    64. pidName: 'parentId', // 子ID
    65. // openName: 'open',// 是否默认展开的字段名
    66. },
    67. maxHeight: '501px',
    68. cols: [[
    69. { field: 'region', title: "网点所在区", align: 'center' },
    70. { field: 'required', title: "总数", align: 'center' },
    71. { field: 'installed', title: "已安装", align: 'center' },
    72. // { field: 'checked', title: "已验收", align: 'center' },
    73. // { field: 'installNo', title: "未验收", align: 'center' },
    74. { field: 'process', title: "安装进度", align: 'center', templet: schedule },
    75. ]],
    76. reqData: function (data, callback) { // 懒加载也可以用url方式,这里用reqData方式演示
    77. console.log(data)
    78. if (data == undefined) {
    79. callback([{
    80. "region": "系统管理",
    81. "required": 1,
    82. "installed": 2,
    83. "checked": 3,
    84. "installNo": 4,
    85. "process": "60%",
    86. "parentId": -1,
    87. id: 1,
    88. "open": false,
    89. "haveChild": true
    90. }]);
    91. } else if (data.id == 1) {
    92. callback([{
    93. "region": "用户管理",
    94. "required": 11,
    95. "installed": 22,
    96. "checked": 33,
    97. "installNo": 44,
    98. "process": "61%",
    99. "parentId": 1,
    100. id: 2,
    101. "open": false,
    102. "haveChild": true
    103. }]);
    104. } else if (data.id == 2) {
    105. callback([{
    106. "region": "查询用户",
    107. "required": 111,
    108. "installed": 222,
    109. "checked": 333,
    110. "installNo": 444,
    111. "process": "63%",
    112. "parentId": 2,
    113. id: 3,
    114. "open": false,
    115. "haveChild": false
    116. },
    117. {
    118. "region": "添加用户",
    119. "required": 1111,
    120. "installed": 2222,
    121. "checked": 3333,
    122. "installNo": 4444,
    123. "process": "64%",
    124. "parentId": 2,
    125. id: 4,
    126. "open": false,
    127. "haveChild": false
    128. },
    129. {
    130. "region": "修改用户",
    131. "required": 11111,
    132. "installed": 22222,
    133. "checked": 33333,
    134. "installNo": 44444,
    135. "parentId": 2,
    136. "process": "67%",
    137. "parentId": 2,
    138. id: 5,
    139. "open": false,
    140. "haveChild": false
    141. },
    142. {
    143. "region": "删除用户",
    144. "required": 111111,
    145. "installed": 222222,
    146. "checked": 333333,
    147. "installNo": 444444,
    148. "process": "69%",
    149. "parentId": 2,
    150. id: 6,
    151. "open": false,
    152. "haveChild": false
    153. }]);
    154. }
    155. },
    156. toolbar: true,
    157. defaultToolbar: ['exports'],
    158. page: true,
    159. done: function (res, curr, count) {
    160. element.render();
    161. // element.progress('rate', '75%');
    162. }
    163. });
    164. interfaceParam();
    165. });
    166. /** 进度条 */
    167. function schedule(d) {
    168. //设置页面进度条
    169. return '
      ' +
    170. '
      'layui-bg-green' + '" lay-percent="' + d.process + '">' +
    171. '
      '
    172. }
    173. // 调用接口
    174. function interfaceParam() {
    175. let url = IPS + "/progress";
    176. let timerTimeOut, loadingTimeOut;
    177. layui.use('layer', function () {
    178. layer = layui.layer;
    179. loadingTimeOut = layer.load(2, { shade: false });
    180. timerTimeOut = setTimeout(function () {
    181. layer.open({
    182. title: languageTL.common.promptTitle,
    183. content: languageTL.count.btns2[5],
    184. btn: [languageTL.confirm]
    185. });
    186. layer.close(loadingTimeOut);
    187. }, 1000 * 10);
    188. });
    189. proPostNew(url, "FtpManage.EpibolyTicketProgressReq", "FtpManage.EpibolyTicketProgressResp", { userInfo: httpUser }, function (code, result) {
    190. clearTimeout(timerTimeOut); // 关闭定时器
    191. layer.close(loadingTimeOut);
    192. if (code == 200) {
    193. console.log(result)
    194. result.epibolyTicketProgressList.map(item => {
    195. item.installNo = item.installed - item.checked;
    196. item.process = percentNum(item.installed , item.required);
    197. })
    198. listData = result.epibolyTicketProgressList;
    199. } else {
    200. layer.msg(errLayer(result.code));
    201. }
    202. }, 'ftpManage', 'FtpManage.Error');
    203. }
    204. //小数点后两位百分比
    205. function percentNum(num,num2) {
    206. return (Math.round(num / num2 * 10000) / 100.00 + "%");
    207. }
    208. script>
    209. html>

    四、树结构展开(添加分页)

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>设备上下线统计title>
    6. <script type="text/javascript" src="../../../language/language.js">script>
    7. <script type="text/javascript" src="../../proto/protobuf.min.js">script>
    8. <script type="text/javascript" src="../../component/js/common.js">script>
    9. <script type="text/javascript" src="../../component/js/commonNew.js">script>
    10. <script type="text/javascript" src="../../layui/layui.js?r=3.0">script>
    11. <link type="text/css" rel="stylesheet" href="../../layui/css/layui_base.css"/>
    12. <script type="text/javascript" src="../../component/js/jquery-2.1.0.min.js">script>
    13. <script src="../../component/js/xlsx.js">script>
    14. <script src="../../component/xlsx/dom.js">script>
    15. <script src="../../component/xlsx/xlsx.core.min.js">script>
    16. <script type="text/javascript" src="./error.js?r=1.3.3">script>
    17. head>
    18. <body>
    19. <form class="layui-form">
    20. <div class="layui-form-item" id="dateInput">
    21. <div class="layui-inline">
    22. <label class="layui-form-label"><script>document.write(languageTL.count.startTime)script>label>
    23. <div class="layui-input-inline">
    24. <input type="text" name="startDate" class="layui-input" id="startDate" lay-verify="required">
    25. div>
    26. div>
    27. <div class="layui-inline">
    28. <label class="layui-form-label"><script>document.write(languageTL.count.endTime)script>label>
    29. <div class="layui-input-inline">
    30. <input type="text" name="endDate" class="layui-input" id="endDate" lay-verify="required">
    31. div>
    32. div>
    33. div>
    34. <div class="layui-form-item" style="margin-left: 8px;">
    35. <div class="layui-inline" style="margin-left: 90px;" id="queryBtn">
    36. <button type="submit" class="layui-btn" lay-submit="" lay-filter="demo">
    37. <script>document.write(languageTL.count.query)script>
    38. button>
    39. div>
    40. <div class="layui-inline" style="margin-left: 220px;">
    41. <button type="button" class="layui-btn" id="totalAll" onclick="selectType(0)">已安装(0)button>
    42. <button type="button" class="layui-btn layui-bg-green" id="yiYanShou" onclick="selectType(1)">已验收(0)button>
    43. <button type="button" class="layui-btn layui-bg-red" id="weiYanShou" onclick="selectType(2)">未验收(0)button>
    44. div>
    45. div>
    46. <div id="none">
    47. <table class="layui-table" lay-filter="tabView" id="tabView">table>
    48. <div id="demo-laypage-limits">div>
    49. div>
    50. <table class="layui-table" lay-filter="tabViewDetail" id="tabViewDetail">table>
    51. form>
    52. body>
    53. <script>
    54. var userPerson = getUser();
    55. var httpUser = { userName: userPerson.name, userGuid: userPerson.sessionId };
    56. let IPS, IPSDetail;
    57. let str = document.domain;
    58. if (document.domain == 'localhost' || document.domain == "192.168.100.50") {
    59. IPS = 'https://xxc.chinamdvr.com:7050/v1/api/web/mgmt/deviceSetup/setupTicket/statistic';
    60. IPSDetail = 'https://xxc.chinamdvr.com:7050/v1/api/web/mgmt/deviceSetup/setupTicket/detail';
    61. } else {
    62. IPS = 'https://www.chinamdvr.com:9201/v1/api/web/mgmt/deviceSetup/setupTicket/statistic';
    63. IPSDetail = 'https://www.chinamdvr.com:9201/v1/api/web/mgmt/deviceSetup/setupTicket/detail';
    64. }
    65. let $, element, form, laydate, layer, tableView, treeTable;
    66. let pageSize = 10, pageNum = 1, pageTotal = 0, pageData = [], laypage;
    67. let listData = [], listDataDetail = [], objData = {};
    68. let number;
    69. let colsList = [
    70. { field: 'region', title: "网点所在区", align: 'center' },
    71. { field: 'totalInstalled', title: "已安装", align: 'center' },
    72. // { field: 'newInstalled', title: "新安装设备", align: 'center' },
    73. { field: 'checkFinished', title: "已验收", align: 'center' },
    74. { field: 'totalUnchecked', title: "未验收", align: 'center' },
    75. ];
    76. let colsListDetail = [
    77. {field: 'plateNumber', title: languageTL.common.VehicleID, align: 'center'},
    78. {field: 'sn', title: "SN", align: 'center'},
    79. {field: 'stateS', title: languageTL.person.table_title_1[5], align: 'center'},
    80. {field: 'creator', title: "安装人", align: 'center'},
    81. {field: 'createAt', title: "安装时间", align: 'center'},
    82. {field: 'companyName', title: "安装公司", align: 'center'},
    83. {field: 'auditTor', title: "审批人", align: 'center'},
    84. {field: 'auditAt', title: "审批时间", align: 'center'},
    85. {field: 'auditMemo', title: "审批备注", align: 'center'},
    86. {field: 'yanTor', title: "验收人", align: 'center'},
    87. {field: 'yanAt', title: "验收时间", align: 'center'},
    88. {field: 'yanMemo', title: "验收备注", align: 'center'},
    89. ];
    90. layui.use(['element', 'form', 'laydate', 'layer'], function(){
    91. $ = layui.jquery ,element = layui.element, form = layui.form, laydate = layui.laydate, layer = layui.layer;
    92. tableDetail();
    93. tableRender();
    94. const LANGAll = getQueryLanguage("la");
    95. // 开始时间
    96. laydate.render({
    97. elem: '#startDate',
    98. format: 'yyyy-MM-dd',
    99. trigger: 'click',
    100. type: 'date',
    101. lang: LANGAll,
    102. done: function (value, date) {
    103. $('#startDate').val(value);
    104. let start = new Date(value).getTime();
    105. let end;
    106. let e = $('#endDate').val();
    107. if (e == '') {
    108. end = 0;
    109. } else {
    110. end = new Date(e).getTime();
    111. if (end < start) {
    112. $('#endDate').click();
    113. layer.msg(languageTL.gpsCount.tabs[6])
    114. }
    115. }
    116. }
    117. });
    118. // 结束时间
    119. laydate.render({
    120. elem: '#endDate',
    121. format: 'yyyy-MM-dd',
    122. type: 'date',
    123. trigger: 'click',
    124. lang: LANGAll,
    125. done: function (value, date) {
    126. $('#endDate').val(value);
    127. let end = new Date(value).getTime();
    128. let start;
    129. let s = $('#startDate').val();
    130. if (s == '') {
    131. start = 0;
    132. } else {
    133. start = new Date(s).getTime();
    134. if (end < start) {
    135. $('#startDate').click();
    136. layer.msg(languageTL.gpsCount.tabs[5])
    137. }
    138. }
    139. }
    140. });
    141. $('#startDate').val(getDateInfo(0)); // 开始时间默认值
    142. $('#endDate').val(getDateInfo(0)); // 结束时间默认值
    143. number = parseInt(getQueryStringOld("number"));
    144. if (number == 4001) {
    145. $('#endDate').attr('lay-verify', '');
    146. $('#startDate').attr('lay-verify', '');
    147. $("#dateInput").css("display", "none");
    148. $("#queryBtn").css("display", "none");
    149. let url, requestParam, returnParam;
    150. objData.userInfo = {
    151. userName: httpUser.userName,
    152. userGuid: httpUser.userGuid
    153. };
    154. url = IPS + "/all";
    155. requestParam = "FtpManage.TicketStatisticAllReq";
    156. returnParam = "FtpManage.TicketStatisticResp";
    157. interfaceParam(url, requestParam, returnParam, objData, 1);
    158. }
    159. form.render();
    160. //监听提交
    161. form.on('submit(demo)', function (data) {
    162. data = data.field;
    163. let url, requestParam, returnParam;
    164. objData = {
    165. userInfo :{
    166. userName: httpUser.userName,
    167. userGuid: httpUser.userGuid
    168. },
    169. startDate : data.startDate,
    170. endDate : data.endDate
    171. };
    172. let a = new Date(Date.parse(data.endDatetime)).getTime();
    173. let b = new Date(Date.parse(data.startDatetime)).getTime();
    174. if (b > a) {
    175. layer.open({
    176. title: languageTL.common.promptTitle
    177. ,content: languageTL.count.btns[14],
    178. time: 3000
    179. });
    180. listData = [];
    181. listDataDetail = [];
    182. tableDetail();
    183. } else {
    184. url = IPS + "/date";
    185. requestParam = "FtpManage.TicketStatisticDateReq";
    186. returnParam = "FtpManage.TicketStatisticResp";
    187. interfaceParam(url, requestParam, returnParam, objData, 1);
    188. }
    189. return false;
    190. });
    191. });
    192. // 调用接口
    193. function interfaceParam(url, requestParam, returnParam, obj, number) {
    194. let timerTimeOut, loadingTimeOut;
    195. layui.use('layer', function () {
    196. layer = layui.layer;
    197. loadingTimeOut = layer.load(2, { shade: false });
    198. timerTimeOut = setTimeout(function () {
    199. layer.open({
    200. title: languageTL.common.promptTitle,
    201. content: languageTL.count.btns2[5],
    202. btn: [languageTL.confirm]
    203. });
    204. layer.close(loadingTimeOut);
    205. }, 1000 * 10);
    206. });
    207. proPostNew(url, requestParam, returnParam, obj, function (code, result) {
    208. clearTimeout(timerTimeOut); // 关闭定时器
    209. layer.close(loadingTimeOut);
    210. if (code == 200) {
    211. console.log(result)
    212. if (number === 1) {
    213. if (result.summation) {
    214. $("#totalAll").html("已安装(" + result.summation.totalInstalled + ")");
    215. $("#yiYanShou").html("已验收(" + result.summation.checkFinished + ")");
    216. $("#weiYanShou").html("未验收(" + result.summation.totalUnchecked + ")");
    217. }
    218. result.ticketStatisticList.map((item, index) => {
    219. item.id = index;
    220. item.open = false;
    221. item.haveChild = false;
    222. })
    223. pageData = result.ticketStatisticList;
    224. pageTotal = result.ticketStatisticList.length;
    225. listData = pageData.slice((pageNum - 1) * pageSize, pageNum * pageSize);
    226. listDataDetail = [];
    227. tableRender();
    228. } else if (number === 2) {
    229. result.tickets.map(item => {
    230. if (item.result == 1 && item.stage == 2) {
    231. item.stateS = "待审批";
    232. } else if (item.result == 3 && item.stage == 2) {
    233. item.stateS = "审批未通过";
    234. } else if (item.result == 1 && item.stage == 3) {
    235. item.stateS = "审批通过";
    236. } else if (item.result == 2 && item.stage == 3) {
    237. item.stateS = "验收通过";
    238. } else if (item.result == 3 && item.stage == 3) {
    239. item.stateS = "验收未通过";
    240. }
    241. })
    242. listDataDetail = result.tickets;
    243. }
    244. tableDetail();
    245. } else {
    246. layer.msg(errLayer(result.code));
    247. }
    248. }, 'ftpManage', 'FtpManage.Error');
    249. }
    250. function tableRender () {
    251. layui.config({
    252. base: './'
    253. }).use(['treeTable', "laypage"], function () {
    254. treeTable = layui.treeTable;
    255. laypage = layui.laypage;
    256. // 渲染
    257. var inst = treeTable.render({
    258. elem: '#tabView',
    259. height: "250",
    260. tree: {
    261. iconIndex: 0,
    262. isPidData: true,
    263. idName: 'id', // 父ID
    264. pidName: 'parentId', // 子ID
    265. // openName: 'open',// 是否默认展开的字段名
    266. },
    267. maxHeight: '501px',
    268. cols: [colsList],
    269. reqData: function (data, callback) { // 懒加载也可以用url方式,这里用reqData方式演示
    270. console.log(data)
    271. console.log("无敌是多么及名片")
    272. if (data == undefined) {
    273. callback(listData);
    274. } else if (data.id == 1) {
    275. }
    276. },
    277. toolbar: true,
    278. defaultToolbar: [
    279. {
    280. title: "排列",
    281. layEvent: 'LAYTABLE_COLS',
    282. icon: 'layui-icon-cols'
    283. },
    284. {
    285. title: languageTL.historyMap.exportXls,
    286. layEvent: 'export',
    287. icon: 'layui-icon-export'
    288. }],
    289. page: true,
    290. });
    291. treeTable.on('row(tabView)', function (obj) {
    292. let url, requestParam, returnParam;
    293. if (number == 4001) {
    294. let objEv = {
    295. userInfo: {
    296. userName: httpUser.userName,
    297. userGuid: httpUser.userGuid
    298. },
    299. region: obj.data.region
    300. }
    301. url = IPSDetail + "/all";
    302. requestParam = "FtpManage.TicketDetailAllReq";
    303. returnParam = "FtpManage.TicketDetailResp";
    304. interfaceParam(url, requestParam, returnParam, objEv, 2);
    305. } else {
    306. let objEv = {
    307. userInfo: {
    308. userName: httpUser.userName,
    309. userGuid: httpUser.userGuid
    310. },
    311. region: obj.data.region,
    312. startDate: objData.startDate,
    313. endDate: objData.endDate,
    314. }
    315. url = IPSDetail + "/date";
    316. requestParam = "FtpManage.TicketDetailDateReq";
    317. returnParam = "FtpManage.TicketDetailResp";
    318. interfaceParam(url, requestParam, returnParam, objEv, 2);
    319. }
    320. });
    321. treeTable.on('toolbar(tabView)', function (obj) {
    322. switch (obj.event) {
    323. case 'export':
    324. if (listData.length == 0) {
    325. layer.msg(languageTL.deviceVideo.loss[3]);
    326. return;
    327. }
    328. let tHeader = [], filterVal = [];
    329. colsList.map((item, index) => {
    330. tHeader.push(item.title);
    331. filterVal.push(item.field);
    332. });
    333. // 导出的数据
    334. const data = PlExportExcel.formatJson(filterVal, listData);
    335. // 导出表格
    336. PlExportExcel.exportJsonToExcel({
    337. header: tHeader,
    338. data: data,
    339. filename: "Device",
    340. autoWidth: true,
    341. bookType: 'xlsx'
    342. });
    343. break;
    344. };
    345. });
    346. // 自定义每页条数的选择项
    347. laypage.render({
    348. elem: 'demo-laypage-limits',
    349. count: pageTotal,
    350. limit: pageSize,
    351. curr: pageNum,
    352. limits: [10, 20, 50, 100],
    353. layout: ['count', 'prev', 'page', 'next', 'limit'],
    354. jump: function (obj, first) {
    355. //obj包含了当前分页的所有参数,比如:
    356. //obj.curr; //得到当前页,以便向服务端请求对应页的数据。
    357. //obj.limit; //得到每页显示的条数
    358. //首次不执行
    359. if (!first) {
    360. //do something
    361. pageSize = obj.limit;
    362. pageNum = obj.curr;
    363. let from = (pageNum - 1) * pageSize;
    364. let to = pageNum * pageSize;
    365. listData = pageData.slice(from, to);
    366. tableRender();
    367. }
    368. }
    369. });
    370. });
    371. }
    372. function tableDetail() {
    373. layui.use('table', function () {
    374. tableView = layui.table;
    375. // 详细信息渲染表格
    376. tableView.render({
    377. elem: '#tabViewDetail',
    378. data: listDataDetail,
    379. height: '320',
    380. toolbar: '#toolbarDemo',
    381. defaultToolbar: [{
    382. title: languageTL.historyMap.exportXls,
    383. layEvent: 'export',
    384. icon: 'layui-icon-export'
    385. }],
    386. cellMinWidth: 80,
    387. cols: [colsListDetail],
    388. page: true, //是否显示分页
    389. limits: [10, 20, 50, 100],
    390. page: {
    391. count: listDataDetail.length,
    392. prev: languageTL.common.previousStr,
    393. next: languageTL.common.nextStr,
    394. layout: ['prev', 'page', 'next', 'count', 'limit']
    395. }
    396. });
    397. //头工具栏事件 详细信息导出
    398. tableView.on('toolbar(tabViewDetail)', function (obj) {
    399. switch (obj.event) {
    400. //自定义头工具栏右侧图标 - 提示
    401. case 'export':
    402. if (listDataDetail.length == 0) {
    403. layer.msg(languageTL.deviceVideo.loss[3]);
    404. return;
    405. }
    406. let tHeader = [], filterVal = [];
    407. colsListDetail.map((item, index) => {
    408. tHeader.push(item.title);
    409. filterVal.push(item.field);
    410. });
    411. // 导出的数据
    412. const data = PlExportExcel.formatJson(filterVal, listDataDetail);
    413. // 导出表格
    414. PlExportExcel.exportJsonToExcel({
    415. header: tHeader,
    416. data: data,
    417. filename: "Detail",
    418. autoWidth: true,
    419. bookType: 'xlsx'
    420. });
    421. break;
    422. };
    423. });
    424. });
    425. }
    426. // 时间默认值
    427. function getDateInfo(type) {
    428. let date = new Date();
    429. let year = date.getFullYear();
    430. let month = date.getMonth() + 1 >= 10 ? date.getMonth() + 1 : '0' + (date.getMonth() + 1);
    431. let day = date.getDate() >= 10 ? date.getDate() : '0' + date.getDate();
    432. let hour = date.getHours() >= 10 ? date.getHours() : '0' + date.getHours();
    433. let minute = date.getMinutes() >= 10 ? date.getMinutes() : '0' + date.getMinutes()
    434. let second = date.getSeconds() >= 10 ? date.getSeconds() : '0' + date.getSeconds()
    435. let month_1 = Number(month - 1) >= 10 ? Number(month - 1) : '0' + Number(month - 1);
    436. let arr = [
    437. year + '-' + month + '-' + day
    438. ];
    439. return arr[type];
    440. }
    441. script>
    442. html>

     

  • 相关阅读:
    乐鑫 ESP32-H2 SoC 与 Thread SDK 通过 Thread 1.3.0 认证
    开源酒店管理系统(C/S模式)
    计算机毕业设计Python+Django的银行取号管理系统
    【Python】 Python 使用 Pillow 处理图像:几何变换
    SpringCloud Alibaba——精读Nacos+CMDB+核心源码阅读(7w字长篇)
    模板多多的BI系统,绝不在可视化大屏制作上多花一秒
    Spring Boot面试必问:启动流程
    SpringMVC接收数据
    Failed to start sshd.service: Unit sshd.service not found
    Leetcode—34.在排序数组中查找元素的第一个和最后一个位置【中等】
  • 原文地址:https://blog.csdn.net/Benxiaohai_311/article/details/133898687