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;
}
}