java使用遞迴迭代實現流程圖展示(僅供參考)

來源:互聯網
上載者:User

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

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





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.