text: layui.define(['layer', 'table'], function (exports) {
      var $ = layui.jquery;
      var layer = layui.layer;
      var table = layui.table;
  
      var treetable = {
          // 渲染树形表格
          render: function (param) {
              // 检查参数
              if (!treetable.checkParam(param)) {
                  return;
              }
              // 获取数据
              if (param.data) {
                  treetable.init(param, param.data);
              } else {
                  $.getJSON(param.url, param.where, function (res) {
                      treetable.init(param, res.data);
                  });
              }
          },
          // 渲染表格
          init: function (param, data) {
              var mData = [];
              var doneCallback = param.done;
              var tNodes = data;
              // 补上id和pid字段
              for (var i = 0; i < tNodes.length; i++) {
                  var tt = tNodes[i];
                  if (!tt.id) {
                      if (!param.treeIdName) {
                          layer.msg('参数treeIdName不能为空', {icon: 5});
                          return;
                      }
                      tt.id = tt[param.treeIdName];
                  }
                  if (!tt.pid) {
                      if (!param.treePidName) {
                          layer.msg('参数treePidName不能为空', {icon: 5});
                          return;
                      }
                      tt.pid = tt[param.treePidName];
                  }
              }
  
              // 对数据进行排序
              var sort = function (s_pid, data) {
                  for (var i = 0; i < data.length; i++) {
                      if (data[i].pid == s_pid) {
                          var len = mData.length;
                          if (len > 0 && mData[len - 1].id == s_pid) {
                              mData[len - 1].isParent = true;
                          }
                          mData.push(data[i]);
                          sort(data[i].id, data);
                      }
                  }
              };
              sort(param.treeSpid, tNodes);
  
              // 重写参数
              param.url = undefined;
              param.data = mData;
              param.page = {
                  count: param.data.length,
                  limit: param.data.length
              };
              param.cols[0][param.treeColIndex].templet = function (d) {
                  var mId = d.id;
                  var mPid = d.pid;
                  var isDir = d.isParent;
                  var emptyNum = treetable.getEmptyNum(mPid, mData);
                  var iconHtml = '';
                  for (var i = 0; i < emptyNum; i++) {
                      iconHtml += '<span class="treeTable-empty"></span>';
                  }
                  if (isDir) {
                      iconHtml += '<i class="layui-icon layui-icon-triangle-d"></i> <i class="layui-icon layui-icon-layer"></i>';
                  } else {
                      iconHtml += '<i class="layui-icon layui-icon-file"></i>';
                  }
                  iconHtml += '&nbsp;&nbsp;';
                  var ttype = isDir ? 'dir' : 'file';
                  var vg = '<span class="treeTable-icon open" lay-tid="' + mId + '" lay-tpid="' + mPid + '" lay-ttype="' + ttype + '">';
                  return vg + iconHtml + d[param.cols[0][param.treeColIndex].field] + '</span>'
              };
  
              param.done = function (res, curr, count) {
                  $(param.elem).next().addClass('treeTable');
                  $('.treeTable .layui-table-page').css('display', 'none');
                  $(param.elem).next().attr('treeLinkage', param.treeLinkage);
                  // 绑定事件换成对body绑定
                  /*$('.treeTable .treeTable-icon').click(function () {
                      treetable.toggleRows($(this), param.treeLinkage);
                  });*/
                  if (param.treeDefaultClose) {
                      treetable.foldAll(param.elem);
                  }
                  if (doneCallback) {
                      doneCallback(res, curr, count);
                  }
              };
  
              // 渲染表格
              table.render(param);
          },
          // 计算缩进的数量
          getEmptyNum: function (pid, data) {
              var num = 0;
              if (!pid) {
                  return num;
              }
              var tPid;
              for (var i = 0; i < data.length; i++) {
                  if (pid == data[i].id) {
                      num += 1;
                      tPid = data[i].pid;
                      break;
                  }
              }
              return num + treetable.getEmptyNum(tPid, data);
          },
          // 展开/折叠行
          toggleRows: function ($dom, linkage) {
              var type = $dom.attr('lay-ttype');
              if ('file' == type) {
                  return;
              }
              var mId = $dom.attr('lay-tid');
              var isOpen = $dom.hasClass('open');
              if (isOpen) {
                  $dom.removeClass('open');
              } else {
                  $dom.addClass('open');
              }
              $dom.closest('tbody').find('tr').each(function () {
                  var $ti = $(this).find('.treeTable-icon');
                  var pid = $ti.attr('lay-tpid');
                  var ttype = $ti.attr('lay-ttype');
                  var tOpen = $ti.hasClass('open');
                  if (mId == pid) {
                      if (isOpen) {
                          $(this).hide();
                          if ('dir' == ttype && tOpen == isOpen) {
                              $ti.trigger('click');
                          }
                      } else {
                          $(this).show();
                          if (linkage && 'dir' == ttype && tOpen == isOpen) {
                              $ti.trigger('click');
                          }
                      }
                  }
              });
          },
          // 检查参数
          checkParam: function (param) {
              console.log(param);
              if (!param.treeSpid && param.treeSpid != 0) {
                  layer.msg('参数treeSpid不能为空', {icon: 5});
                  return false;
              }
  
              if (!param.treeColIndex && param.treeColIndex != 0) {
                  layer.msg('参数treeColIndex不能为空', {icon: 5});
                  return false;
              }
              return true;
          },
          // 展开所有
          expandAll: function (dom) {
              $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
                  var $ti = $(this).find('.treeTable-icon');
                  var ttype = $ti.attr('lay-ttype');
                  var tOpen = $ti.hasClass('open');
                  if ('dir' == ttype && !tOpen) {
                      $ti.trigger('click');
                  }
              });
          },
          // 折叠所有
          foldAll: function (dom) {
              $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
                  var $ti = $(this).find('.treeTable-icon');
                  var ttype = $ti.attr('lay-ttype');
                  var tOpen = $ti.hasClass('open');
                  if ('dir' == ttype && tOpen) {
                      $ti.trigger('click');
                  }
              });
          }
      };
  
      layui.link(layui.cache.base + 'treetable-lay/treetable.css');
  
      // 给图标列绑定事件
      $('body').on('click', '.treeTable .treeTable-icon', function () {
          var treeLinkage = $(this).parents('.treeTable').attr('treeLinkage');
          if ('true' == treeLinkage) {
              treetable.toggleRows($(this), true);
          } else {
              treetable.toggleRows($(this), false);
          }
      });
  
      exports('treetable', treetable);
  });
  