今天碰到一个需求,ztree二级菜单有查询条件,ztree一级菜单没有查询条件,一般情况下查询条件都是先取一级菜单,再取二级菜单,但是一级菜单没有查询条件,会多取了一些不应该有的记录,所以这种情况下,只能实行倒推查询,先查二级菜单,得到的结果作为条件去查一级菜单,代码如下:
/*** * 获取模型树 * @param id * @return */ public List<ZTreeNode> getModelTree(String id, String userId) { StringBuffer sql1 = new StringBuffer(); sql1.append(" select ") .append(" a.tplakey,") .append(" a.tplaname,") .append(" a.tplacatecd,") .append(" a.DISPSEQ as seq") .append(" from PISS_tp_bas_inf as a") .append(" where a.tplastat = '1' and modeltype = 1"); sql1.append(" order by seq"); List<ZTreeNode> zTreeNodes1 = jdbcTemplate.query(sql1.toString(), new RowMapper<ZTreeNode>(){ public ZTreeNode mapRow(ResultSet rs, int rowNum)throws SQLException{ String tplacatecd = rs.getString("tplacatecd"); Integer seq=rs.getInt("seq"); ZTreeNode zTreeNode1 = new ZTreeNode(); zTreeNode1.setId(rs.getString("tplakey")); zTreeNode1.setName(rs.getString("tplaname")); zTreeNode1.setIsParent(false); zTreeNode1.setParentId("F_"+(StringUtil.isNull(tplacatecd) ? "1":tplacatecd)); zTreeNode1.setIndex(seq); zTreeNode1.settId(tplacatecd); return zTreeNode1; } }); String ids = ""; if(!zTreeNodes1.isEmpty()){ for(int i=0; i<zTreeNodes1.size(); i++){ String tplacatecd = zTreeNodes1.get(i).gettId(); ids += "'"+tplacatecd+"'"+","; } ids = ids.substring(0, ids.length()-1); }else{ ids = "''"; } StringBuffer sql = new StringBuffer(); sql.append(" select ") .append(" b.id as flodid,") .append(" b.name as flodname,") .append(" b.p_folder_id as pid,") .append(" b.seq as seq") .append(" from PISS_tp_folder as b " + " where ISENABLE='1' and id in (" +ids+")"+ " order by seq"); List<ZTreeNode> zTreeNodes = jdbcTemplate.query(sql.toString(), new RowMapper<ZTreeNode>(){ public ZTreeNode mapRow(ResultSet rs, int rowNum) throws SQLException { String flodid = rs.getString("flodid"); String flodname = rs.getString("flodname"); Integer seq=rs.getInt("seq"); ZTreeNode zTreeNode=new ZTreeNode(); zTreeNode.setId("F_"+flodid); zTreeNode.setName(flodname); zTreeNode.setIsParent(true); zTreeNode.setParentId("F_"+rs.getString("pid")); zTreeNode.setIndex(seq); return zTreeNode; } }); List<ZTreeNode> nodes = new ArrayList<ZTreeNode>(); nodes.addAll(zTreeNodes); nodes.addAll(zTreeNodes1); return nodes; }
页面的代码如下:
var rule_tree = new FAPUI.Tree({ border:false, tbar:false, ttbar:false, filterAble:false, setting : { async : { enable: true,//设置 zTree 是否开启异步加载模式 url: path+'/emphasisCompanyController/getModelTree', autoParam : ['id']//异步加载时需要自动提交父节点属性的参数。[setting.async.enable = true 时生效] }, data:{ key: { name: "name" //设置树节点的name,节点参数name必须和它匹配 }, simpleData: { enable: true, //开启树的层级结构 idKey: "id", //设置树节点id,节点参数id必须与之匹配 节点数据中保存唯一标识的属性名称。[setting.data.simpleData.enable = true 时生效] pIdKey: "parentId" //设置pid,节电参数pid必须与之匹配 节点数据中保存其父节点唯一标识的属性名称。[setting.data.simpleData.enable = true 时生效] } }, check : { enable : true,//设置 zTree 的节点上是否显示 checkbox / radio chkStyle : "checkbox",//勾选框类型(checkbox 或 radio)[setting.check.enable = true 时生效] chkboxType: { "Y": "ps", "N": "ps" }//勾选 checkbox 对于父子节点的关联关系。 }, callback: { beforeCheck: function(treeId, treeNode) { return !isTreeCheckDisable; } } } });
这样就可以了