问题:

  机构维护时,前端框架用的是easyui,如果同步全加载会出现页面延迟严重,影响用户体验

解决:

  机构逐层加载,点击后加载

  逐层加载会出现一个问题:子节点只有点击后才能加载子集

  所以开始为叶子节点图标,点击后变成枝节点,不点就误以为到最后一层

  目前的解决办法是加载是提供状态属性,默认关闭,加载不到子集时展开状态为叶子节点图标

实现:

function initOrgMaintainDetail(versionId){
var tree = $("#orgMaintainDetail").treegrid();
var dataTree = '';
$.ajax({
url:'./fileServiceType/getOrgTreeDetail',
async:false,
data: {
Authorization: localStorage.token,
versionId:versionId
},
success:function(data){
dataTree = data;
}
});
  //开始加载机构树前两层
tree.treegrid({
data:dataTree,
queryParams: {
Authorization: localStorage.token,
versionId:versionId
},
idField:'orgTypeId',
cascadeCheck:true,
treeField:'orgDesc',
fitColumns:true,
animate: true,
columns:[[
{title:'金融机构编码',field:'orgTypeId',align:'center',width:200},
{title:'金融机构名称',field:'orgDesc',width:300},
{title:'是否启用',field:'isActive',align:'center',formatter:function(value){
return value == 1?'启用':'禁用';
},width:100},
//{title:'归属人行',field:'reserved',align:'center',width:200},
{title:'归属地区',field:'areaNo',align:'center',width:150,formatter:function(value,rec){
var areaDscr ='';
$.ajax({
url:'area/find',
data:{ Authorization: localStorage.token,areaId:rec.areaNo},
type:'POST',
dataType:'JSON',
async:false,
success:function(data){
areaDscr = data.AREA_DSCR;
}
});
return areaDscr;
}},
{title:'操作',field:'operate',align:'center',width:200,
formatter:function(value,rec){
var add = "<a href='javascript:void(0);' onclick=\"openAddOrUptOrgPancyBox('" + 1 + "','"+
rec.orgTypeId + "','"+
0 + "','"+
rec.org_lvl + "','"+
1 + "','"+
0 + "','"+
0 +
"');\"><font color='#1e90ff'>新增</font></a>"; var editArea = "<a href='javascript:void(0);' onclick=\"onclickAreaPancyBox('" + rec.areaNo + "')\"><font color='#1e90ff'>地区维护</font></a><br>";
var update = "<a href='javascript:void(0);' onclick=\"openAddOrUptOrgPancyBox('" + 0 + "','"+
rec.orgTypeId + "','"+
rec.orgDesc + "','"+
rec.org_lvl + "','"+
rec.isActive + "','"+
rec.ord + "','"+
rec.areaNo +
"')\"><font color='#1e90ff'>修改</font></a>";
var batchLoad = "<a href='javascript:void(0);' onclick=\"batchImportDBMS('" + rec.ORG_ID + "','"+
rec.LVL + "','"+
rec.ORG_ID +
"')\"><font color='#1e90ff'>批量导入BMS</font></a>";
if(rec.org_lvl == 1){
return add + "&nbsp;" + update + "&nbsp;";
}else{
return add + "&nbsp;" + update;
} }
}
]],
onLoadSuccess: function (row, data) {
tree.treegrid("collapseAll");
},
onBeforeExpand:function(row){
expandNode(row,tree,versionId);
},
onDblClickRow: function (row) {
tree.treegrid('toggle',row.orgTypeId);
}
});
}
//追加子节点
function expandNode(row,tree,versionId){
$.ajax({
url: './fileServiceType/getOrgNodeChilds',
type: 'POST',
async:false,
data: {
Authorization: localStorage.token,
org_lvl: row.org_lvl,
p_Id: row.orgTypeId,
versionId:versionId
},
success: function (data) {
if(data != ''){
$.each(data, function(idx, obj) {
var node = tree.treegrid('find',obj.orgTypeId);
//该节点存在则不拼接
if(node==null){
tree.treegrid('append',{
parent: row.orgTypeId,
data: [{
orgTypeId: obj.orgTypeId,
orgDesc: obj.orgDesc,
org_lvl: obj.org_lvl,
areaNo: obj.areaNo,
isActive:obj.isActive,
ord:obj.ord,
reserved:obj.reserved,
state:obj.state
}]
});
} });
}else{
//没有数据则更改节点状态为叶子节点
tree.treegrid('update',{
id:row.orgTypeId,
row:{
              //每层都默认有子集,直到查不到子集再展开
state:'open'
}
}); } }
});
}

