1. 程式人生 > >java使用遞迴迭代實現流程圖展示(僅供參考)

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



相關推薦

java使用實現流程圖展示參考

本人在做專案的時候不確定流程圖展示的節點下是否還有子節點,所以才採用遞迴方式進行迴圈判斷。 1、實體類model package com.ijs.model; import java.util.List; import javax.persistence.Entity

各大android應用商店的展示權重 安卓應用商店關鍵詞+下載量+評價+其他這幾項佔的權重參考

1、360手機助手 2、應用寶 應用寶權重最高的是評論,評論方面主要從評論質量與評論數量上下手,其它方面權重值較低,對APP排名影響度不大。 3、百度手機助手 在我對你百度手機助手的排名分析中,發現關鍵詞的權重很高,下載量等其它方面對其排名影響不大。而且這個市場的官方編輯可以直

Java語言程序設計第三版第二章課後習題答案參考

[] main 是否 支付 都去 port span 時區 div 2.1 註意不同類型轉換 1 import java.util.Scanner; 2 3 public class Ch02 { 4 public static void main

[整理]二分查詢搜尋演算法原理及,方法實現

折半查詢法也稱為二分查詢法,它充分利用了元素間的次序關係,採用分治策略,可在最壞的情況下用O(log n)完成搜尋任務。 【基本思想】 將n個元素分成個數大致相同的兩半,取a[n/2]與欲查詢的x作比較,如果x=a[n/2]則找到x,演算法終止。如果x<a[n/2],

leetcode589-二叉樹-

題目:N-ary Tree Preorder Traversal前序遍歷N叉樹 遞迴解法 就是迴圈呼叫preorder函式來實現遞迴,程式碼: class Solution(object): #遞迴解法 def preorder(self, root):

演算法 動態規劃 斐波那契數列 MD

Markdown版本筆記 我的GitHub首頁 我的部落格 我的微信 我的郵箱 MyAndroidBlogs baiqiantao bai

通過去除=的base64解碼函式

base64的解碼過程中如果byte不滿足轉碼要求的話例如(二進位制資料長度需要為4的倍數),不滿足的話就要通過在資料後面補‘=’,把資料補到是4的倍數,然而‘=’是沒有任何含義的,如果我們在輸入的時候可以不考慮輸入‘=’,這就大大方便了輸入,沒有了那麼多的限制

Java基礎複習筆記--Iterator和ListIterator 器的使用遍歷集合 Java類集框架——Iterator和ListIterator 器的使用遍歷集合

Java類集框架——Iterator和ListIterator 迭代器的使用(遍歷集合) 學習目標: 掌握集合輸出的標準操作。 掌握Iterator介面的主要作用及使用注意事項。 掌握ListIterator與Iterator介面的關係及區別。

Java類集框架——Iterator和ListIterator 器的使用遍歷集合

學習目標: 掌握集合輸出的標準操作。 掌握Iterator介面的主要作用及使用注意事項。 掌握ListIterator與Iterator介面的關係及區別。 掌握ListIterator介面的使用限制。

Java學習筆記36:器遍歷for 、while

while迴圈遍歷 Collection coll = new ArrayList(); coll.add("abc1"); coll.add("abc2"); coll.add("abc3"); coll.add("abc4"); Iterator it = coll.iterator

C++通過修改字串本身auto型別說明符

以字串這種支援 for (declaration : expression) statement 這樣for語句迭代的資料結構為例,我們看看auto關鍵字在型別推斷中的作用。 string s = "I LOVE YOU!"; for (char ch : s){ cout <&

-斐波納挈數列不死神兔

1.遞迴,指在當前方法內呼叫自己的這種現象 public void method(){ System.out.println(“遞迴的演示”); //在當前方法內呼叫自己 method(); }

5.函式--進位制轉換十進位制轉二進位制

2727: 遞迴函式--進位制轉換(十進位制轉二進位制) Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 791  Solved: 328 [Subm

2727: 函式--進位制轉換十進位制轉二進位制

輸入一個非負整數(十進位制),呼叫遞迴函式輸出此整數對應的二進位制數。函式宣告如下:void conversion(int n); //將n轉換為二進位制輸出的遞迴函式宣告在以下程式的基礎上,新增conversion函式的定義,使程式能夠正確執行。 提交時,只需要提交conversion函式的定義程式碼即可。

資料結構--非遍歷二叉樹利用輔助棧

#include "StdAfx.h" #include <stdio.h> #include <stdlib.h> /*非遞迴方法前序遍歷二叉樹,利用輔助棧(指標陣列實現)。由於對指標不是很熟悉,程式碼較為混亂,基本上實現遍歷的功能。

使用python實現使用者註冊邏輯參考(flask框架實現)

1.基本的註冊邏輯實現 2.這裡程式碼給的是使用者進入頁面,已經輸入了圖片驗證碼,由於前面程式碼邏輯比較簡單,程式碼就不上了,邏輯上來說就是使用者進入註冊頁面,輸入手機號碼,輸入圖片驗證碼,前端生成驗證碼唯一編碼,通常使用uuid,通用唯一識別符號,或者使用Linux時間戳向後臺後臺請求驗證碼圖

【演算法】二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的實現記錄Java

        本文總結了刷LeetCode過程中,有關樹的遍歷的相關程式碼實現,包括了二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現。這也是解決樹的遍歷問題的固定套路。 一、二叉樹的先序、中序、後序遍歷  1、遞迴模板  (1)

二、(3)二叉樹的後序遍歷(實現實現)

二叉樹本來是分層結構,但若施加某種約束(如遍歷),則可以轉變成線性結構。 二叉樹的遍歷方法主要有:前序遍歷(DLR),中序遍歷(LDR),後序遍歷(LRD),層次遍歷。本文主要介紹二叉樹後序遍歷方法,其中包括了遞迴和迭代兩種實現方式。 後序遍歷:左子樹->右子樹->根節點(根

二、(2)二叉樹的中序遍歷(實現實現)

二叉樹本來是分層結構,但若施加某種約束(如遍歷),則可以轉變成線性結構。 二叉樹的遍歷方法主要有:前序遍歷(DLR),中序遍歷(LDR),後序遍歷(LRD),層次遍歷。本文主要介紹二叉樹中序遍歷方法,其中包括了遞迴和迭代兩種實現方式。 中序遍歷:左子樹->根節點->右子樹(根

二、(1)二叉樹的先序遍歷(實現實現)

二叉樹本來是分層結構,但若施加某種約束(如遍歷),則可以轉變成線性結構。 二叉樹的遍歷方法主要有:前序遍歷(DLR),中序遍歷(LDR),後序遍歷(LRD),層次遍歷。本文主要介紹二叉樹前序遍歷方法,其中包括了遞迴和迭代兩種實現方式。 前序遍歷:根節點->左子樹->右子樹(根