您的位置:首页 > 编程语言 > Java开发

java使用递归迭代实现流程图展示(仅供参考)

2016-11-04 15:29 375 查看
本人在做项目的时候不确定流程图展示的节点下是否还有子节点,所以才采用递归方式进行循环判断。

1、实体类model

package com.ijs.model;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;

/**
* ProcessPoint entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "process_point")
public class ProcessPoint extends AbstractProcessPoint implements
java.io.Serializable {
//用于存放子节点
private List<ProcessPoint> childrenProcessPoint;
// Constructors

/** default constructor */
public ProcessPoint() {
}

/** minimal constructor */
public ProcessPoint(String id) {
super(id);
}

/** full constructor */
public ProcessPoint(String id, String processId, String code, String name,
Integer ownerRole, Integer owner, Integer status, Integer ppOrd,
Integer ppType, String ppDesc, String pid, Integer ppLogic,
String ppLogicWith) {
super(id, processId, code, name, ownerRole, owner, status, ppOrd,
ppType, ppDesc, pid, ppLogic, ppLogicWith);
}
@Transient
public List<ProcessPoint> getChildrenProcessPoint() {
return childrenProcessPoint;
}

public void setChildrenProcessPoint(List<ProcessPoint> childrenProcessPoint) {
this.childrenProcessPoint = childrenProcessPoint;
}

}

2、业务逻辑层Service

package com.ijs.service;

import java.util.List;

import com.ijs.model.ProcessPoint;

public interface ProcessPointServ {
/**
* 获取所有的节点信息进行递归迭代使用
* @return
*/
public List<ProcessPoint> getProcessPoints();
/**
* 根据当前节点信息id查询该流程节点信息下是否还有子节点信息
* @param pid
* @return
*/
public List<ProcessPoint> findByPid(String pid);
}
3.业务逻辑层实现ServiceImpl

package com.ijs.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.ijs.dao.GenericDao;
import com.ijs.model.ProcessPoint;
import com.ijs.service.ProcessPointServ;
import com.ijs.service.ProjectServ;

@Service("processPointServ")
public class ProcessPointServImpl implements ProcessPointServ {

@Resource
private GenericDao genericDao;

public List<ProcessPoint> getProcessPoints() {
StringBuffer jpql = new StringBuffer();
jpql.append(" from ProcessPoint p where 1=1");
jpql.append(" and p.status = 1 ");
jpql.append(" order by -p.code desc");
List<ProcessPoint> processPoints = this.genericDao.find(jpql.toString());
return processPoints.size()==0?null:processPoints;
}

@Override
public List<ProcessPoint> findByPid(String pid) {
if(pid!=null){
StringBuffer jpql = new StringBuffer();
jpql.append(" from ProcessPoint p where 1=1");
jpql.append(" and p.status = 1 and p.pid='"+pid+"'");
jpql.append(" order by p.ppOrd");
List<ProcessPoint> processPoints = this.genericDao.find(jpql.toString());
return processPoints.size()==0?null:processPoints;
}
return null;
}

}
4、控制器层Controller

package com.ijs.control;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.ijs.model.ProcessPoint;
import com.ijs.service.ProcessPointServ;

