久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Activiti 多個(gè)并發(fā)子流程的應(yīng)用

 館天下ccf 2015-07-05

應(yīng)用場(chǎng)景:

 

 

多個(gè)部門發(fā)起資金計(jì)劃,,最后統(tǒng)一到財(cái)務(wù)部審批,,每個(gè)部門發(fā)起資金計(jì)劃是一個(gè)子流程,財(cái)務(wù)部審批是多個(gè)部門的計(jì)劃同時(shí)審批,審批完成后,再提交上級(jí)領(lǐng)導(dǎo)審批。

 

流程如下:

并發(fā)子流程

 

要解決以上問題,,需要實(shí)現(xiàn)多個(gè)子流程并行處理的功能。在Activiti5有一個(gè)比較強(qiáng)的節(jié)點(diǎn)屬性就是多實(shí)例,,它可以支持多實(shí)例的子流程,,多實(shí)例任務(wù),多實(shí)體腳本等,。目前支持多實(shí)例的節(jié)點(diǎn)類型有:

 

 

 

多實(shí)例還有并行,、串行區(qū)分。以下解釋一下什么是并行與串行

并行代表同時(shí)進(jìn)行,,如把任務(wù)分給5個(gè)人來(lái)處理,,這5個(gè)人同時(shí)會(huì)收到任務(wù),并且可以同時(shí)處理,,不受各自的影響,。

串行代表工作或任務(wù)由一個(gè)人完成后,再由另一個(gè)人去處理,,直至全部完成,,每個(gè)任務(wù)依賴于前一個(gè)任務(wù)完成。

 

會(huì)簽任務(wù)即可以由activiti多實(shí)例任務(wù)節(jié)點(diǎn)來(lái)實(shí)現(xiàn),,(上一博客有介紹如何開發(fā)設(shè)計(jì)會(huì)簽任務(wù))

 

在Activiti的定義中,,生成多實(shí)例的定義很簡(jiǎn)單,只需要如下類似去生成以下標(biāo)簽,,則可以完成多實(shí)例的聲明,,如下所示,我們要支持并行節(jié)點(diǎn)的多實(shí)例的定義

 

多實(shí)例人工任務(wù)

 

Java代碼  收藏代碼
  1. <userTask activiti:assignee="${assignee}" id="SignTask2" name="財(cái)務(wù)主管會(huì)簽">  
  2.     <extensionElements>  
  3.         <activiti:taskListener  
  4.             class="com.hotent.platform.service.bpm.listener.TaskSignCreateListener"  
  5.             event="create" />  
  6.         <activiti:taskListener  
  7.             class="com.hotent.platform.service.bpm.listener.TaskAssignListener"  
  8.             event="assignment" />  
  9.         <activiti:taskListener  
  10.             class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"  
  11.             event="complete" />  
  12.     </extensionElements>  
  13.     <multiInstanceLoopCharacteristics  
  14.         activiti:elementVariable="assignee" isSequential="false"  
  15.         activiti:collection="${taskUserAssignService.getSignUser(execution)}">  
  16.         <completionCondition>${signComplete.isComplete(execution) }  
  17.         </completionCondition>  
  18.     </multiInstanceLoopCharacteristics>  
  19. </userTask>  
 

 

多實(shí)例子流程

 

Java代碼  收藏代碼
  1. <subProcess activiti:assignee="${assignee}" id="SubProcess1"  
  2.     name="部門資金計(jì)劃流程">  
  3.     <startEvent activiti:initiator="startUser" id="startEvent2"  
  4.         name="開始" />  
  5.     <endEvent id="endEvent1" name="結(jié)束1" />  
  6.     <userTask id="task3" name="助理填寫">  
  7.         <documentation />  
  8.         <extensionElements>  
  9.             <activiti:taskListener  
  10.                 class="com.hotent.platform.service.bpm.listener.TaskCreateListener"  
  11.                 event="create" />  
  12.             <activiti:taskListener  
  13.                 class="com.hotent.platform.service.bpm.listener.TaskAssignListener"  
  14.                 event="assignment" />  
  15.             <activiti:taskListener  
  16.                 class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"  
  17.                 event="complete" />  
  18.         </extensionElements>  
  19.     </userTask>  
  20.     <userTask id="task4" name="部門領(lǐng)導(dǎo)審查">  
  21.         <documentation />  
  22.         <extensionElements>  
  23.             <activiti:taskListener  
  24.                 class="com.hotent.platform.service.bpm.listener.TaskCreateListener"  
  25.                 event="create" />  
  26.             <activiti:taskListener  
  27.                 class="com.hotent.platform.service.bpm.listener.TaskAssignListener"  
  28.                 event="assignment" />  
  29.             <activiti:taskListener  
  30.                 class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"  
  31.                 event="complete" />  
  32.         </extensionElements>  
  33.     </userTask>  
  34.     <sequenceFlow sourceRef="startEvent2" targetRef="task3"  
  35.         id="sequenceFlow1" name="" />  
  36.     <sequenceFlow sourceRef="task3" targetRef="task4" id="sequenceFlow2"  
  37.         name="" />  
  38.     <sequenceFlow sourceRef="task4" targetRef="endEvent1" id="sequenceFlow3"  
  39.         name="" />  
  40.     <extensionElements>  
  41.         <activiti:executionListener event="start"  
  42.             class="com.hotent.platform.service.bpm.listener.StartEventListener" />  
  43.         <activiti:executionListener event="end"  
  44.             class="com.hotent.platform.service.bpm.listener.EndEventListener" />  
  45.     </extensionElements>  
  46.     <multiInstanceLoopCharacteristics  
  47.         activiti:elementVariable="assignee" isSequential="false"  
  48.         activiti:collection="${taskUserAssignService.getMultipleUser(execution)}" />  
  49. </subProcess>  

 

