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 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使用递归迭代实现流程图展示(仅供参考)相关推荐
- 【java】 ssm+ssh原生态框架(仅供参考)
以前刚学框架的时候自己搭建的两个框架,一个是Struts2+Spring+Hibernate-(SSH),还有一个就是Spirng+SpringMVC+Mybatise-(SSM), 其中SSH项目中 ...
- 2019年7月份,阿里最新Java高频面试真题汇总,仅供参考
来自:网络 目录 技术一面(23问) 技术二面(3大块) JAVA开发技术面试中可能问到的问题(17问) JAVA方向技术考察点(33快) 项目实战(7大块) 必会知识(48点) 面试小技巧 注意事项 ...
- JAVA后端开发必备软件(仅供参考)
更新一些个人JAVA开发日常会用到的一些工具,只是为了自己可能会换电脑,或者为新手做一些推荐,日后可能会更新相应软件的安装指南,以及一些安装包资源 idea或者eclipse等编程工具 Visio画流 ...
- 第十四届蓝桥杯校内模拟赛第二期-Java个人题解(仅供参考)
刚刚结束第十四届蓝桥杯校内模拟赛第二期,在这记录下自己的代码 不保证正确! 不保证正确! 不保证正确! 有问题一起改正!! 题解 2048 代码: package _14届模拟2;public cla ...
- Java(面试题准备(非技术面)(仅供参考))
Java(面试题准备(非技术面)(仅供参考)) 1. 请介绍一下你自己? 姓名.年龄.毕业学校- 突出积极的个性和做事的能力 要有礼貌 2. 你觉得你个性上最大的优点是什么? 乐于助人.关心他人.有一 ...
- 地址解析(仅供参考与学习)<Java>
地址解析步骤如下: 1.检查是否存在省份 2.如果存在省份,将会检查省份是否明确标注省,自治区,市(直辖市),特别行政区的关键字,如果不存在,将会自动拼接上,便于后边正则匹配 3.检查市级地区是否明确 ...
- 大数据练习题答案(仅供参考)
上一篇练习题的答案,题目里带括号的都是批注,如果看的不清楚,可以去我的资源下载(资源里批注清楚,都是红色批出来的) 一.选择题 Hadoop作者 ( C ) A.Martin Fowler B.Ken ...
- Git分支管理办法,每个团队不一样,仅供参考!
原创不易,转载注明出处,喜欢就点个赞吧! 网上有很多文章,很少有实际具体的流程图说明,我根据我们团队的情况,画了几张简图,仅供参考. 每个公司的代码管理方式都不一样 主要有两种 1.TrunkBase ...
- 学堂在线《工程伦理》第八章课后习题及答案(仅供参考)
学堂在线<工程伦理>第九章课后习题及答案(仅供参考) 学堂在线<工程伦理>第十章课后习题及答案(仅供参考) 学堂在线<工程伦理>第十一章课后习题及答案(仅供参考) ...
最新文章
- php内存缓存设计,求选择哪个缓存设计好一些?
- rust 案例_理解Rust的引用与借用
- Java Review - 线程池中使用ThreadLocal不当导致的内存泄漏案例源码分析
- 【随笔】卷积神经网络中的卷积怎么卷?
- matlab swt函数,matlab swt 函数出错
- python爬取豆瓣电影信息数据
- php with openssl directory,为php打扩展openssl 详细步骤
- 【lr12安装】安装过程中.netframe安装不上,报错0x800F081F
- 电脑病毒及其防治策略
- C语言开关读程序,手把手教你学单片机的C语言程序设计(十)开关语句和循环语句.pdf...
- i3wm中Chrome不保存密码
- 日立mCA连接服务器显示地址异常,日立电梯Mca的故障代码是什么
- ViewPager2撸个3D画廊
- leecode第一百七十四题(地下城游戏)
- 架构搜索文献笔记(8):《FTT-NAS:发现容错神经结构》
- 商标图形也会侵权?商标侵权如何界定?
- 计算机类非全日制研究生
- 什么是物联网安全,为什么它很重要?
- python 矩阵类型转换_Python 矩阵转置的几种方法小结
- 有时候,人生需要坚持
热门文章
- 【OP-TEE】 TA的签名与验签 基于optee 3.11
- python如何将bin转换成文字_如何用python把任意文件转换为“1010”样子的文本
- DesignPattern - 工厂模式【创建型】
- 查询最近电脑都访问过哪些文件
- Unreal Engine 4 系列教程 Part 9:AI教程
- Linux 环境下NFS挂载
- 古诗词模板html,诗词鉴赏万能模板
- DialogInterface内存泄露 anonymous class implements android.content.DialogInterfaces$OnClickListener...
- python 梯度提升树_梯度提升方法(Gradient Boosting)算法案例
- 二分查找算法(c++)