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

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

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、流程图展示





  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值