所以關(guān)鍵的配置屬性:

 

Java代碼  收藏代碼
  1. <multiInstanceLoopCharacteristics  
  2.         activiti:elementVariable="assignee" isSequential="false"  
  3.         activiti:collection="${taskUserAssignService.getSignUser(execution)}">  
  4.         <completionCondition>${signComplete.isComplete(execution) }  
  5.         </completionCondition>  
  6.     </multiInstanceLoopCharacteristics>  

 

我們?cè)诳刂贫鄬?shí)例的個(gè)數(shù)或人數(shù)時(shí),,是通過(guò)taskUserAssignService的getSignUser獲取或getMultipleUser(execution)其集合的個(gè)數(shù),,從而決定產(chǎn)生多少個(gè)實(shí)體任務(wù)或子流程。

 

如實(shí)現(xiàn)子流程多實(shí)例的獲取人數(shù),,則來(lái)自:

Java代碼  收藏代碼
  1. /** 
  2.      * 獲取多實(shí)體子流程的執(zhí)行用戶集合 
  3.      * @param execution 
  4.      * @return 
  5.      * @throws Execption 
  6.      */  
  7.     public List<String> getMultipleUser(ActivityExecution execution) throws Exception{  
  8.           
  9.         String nodeId=execution.getActivity().getId();  
  10.         ExecutionEntity executionEnt=(ExecutionEntity) execution;  
  11.           
  12.         List<String> userIds=(List<String>)execution.getVariable(BpmConst.SUBPRO_MULTI_USERIDS);  
  13.           
  14.         if(userIds!=null) return userIds;  
  15.         Map<String,FlowNode> nodeMap= NodeCache.getByActDefId(executionEnt.getProcessDefinitionId());  
  16.         FlowNode subProcessNode=nodeMap.get(nodeId);  
  17.         FlowNode firstNode=subProcessNode.getSubFirstNode();  
  18.           
  19.         FlowNode secodeNode=firstNode.getNextFlowNodes().get(0);  
  20.           
  21.         List<String> userList=nodeUserMapLocal.get().get(secodeNode.getNodeId());  
  22.           
  23.         logger.debug("userList size:" + userList.size());  
  24.           
  25.         execution.setVariable(BpmConst.SUBPRO_MULTI_USERIDS, userList);  
  26.         return userList;  
  27.     }  
 

因?yàn)樵摲椒〞?huì)被調(diào)用多次,,所以其實(shí)現(xiàn)的思路是第一次其集合是來(lái)自用戶的界面選擇的人員列表,第一次之后,,放到流程變量中去,,在后續(xù)的獲取中,直接從流程變量中獲取,。

然后在任務(wù)的創(chuàng)建的監(jiān)聽器中,,從流程變量assignee中獲取當(dāng)前任務(wù)的執(zhí)行人,。以上的實(shí)現(xiàn)還有一細(xì)節(jié)就是要解決如何查找到子流程中的第一個(gè)任務(wù)節(jié)點(diǎn),并且把對(duì)應(yīng)的任務(wù)人員授給這任務(wù)節(jié)點(diǎn),。

 

 

最終實(shí)現(xiàn)的效果如下所示:

 

http://www./htsite/html/cpjfw/zxjc/bpmx3/2012/08/27/1346037096478.html

 

 

 

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多