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

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 implementsjava.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);}@Transientpublic 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 {@Resourceprivate 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;}@Overridepublic 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>() {@Overridepublic 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、流程图展示

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

  1. 【java】 ssm+ssh原生态框架(仅供参考)

    以前刚学框架的时候自己搭建的两个框架,一个是Struts2+Spring+Hibernate-(SSH),还有一个就是Spirng+SpringMVC+Mybatise-(SSM), 其中SSH项目中 ...

  2. 2019年7月份,阿里最新Java高频面试真题汇总,仅供参考

    来自:网络 目录 技术一面(23问) 技术二面(3大块) JAVA开发技术面试中可能问到的问题(17问) JAVA方向技术考察点(33快) 项目实战(7大块) 必会知识(48点) 面试小技巧 注意事项 ...

  3. JAVA后端开发必备软件(仅供参考)

    更新一些个人JAVA开发日常会用到的一些工具,只是为了自己可能会换电脑,或者为新手做一些推荐,日后可能会更新相应软件的安装指南,以及一些安装包资源 idea或者eclipse等编程工具 Visio画流 ...

  4. 第十四届蓝桥杯校内模拟赛第二期-Java个人题解(仅供参考)

    刚刚结束第十四届蓝桥杯校内模拟赛第二期,在这记录下自己的代码 不保证正确! 不保证正确! 不保证正确! 有问题一起改正!! 题解 2048 代码: package _14届模拟2;public cla ...

  5. Java(面试题准备(非技术面)(仅供参考))

    Java(面试题准备(非技术面)(仅供参考)) 1. 请介绍一下你自己? 姓名.年龄.毕业学校- 突出积极的个性和做事的能力 要有礼貌 2. 你觉得你个性上最大的优点是什么? 乐于助人.关心他人.有一 ...

  6. 地址解析(仅供参考与学习)<Java>

    地址解析步骤如下: 1.检查是否存在省份 2.如果存在省份,将会检查省份是否明确标注省,自治区,市(直辖市),特别行政区的关键字,如果不存在,将会自动拼接上,便于后边正则匹配 3.检查市级地区是否明确 ...

  7. 大数据练习题答案(仅供参考)

    上一篇练习题的答案,题目里带括号的都是批注,如果看的不清楚,可以去我的资源下载(资源里批注清楚,都是红色批出来的) 一.选择题 Hadoop作者 ( C ) A.Martin Fowler B.Ken ...

  8. Git分支管理办法,每个团队不一样,仅供参考!

    原创不易,转载注明出处,喜欢就点个赞吧! 网上有很多文章,很少有实际具体的流程图说明,我根据我们团队的情况,画了几张简图,仅供参考. 每个公司的代码管理方式都不一样 主要有两种 1.TrunkBase ...

  9. 学堂在线《工程伦理》第八章课后习题及答案(仅供参考)

    学堂在线<工程伦理>第九章课后习题及答案(仅供参考) 学堂在线<工程伦理>第十章课后习题及答案(仅供参考) 学堂在线<工程伦理>第十一章课后习题及答案(仅供参考) ...

最新文章

  1. php内存缓存设计,求选择哪个缓存设计好一些?
  2. rust 案例_理解Rust的引用与借用
  3. Java Review - 线程池中使用ThreadLocal不当导致的内存泄漏案例源码分析
  4. 【随笔】卷积神经网络中的卷积怎么卷?
  5. matlab swt函数,matlab swt 函数出错
  6. python爬取豆瓣电影信息数据
  7. php with openssl directory,为php打扩展openssl 详细步骤
  8. 【lr12安装】安装过程中.netframe安装不上,报错0x800F081F
  9. 电脑病毒及其防治策略
  10. C语言开关读程序,手把手教你学单片机的C语言程序设计(十)开关语句和循环语句.pdf...
  11. i3wm中Chrome不保存密码
  12. 日立mCA连接服务器显示地址异常,日立电梯Mca的故障代码是什么
  13. ViewPager2撸个3D画廊
  14. leecode第一百七十四题(地下城游戏)
  15. 架构搜索文献笔记(8):《FTT-NAS:发现容错神经结构》
  16. 商标图形也会侵权?商标侵权如何界定?
  17. 计算机类非全日制研究生
  18. 什么是物联网安全,为什么它很重要?
  19. python 矩阵类型转换_Python 矩阵转置的几种方法小结
  20. 有时候,人生需要坚持

热门文章

  1. 【OP-TEE】 TA的签名与验签 基于optee 3.11
  2. python如何将bin转换成文字_如何用python把任意文件转换为“1010”样子的文本
  3. DesignPattern - 工厂模式【创建型】
  4. 查询最近电脑都访问过哪些文件
  5. Unreal Engine 4 系列教程 Part 9:AI教程
  6. Linux 环境下NFS挂载
  7. 古诗词模板html,诗词鉴赏万能模板
  8. DialogInterface内存泄露 anonymous class implements android.content.DialogInterfaces$OnClickListener...
  9. python 梯度提升树_梯度提升方法(Gradient Boosting)算法案例
  10. 二分查找算法(c++)