xml报文的时候,设计人员要求按照xml中数据的tree样式进行展示,如图所示
前端的treetable的标签在easyUI中有,也曾尝试使用,因为我们用的elementUI,为保持同一性,最终放弃了easyUI中现成的treegrid标签,而elementUI是没有已经定义好的,所以大神帮忙写了一个,因为前段真的不是很熟悉,到此我也不太明白实现原理,
稍候会附上源码。
该treetable的data有一定的要求,那就是必须是层级关系明确的 就是原生的element中tree需要的格式
解析报文时可以通过递归实现构造该数据。 递归递归
但因为数据库表在设计时并未考虑到业务人员会改成该种模式,所以表中并未涉及到父子关系的标志字段,改表比较麻烦,所以改而将表中字段名,改为带路径的格式:以图中字段为例
即由原来的MsgId改为Fitoftpmtstsrpt.GrpHdr.MsgId
所以后期需要构造将字段根据名字进行层级构造
代码如下:为方便理解 代码一路到底,没有进行封装拆分
public static List<MsgNode> pathToTree(List<YmitMsgFld> flds) { List<MsgNode> tree = new ArrayList<>(); HashSet<MsgNode> set = new HashSet<>(); for (YmitMsgFld fld : flds) { String path = fld.getFldNm(); while (path.contains(".")) { // 子节点的路径和名称 int index = path.lastIndexOf("."); String name = path.substring(index + 1, path.length()); MsgNode temNode = new MsgNode(path, name); // 父节点的路径和名称 String parPaht = path.substring(0, index); int index2 = parPaht.lastIndexOf("."); String parName = parPaht.substring(index2 + 1, parPaht.length()); MsgNode parNode = new MsgNode(parPaht, parName); if (set.contains(parNode)) { Iterator<MsgNode> iterator = set.iterator(); while (iterator.hasNext()) { MsgNode tem = new MsgNode(); tem = iterator.next(); if (tem.getPath().equals(parNode.getPath())) { parNode = tem; break; } } } else { set.add(parNode); } if (set.contains(temNode)) { Iterator<MsgNode> iterator = set.iterator(); while (iterator.hasNext()) { MsgNode tem = new MsgNode(); tem = iterator.next(); if (tem.getPath().equals(temNode.getPath())) { temNode = tem; break; } } if (null != parNode.getChildren()) { if (!parNode.getChildren().contains(temNode)) { parNode.getChildren().add(temNode); } } else { List<MsgNode> children = new ArrayList<>(); children.add(temNode); parNode.setChildren(children); } } else { if (null != parNode.getChildren()) { parNode.getChildren().add(temNode); } else { List<MsgNode> children = new ArrayList<>(); children.add(temNode); parNode.setChildren(children); } set.add(temNode); } path = parPaht; } } Iterator<MsgNode> iterator = set.iterator(); while (iterator.hasNext()) { MsgNode tem = new MsgNode(); tem = iterator.next(); if (!tem.getPath().contains(".")) { tree.add(tem); } } return tree; }
package cn.com.yusys.ymit.domain; import java.io.Serializable; import java.util.List; /** * @项目名称: * @类名称: MsgNode * @类描述: * @功能描述: * @创建人: * @创建时间: 2018-05-03 10:28 * @修改备注: * @修改记录: 修改时间 修改人员 修改原因 * ------------------------------------------------------------- * @version 1.0.0 * @Copyright (c) */ public class MsgNode implements Serializable { /** * @属性名称: serialVersionUID * @属性描述: * @since 1.0.0 */ private static final long serialVersionUID = 6334350503505500989L; private String pkId; // 字段ID,自增主键 private String msgId; // 关联报文,对应报文的NODE_ID值 private String fldNm; // 报文字段名称 private String fldDesc; // 字段描述 private String fldTyp; // 字段类型 private String fldLen; // 数据长度 private String isReq; // 是否必填,1为是,0为否 private String defVal; // 默认值 private String fixVal; // 修订值 private String parNm; // 父节点名称 private String path; // 节点路径 private List<MsgNode> children = null; public MsgNode() { } public MsgNode(String path,String name) { this.path = path; this.fldNm = name; } public String getPkId() { return pkId; } public void setPkId(String pkId) { this.pkId = pkId; } public String getMsgId() { return msgId; } public void setMsgId(String msgId) { this.msgId = msgId; } public String getFldNm() { return fldNm; } public void setFldNm(String fldNm) { this.fldNm = fldNm; } public String getFldDesc() { return fldDesc; } public void setFldDesc(String fldDesc) { this.fldDesc = fldDesc; } public String getFldLen() { return fldLen; } public void setFldLen(String fldLen) { this.fldLen = fldLen; } public String getIsReq() { return isReq; } public void setIsReq(String isReq) { this.isReq = isReq; } public String getDefVal() { return defVal; } public void setDefVal(String defVal) { this.defVal = defVal; } public String getFixVal() { return fixVal; } public void setFixVal(String fixVal) { this.fixVal = fixVal; } public List<MsgNode> getChildren() { return children; } public void setChildren(List<MsgNode> children) { this.children = children; } public String getParNm() { return parNm; } public void setParNm(String parNm) { this.parNm = parNm; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getFldTyp() { return fldTyp; } public void setFldTyp(String fldTyp) { this.fldTyp = fldTyp; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((path == null) ? 0 : path.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; MsgNode other = (MsgNode) obj; if (path == null) { if (other.path != null) return false; } else if (!path.equals(other.path)) return false; return true; } }