本人在做項目的時候不確定流程圖展示的節點下是否還有子節點,所以才採用遞迴方式進行迴圈判斷。
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、流程圖展示