@Controller
@RequestMapping("/processpoint")
public class ProcessPointControl {
@Resource(name="processPointServ")
private ProcessPointServ processPointServ;
/**
* 查看项目流程图
* @param processPoint
* @return
*/
@RequestMapping(value="/showprocesspoint",method = RequestMethod.POST)
public @ResponseBody ProcessPoint showProcessPoint(@ModelAttribute ProcessPoint processPoint){
try {
//处理好的流程图节点集合对象
List<ProcessPoint> processPoints =this.getProcessPoints(this.processPointServ.getProcessPoints());
if(processPoints!=null){
//将处理好的流程图节点集合对象赋值对象的子节点集合属性(private List<ProcessPoint> childrenProcessPoint;),方便页面通过该对象取出数据进行迭代显示
processPoint.setChildrenProcessPoint(processPoints);
}
} catch (Exception e) {
e.printStackTrace();
}
return processPoint;
}
/**
* 处理查询出所有流程图节点信息进行相应的处理
* @param processPoints
* @return
*/
private List<ProcessPoint> getProcessPoints(List<ProcessPoint> processPoints){
//声明一个新的集合对象进行接收,存放新的节点信息,循环迭代判断该节点下是否有子节点信息,如有进行添加
List<ProcessPoint> ps=null;
if(processPoints!=null){
ps=new ArrayList<ProcessPoint>();
for (ProcessPoint p: processPoints) {
//找到一级节点,从一级节点开始寻找
if(p.getPid().equals("0")){
//调用递归方法,判断是否有子节点,有就进行添加
this.addIfHasChildren(p);
//将迭代完、判断完的节点存入新的节点集合
ps.add(p);
}
}
}
//返回新的节点集合
return ps;
}
/**
* 递归判断当前节点对象是否还有子节点,有就进行添加
* @param p
*/
private void addIfHasChildren(ProcessPoint p) {
//根据当前节点信息id查询该流程节点信息下是否还有子节点信息
List<ProcessPoint> processPoints=this.processPointServ.findByPid(p.getId());
//判断集合是否有数据,processPoints.size()>2这里是方便排序并列展示的节点使用,集合必须两个对象才能进行比较然后排序
if(processPoints!=null && processPoints.size()>2){
//排序集合并列展示的数据的位置  2.1  2.2  2.3(见下数据库数据结构)
sortListByCode(processPoints);
}
//集合不为空,将数据进行添加
p.setChildrenProcessPoint(processPoints);
//判断集合是否有数据
if(p.getChildrenProcessPoint()!=null){
for(ProcessPoint pc:p.getChildrenProcessPoint()){
//根据当前节点信息id查询该流程节点信息下是否还有子节点信息
List<ProcessPoint> pc2=this.processPointServ.findByPid(pc.getId());
if(pc2!=null && pc2.size()>2){
//排序节点
sortListByCode(pc2);
}
//添加节点对象
pc.setChildrenProcessPoint(pc2);
//调用自己
this.addIfHasChildren(pc);
}
}
}
/**
* 排序流程菜单节点
* 根据节点的Code排序
* @param processes
*/
private void sortListByCode(List<ProcessPoint> processPoints){
Collections.sort(processPoints, new Comparator<ProcessPoint>() {
@Override
public int compare(ProcessPoint o1, ProcessPoint o2) {
float code1=Float.parseFloat(o1.getCode());
float code2=Float.parseFloat(o2.getCode());
if(code1>code2) return 1;
else if(code1==code2) return 0;
else return -1;
}
});
}
}
5、javaScript进行数据的也采用了递归进行相应的处理
//这里大家可以使用$.ajax取得数据后再这里进行迭代展示
ProcessPoint.findProcessPoint(null,function(data){
//用于拼接字符串在页面展示
var str="<ul>";
str+="<li><a href='javascript:;' class='am-badge-secondary'>"+data.childrenProcessPoint[0].name+"</a>";
str+="<ul>";
//直接取到一级节点下的子节点进行迭代
var pp=data.childrenProcessPoint[0].childrenProcessPoint;
for(var i=0;i<pp.length;i++){
var o=pp[i];
str+="<li><a href='javascript:;' class='am-badge-secondary'>"+o.name+"</a>";
//递归调用,判断该节点下是否有子节点
hansChildren(o);
str+="</li>";
}
str+="</ul>";
str+="<div class='arrow'></div>";
str+="</li></ul>";
//页面展示流程图div
$(el).find(".tree").html(str);
//递归方法 判断该节点下是否有子节点
function hansChildren(o){
if(o.childrenProcessPoint!=undefined){
if(o.childrenProcessPoint.length>0){
str+="<ul>";
for(var j=0;j<o.childrenProcessPoint.length;j++){
var pc=o.childrenProcessPoint[j];
str+="<li><a href='javascript:;' class='am-badge-secondary'>"+pc.name+"</a>";
//递归调用
hansChildren(pc);
}
str+="</li></ul>";
str+="<div class='arrow'></div>";
}
}
}
});

6、jsp页面

<div class="add-form clearfix">
<h2>项目进度流程</h2>
<div class="am-form-group am-u-sm-12 am-u-md-7" style="background-color:#CDCDCD;">
<label for="doc-ipt-1" class="am-u-sm-30 am-form-label">
查询当前进度流程,不同颜色模块使用不同的方式处理。
</label>
</div>

</div>
<div class="tree-box pr">
<div class="terr-cart pa">
<input type="hidden" id="project_id" value="<%=this.id%>">
<ul>
<li><span class="am-badge-secondary am-round"></span>已经完成</li>
<li><span class="am-badge-success am-round"></span>进行中</li>
<li><span class="am-badge-default am-round"></span>未开始</li>
<li><span class="am-badge-danger am-round"></span>需要我处理的</li>
</ul>

</div>
<div class="tree"></div>
</div>

7、数据库数据图片



8、流程图展示



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  递归 迭代