<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          使用Camunda流程引擎開發(fā),產(chǎn)品提出根據(jù)流程節(jié)點篩選數(shù)據(jù)需求,...

          共 4583字,需瀏覽 10分鐘

           ·

          2022-02-20 09:57

          a1a05eeb9834b5d350fef7ce6c339f14.webp
          在用Camunda流程引擎做業(yè)務(wù)開發(fā),遇到了各種各樣的需求,我扣掉了十根頭發(fā),看了很多的星星。今天產(chǎn)品經(jīng)理不知道吃了什么大米,來到的的位置,說:周周同學(xué),我發(fā)現(xiàn)了一個很棒的需求,你要不要聽一聽?
          看著產(chǎn)品經(jīng)理一臉壞笑,正要拒絕,產(chǎn)品經(jīng)理繼續(xù)說道:在流程列表頁面,增加一個根據(jù)流程節(jié)點的篩選條件,這樣用戶查詢的時候是不是更加精準(zhǔn)了,我們的系統(tǒng)是不是又完美了很多。我剛要張嘴,產(chǎn)品經(jīng)理電話響了,是客戶的電話。我在一旁就聽產(chǎn)品經(jīng)理吧啦吧啦,大約10分鐘過后。產(chǎn)品經(jīng)理說:剛剛給客戶介紹了這個需求,客戶非常滿意,你今天做好,明天測試,后天就更新到客戶系統(tǒng)。說完拍拍我的肩膀,頭也不回地走了。看著產(chǎn)品經(jīng)理越來越小的背影,感覺腦后吹過一陣涼風(fēng)。我是誰,我在哪里,我要做什么……經(jīng)過一番思緒整理,不就是增加一個流程節(jié)點的列表接口嗎?我做還不行嘛,就這樣我又……思路整理:


          1. 根據(jù)流程實例ID,獲取流程實例 ? ?根據(jù)流程實例ID,取到定義流程的XML
          2. 解析流程實例 ? 把XML中的userTask節(jié)點解析
          3. 返回列表數(shù)據(jù) ? 把解析出來的節(jié)點信息(節(jié)點ID,節(jié)點名字)組裝到LIST返給前端 ? ? ? ? ?
          OK,也不是很難嗎?于是我開始查表,獲取到定義流程的XML字符串,完成解析,并返給前端。一頓猛如虎的操作之后,功能完成了。一測試,發(fā)現(xiàn)接口響應(yīng)有點慢,但能接受!(能不慢嘛,又是查表,又是解析XML,一個接口做了這么多的事情。)雖然功能了,但看著數(shù)百行的代碼,我真的亂了!能不能有更好的方法,我思考著……!!6699bb5d881bf4764ebed9dc1adb9542.webp
          翻看了 Camunda 源碼,發(fā)現(xiàn)真的可以優(yōu)化,接著有了下面的代碼:
          返回給前端的節(jié)點數(shù)據(jù)實體:
          package com.bpm.camunda.vo;import lombok.Data;@Datapublic class ActivityNodeVO {    // 節(jié)點ID    private String activityId;    // 節(jié)點名字    private String activityName;}

          ??接口層:
          @ApiOperation("獲取流程用戶任務(wù)節(jié)點信息")@GetMapping("/getActivityNodeList")@ApiImplicitParam(name = "procId", value = "流程實例Id", required = true)public ResponseStatusDto> getActivityNodeList(String procId){    if(StringUtils.isBlank(procId)){        return ResponseStatusDto.failure("流程實例ID不能為空");    }    return ResponseStatusDto.success(workflowTaskService.getActivityNodeList(procId));}


          服務(wù)層:
          @Overridepublic List getActivityNodeList(String procId) {    List activityNodeVOList = new ArrayList<>();    if(StringUtils.isBlank(procId)){        return activityNodeVOList;    }    HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procId).singleResult();    if(ObjectUtils.isEmpty(historicProcessInstance)){        return activityNodeVOList;    }    BpmnModelInstance bpmnModelInstance = repositoryService.getBpmnModelInstance(historicProcessInstance.getProcessDefinitionId());    if(ObjectUtils.isEmpty(bpmnModelInstance)){        return activityNodeVOList;    }    List domElementList = bpmnModelInstance.getDocument().getRootElement().getChildElements();    if(ObjectUtils.isEmpty(domElementList)){        return activityNodeVOList;    }    DomElement domElement = domElementList.stream().filter(it -> "process".equals(it.getLocalName())).findFirst().orElse(null);    if(ObjectUtils.isEmpty(domElement)){        return activityNodeVOList;    }    activityNodeVOList.addAll(ActivityNodeUtils.createActivityNodeBySubProcessElement(domElement));    return activityNodeVOList;}


          涉及到的工具類:
          package com.bpm.utils;import com.bpm.camunda.vo.ActivityNodeVO;import org.camunda.bpm.engine.runtime.ActivityInstance;import org.camunda.bpm.model.xml.instance.DomElement;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Set;public class ActivityNodeUtils {    protected static ActivityNodeVO createActivityNodeByTaskElement(DomElement e){        ActivityNodeVO activityNodeVO = new ActivityNodeVO();        activityNodeVO.setActivityId(e.getAttribute("id"));        activityNodeVO.setActivityName(e.getAttribute("name"));        return activityNodeVO;    }    protected static Set getNodeByActivityInstance(ActivityInstance activityInstance){        if(activityInstance == null){            return new HashSet<>();        }        Set activityNodeVOSet = new HashSet<>();        ActivityNodeVO activityNodeVO = new ActivityNodeVO();        activityNodeVO.setActivityId(activityInstance.getActivityId());        activityNodeVO.setActivityName(activityInstance.getActivityName());        activityNodeVOSet.add(activityNodeVO);        if(ObjectUtils.isNotEmpty(activityInstance.getChildActivityInstances())){            for (ActivityInstance instance : activityInstance.getChildActivityInstances()){                getNodeByActivityInstance(instance);            }        }        return activityNodeVOSet;    }    public static List createActivityNodeBySubProcessElement(DomElement e){        List activityNodeVOList = new ArrayList<>();        e.getChildElements().stream()                .filter(it -> "userTask".equals(it.getLocalName()) || "subProcess".equals(it.getLocalName()))                .forEach(item ->{                    switch (item.getLocalName()){                        case "userTask":                            activityNodeVOList.add(createActivityNodeByTaskElement(item));                            break;                        case "subProcess":                            activityNodeVOList.addAll(createActivityNodeBySubProcessElement(item));                            break;                    }                });        return activityNodeVOList;    }}


          完成后,調(diào)用接口測試:41781952edc15fd73b5358295ba1dbfa.webp
          完成功能,下班回家。本來加班應(yīng)該有點沮喪,但不知道為什么心里還是有點竊喜,可能這就是做為一名程序的快樂吧!
          瀏覽 99
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天综合婷婷 | 日本黄在线播放 | 免费看男女日逼吧 | 一级A片黃色A | 国产玖玖在线 |