62. 现在开始做分销商这一块的功能,主要有一个树形的功能。这个树形结构功能我们做得不是很好,不太灵活 ,关于这个树形结构有一些组件,做的比较好。在这个项目里不使用。
63. 先来看一下,树的几种设计方式:
1,不带冗余字段,id,pid 一般使用id,pid已经足够了。但是这种方式在
遍的时候有一个效率的问题,因为我要看一下下面有没有结点。
2, 带冗余字段 id,pid,isleaf,childrencount 这种方式:通常引入一个看它是不是叶子,我也可以加入他有多少孩子。这样我容易算出来 ,我拿到这个字段一看,下面有多少孩子我知道了。而没有必要每次算,
3, 采用固定的字符串,00 01 001 0001
1. 00所有分销商
2. 01华北区
3. 001北京市
4. 0001北京医药股份有限公司
64. 再来看一下这张分销商信息的表,这个一个自连接,在这里有一个pid,pid里面的值全部来源于id,
65. 分销商在这棵树形结构上都 是平等的。比如说北京市下面有北京医药股份有限公司,这可能是一级分销商,如果还有一个二级分销商也是在北京市下面,不会在北京医药股份有限公司下面还显示二级。
66. 我们分销商要属于一个区域,华北区,北京市,这些都是区域,区域下面挂了分销商,我们的设计是这样的,就放在一张表里面,这张表里面既放了区域又放了分销商,以前 提到过,这样不太好,冗余量太大,因为假如说是区域的话,它有名称,id,pid,那级别,分销商代码,其它的都没有,那么就都冗余了, 另外还有一个终端客户表,里面也有一个树形结构要做,其实和分销商差不多,那么在终端客户里面你又会重复写区域相关的记录,如北京 ,,,,,,当时 说过最好是把树形结构区域抽出来。区域是一个树形结构,分销商只属于它,所以单独建一张分销商表,再抽一个区域这样会好点。分销商,终端都不是树形结构,只要把这两个往上挂就可以了。区域是一个树形结构,但是我们没有采用这种方式,就放一张表里面,因为放一张表里面,大家要处理一些事情,有点麻烦,为了给大家增加一点难度,左连接,右连接,
/**
* 得到顶级目录
* @param regionColumnId
* @return
*/
public int getMyTopRegionColumnId(int regionColumnId){
RegionColumn regionColumn = getBeanById(regionColumnId);
if(regionColumn.getParentId() == 0){
return regionColumn.getRegionColumnId();
} else {
return getMyTopRegionColumnId(regionColumn.getParentId());
}
}
/** 得到栏目树 **/
public String getCateTree(String tree, int rootColumnId,int regionId) {
RegionColumn rootBean = regionColumnDAO.getBeanById(rootColumnId);
StringBuffer treeStrBuf = new StringBuffer();
if (rootBean != null) {
treeStrBuf.append(tree + ".add(");
treeStrBuf.append(rootColumnId);
treeStrBuf.append(",-1,");
treeStrBuf.append("\"<span οnclick=showLoad(" + rootColumnId + ",'"
+ rootBean.getName() + "')>" + rootBean.getName()
+ "</span>\",");
treeStrBuf.append("'/admin/article/list.htm?cata_id=" + rootColumnId
+ "',");
treeStrBuf.append("''," + "'body_iframe');\r\n");
List<RegionColumn> subList = getSubCategory(rootColumnId, 0, regionId);
if (subList != null && subList.size() > 0) {
dumpCatalogTree(tree, subList, treeStrBuf, rootColumnId,regionId);
}
}
return treeStrBuf.toString();
}
public String getCateTree(String tree, int regionId){
return this.getCateTree(tree, 0, regionId);
}
/** 递归得到树 **/
private void dumpCatalogTree(String tree, List<RegionColumn> lisBean,
StringBuffer treeStrBuf, int parentId,int regionId) {
for (RegionColumn bean : lisBean) {
treeStrBuf.append(tree + ".add(");
treeStrBuf.append(bean.getRegionColumnId());
treeStrBuf.append("," + parentId + ",");
treeStrBuf.append("\"<span οnclick=showLoad("
+ bean.getRegionColumnId() + ",'" + bean.getName() + "')>"
+ bean.getName() + "</span>\",");
if (bean.getIdentifier() != null
&& bean.getIdentifier().equals("qzz"))
treeStrBuf.append("'/admin/article/getResumeByRegionId.htm',");
else if (bean.getIdentifier() != null
&& bean.getIdentifier().equals("zpr"))
treeStrBuf.append("'/admin/article/getEmployByRegionId.htm',");
else
treeStrBuf.append("'/admin/article/list.htm?cata_id="
+ bean.getRegionColumnId() + "',");
treeStrBuf.append("''," + "'body_iframe','','',false);\r\n");
List<RegionColumn> subList = getSubCategory(bean
.getRegionColumnId(), 0,regionId);
if (subList != null && subList.size() > 0) {
dumpCatalogTree(tree, subList, treeStrBuf, bean
.getRegionColumnId(),regionId);
}
}
}
public RegionColumn getRegionColumn(int id) {
return regionColumnDAO.getBeanById(id);
}
public List<RegionColumn> getSubCategory(int cataId, int rootCloumnId,int regionId) {
return regionColumnDAO.getSubCategory(cataId, rootCloumnId,regionId);
}
public int getTopRegionColumnId(int cata_id) {
return regionColumnDAO.getTopRegionColumnId(cata_id);
}