节点实体类:

package org.triber.portal.model.bank;

import lombok.Getter;
import lombok.Setter; import java.io.Serializable;
import java.util.ArrayList;
import java.util.List; public class Node implements Serializable { /**
* 加载树需要列
*/
@Getter @Setter private String orgTypeId;//编号
@Getter @Setter private String orgDesc;//名字
@Getter @Setter private List<Node> children = new ArrayList<Node>();//子集
@Getter @Setter private String p_Id;
@Getter @Setter private String isActive;
@Getter @Setter private String org_lvl;//级别
@Getter @Setter private String ord;//排序
@Getter @Setter private String areaNo;
@Getter @Setter private String state = "closed";//节点状态
/**
* 信息列
*/
// @Getter @Setter private String isAdd;
// @Getter @Setter private String addOrgIdPancy;
// @Getter @Setter private String isCheckNodeId;
// @Getter @Setter private String orgId;
// @Getter @Setter private String addOrgDscrPancy;
// @Getter @Setter private String addOrgDscr1Pancy;
// @Getter @Setter private String addIsActive;
// @Getter @Setter private String nodesNum;
// @Getter @Setter private String orgLvl;
// @Getter @Setter private String lvlOrd;
// @Getter @Setter private String versionId;
// @Getter @Setter private String humanDecencyId; }

查询sql:

  <select id="getOrgRootTree" resultType="org.triber.common.model.user.TreeNode">
SELECT DISTINCT
tt1.id, tt1.`NAME`, tt1.pid, CASE WHEN tt3.org_id=tt1.id THEN 1 ELSE 0 END AS isChecked,'closed' AS state,
CASE
WHEN tt1.id = tt2.ORG_TYPE_ID_1
OR tt1.id = tt2.ORG_TYPE_ID_2
OR tt1.id = tt2.ORG_ID_1
OR tt1.id = tt2.ORG_ID_2
OR tt1.id = tt2.ORG_ID_3
OR tt1.id = tt2.ORG_ID_4
OR tt1.id = tt2.ORG_ID_5 THEN
1
ELSE
0
END AS hasChecked
FROM
(
SELECT DISTINCT org_type_id_1 id, org_type_dscr_1 `NAME`, 0 pid FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}
UNION
SELECT DISTINCT org_type_id_2 id, org_type_dscr_2 `NAME`, org_type_id_1 pid FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}
) tt1
LEFT JOIN
(
SELECT findcheck.org_id, findcheck.biz_type_id, tobl.ORG_TYPE_ID_1, tobl.ORG_TYPE_ID_2, tobl.ORG_ID_1, tobl.ORG_ID_2, tobl.ORG_ID_3, tobl.ORG_ID_4, tobl.ORG_ID_5, tobl.`LEVEL` FROM dmcode.t_org_biz_lvl tobl
RIGHT JOIN
(
SELECT biz_type_id,org_id FROM comm_sys.t_biz_type_org_xref WHERE biz_type_id IS NOT NULL AND biz_type_id = #{bizTypeId}
) findcheck
ON (tobl.ORG_ID = findcheck.org_id OR findcheck.org_id = tobl.ORG_TYPE_ID_1 OR findcheck.org_id = tobl.ORG_TYPE_ID_2)
) tt2 ON (tt1.id = tt2.ORG_TYPE_ID_1 OR tt1.id = tt2.ORG_TYPE_ID_2)
LEFT JOIN (SELECT org_id FROM comm_sys.t_biz_type_org_xref WHERE biz_type_id = #{bizTypeId}) tt3 ON tt1.id = tt3.org_id
ORDER BY tt1.id
</select>
  
  //加载子节点
<select id="getOrgTreeByParent" resultType="org.triber.common.model.user.TreeNode">
SELECT
DISTINCT tt1.id,tt1.`NAME`,tt1.pid,tt1.state,
CASE WHEN tt1.id = tt3.org_id THEN 1 ELSE 0 END AS isChecked,
CASE
WHEN tt1.id = tt2.ORG_TYPE_ID_1
OR tt1.id = tt2.ORG_TYPE_ID_2
OR tt1.id = tt2.ORG_ID_1
OR tt1.id = tt2.ORG_ID_2
OR tt1.id = tt2.ORG_ID_3
OR tt1.id = tt2.ORG_ID_4
OR tt1.id = tt2.ORG_ID_5 THEN 1
ELSE 0
END AS hasChecked
FROM (
SELECT DISTINCT
org_all.id,org_all.NAME,org_all.pid,
CASE WHEN org_all.id IN (SELECT DISTINCT parent_org_id FROM dmcode.t_org_biz_lvl WHERE parent_org_id IS NOT NULL AND parent_org_id != '') THEN 'closed' ELSE 'open' END AS state
FROM (
SELECT DISTINCT org_id_1 id,org_dscr_1 `NAME`,org_type_id_2 pid FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}
UNION
SELECT DISTINCT org_id_2 id,org_dscr_2 `NAME`,org_id_1 pid FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}
UNION
SELECT DISTINCT org_id_3 id,org_dscr_3 `NAME`,org_id_2 pid FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}
UNION
SELECT DISTINCT org_id_4 id,org_dscr_4 `NAME`,org_id_3 pid FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}
UNION
SELECT DISTINCT org_id_5 id,org_dscr_5 `NAME`,org_id_4 pid FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}
) org_all
LEFT JOIN (SELECT org_id FROM dmcode.t_org_biz_lvl WHERE org_dept_mapping_flag = #{orgDeptMappingFlag}) w ON org_all.id = w.org_id
WHERE 1=1
AND org_all.id != org_all.pid
<if test="pid != null and pid != ''">
AND pid = #{pid}
</if>
<if test="areaId != null and areaId != ''">
AND org_all.AREA_NO_ID IN (SELECT AREA_NO_ID FROM dmcode.t_area_code WHERE (area_no_id_1 = #{areaId} OR area_no_id_2 = #{areaId} OR area_no_id = #{areaId} OR OLD_AREA_NO_ID = #{areaId} OR DISTRICT_CODE = #{areaId}))
</if>
) tt1
LEFT JOIN
(
SELECT
findcheck.org_id,findcheck.biz_type_id,tobl.ORG_TYPE_ID_1,tobl.ORG_TYPE_ID_2,tobl.ORG_ID_1,tobl.ORG_ID_2,tobl.ORG_ID_3,tobl.ORG_ID_4,tobl.ORG_ID_5,tobl.`LEVEL` FROM dmcode.t_org_biz_lvl tobl
RIGHT JOIN
(
SELECT biz_type_id, org_id FROM comm_sys.t_biz_type_org_xref WHERE biz_type_id IS NOT NULL AND biz_type_id = #{bizTypeId}
) findcheck
ON tobl.ORG_ID = findcheck.org_id
) tt2 ON
(
CASE
WHEN tt2.`LEVEL` = 1 THEN tt1.id = tt2.ORG_TYPE_ID_2
WHEN tt2.`LEVEL` = 2 THEN tt1.id = tt2.ORG_ID_1
WHEN tt2.`LEVEL` = 3 THEN tt1.id = tt2.ORG_ID_2
WHEN tt2.`LEVEL` = 4 THEN tt1.id = tt2.ORG_ID_3
WHEN tt2.`LEVEL` = 5 THEN tt1.id = tt2.ORG_ID_4
ELSE
tt1.id = tt2.ORG_ID
END
)
LEFT JOIN (SELECT org_id FROM comm_sys.t_biz_type_org_xref WHERE biz_type_id = #{bizTypeId}) tt3 ON tt1.id = tt3.org_id
ORDER BY tt1.id
</select>

treegrid -表格树异步加载的更多相关文章

  1. combotree -下拉框树异步加载

    问题: 下拉树数据比较多时,全加载会产生页面延迟,需要实现异步加载 方案: 点击事件加载:先加载部分,点击节点时再展开并追加子节点 onBeforeExpand事件:在展开树前加载,感觉这种方式比较优 ...

  2. 多线程异步加载图片async_pictures

    异步加载图片 目标:在表格中异步加载网络图片 目的: 模拟 SDWebImage 基本功能实现 理解 SDWebImage 的底层实现机制 SDWebImage 是非常著名的网络图片处理框架,目前国内 ...

  3. spring mvc easyui tree 异步加载树

    使用spring mvc 注解 异步加载一棵树 jsp: <ul id="orgInfoTree"></ul> $(function(){ loadOrgT ...

  4. 玩转Web之easyui(二)-----easy ui 异步加载生成树节点(Tree),点击树生成tab(选项卡)

    关于easy ui 异步加载生成树及点击树生成选项卡,这里直接给出代码,重点部分代码中均有注释 前台: $('#tree').tree({ url: '../servlet/School_Tree?i ...

  5. Jquery树控件ZTree异步加载

    异步加载的意思就是: 当点击展开树节点时,才去请求后台action返回点击节点的子节点数据并加载. 这里面主要设计ztree的setting变量的async属性设置: var setting = { ...

  6. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->新增“行政区域管理”,同时大批量树采用异步加载

    行政区划:简称政区,是国家为了进行分级管理而实行的区域划分.中国现行的行政区划实行如下原则:1.全国分为省.自治区.直辖市:2.省.自治区分为自治州.县.自治县.市:3.自治州分为县.自治县.市:4. ...

  7. ztree异步加载树节点

    参考文档:https://www.cnblogs.com/tenWood/p/8620708.html ztree api地址:http://www.treejs.cn/v3/api.php 说明:j ...

  8. jqxtree异步加载部门树

    整体思路 A.要想实现异步加载第一次加载的是一级部门 B.加载一级部门,如果有子部门,部门前面带+号,没有子部门,部门前面没有+号(+号也就是点击可以展开) C.在sql中实现如果有子部门默认都加载一 ...

  9. bootstrap异步加载树后样式显示问题

    整个过程: 1.先加载整个页面 2.通过jquery异步请求后台返回数据 3.循环遍历数据,拼接需要的内容 4.把拼接好的数据加载到页面中. 问题: 把拼接好的内容加载到页面后,样式显示不正确.而如果 ...

随机推荐

  1. web-ctf随机数安全

    rand() 函数在产生随机数的时候没有调用 srand(),则产生的随机数是有规律可询的. 产生的随机数可以用下面这个公式预测 : state[i] = state[i-3] + state[i-3 ...

  2. 基于 Docker 搭建 MySQL 主从复制

    本篇博文相对简单,因为是初次使用Docker,MySQL的主从复制之前也在Centos环境下搭建过,但是也忘的也差不多了,因此本次尝试在Docker中搭建. 根据网上教程走还是踩了一些坑,不过所幸最终 ...

  3. HTML5本地存储——IndexedDB

    在HTML5本地存储——Web SQL Database提到过Web SQL Database实际上已经被废弃,而HTML5的支持的本地存储实际上变成了 Web Storage(Local Stora ...

  4. Gradle Goodness: Parse Files with SimpleTemplateEngine in Copy Task

    With the copy task of Gradle we can copy files that are parsed by Groovy's SimpleTemplateEngine. Thi ...

  5. ListView的优化问题

    listview算是我们app中较为常用的控件之一了.而如何优化也是一个问题. listview的优化一般分为两类. 一布局优化. 对布局的优化是大家了解的. 1.复用convertview.andr ...

  6. 我告诉你 ,一个 window免费系统下载的网站!

    一个 window免费系统下载的网站! https://msdn.itellyou.cn/

  7. orcal 数据库 maven架构 ssh框架 的全xml环境模版 及常见异常解决

    创建maven项目后,毫不犹豫,超简单傻瓜式搞定dependencies(pom.xml 就是maven的依赖管理),这样你就有了所有你要的包 <project xmlns="http ...

  8. 清理 Xcode 10 记录

    1,清理 ~/Library/Developer/CoreSimulator/Devices 说明:该目录存放当前的所有模拟器,每个标识符代表一台机器,清理掉避免存在旧版本的模拟器缓存 执行: 关闭模 ...

  9. nodejs中npm以及yarn常用指令

    1.npm下载相关 1.npm install/i vue //下载vue的包 2.npm i vue --save-dev / -D //下载vue的包,并添加到开发依赖中 3.npm i //下载 ...

  10. JS-instanceof 与typeof

    通常来讲,使用 instanceof 就是判断一个实例是否属于某种类型 而typeof  无论引用的是什么类型的对象,它都返回 "object" var arr=[1,2,3]; ...