Activit7中默認(rèn)是沒有加簽動作的,為了實(shí)現(xiàn)自定的加簽和減簽操作就需要程序猿自己來實(shí)現(xiàn)對應(yīng)的命令压恒。
一吼驶、實(shí)現(xiàn)思路
- 判斷當(dāng)前節(jié)點(diǎn)類型是否允許加簽粥帚,可以限制非多實(shí)例節(jié)點(diǎn)墨坚、序簽節(jié)點(diǎn)不能執(zhí)行加簽(當(dāng)然這兩類節(jié)點(diǎn)也可以實(shí)現(xiàn))
- 在當(dāng)前節(jié)點(diǎn)執(zhí)行實(shí)例上面創(chuàng)建一個(gè)任務(wù)執(zhí)行實(shí)例振亮,然后設(shè)置變量
- 修改節(jié)點(diǎn)變量
- 執(zhí)行任務(wù)實(shí)例的默認(rèn)動作
二、實(shí)現(xiàn)代碼
下面是基于activiti7的代碼片段
注意 實(shí)現(xiàn)代碼都是需要寫到activiti命令的實(shí)現(xiàn)類中的
ExecutionEntityManager executionEntityManager = commandContext.getExecutionEntityManager();
ExecutionEntity currentExecutionEntity = executionEntityManager.findById(task.getExecutionId());
ExecutionEntity miExecution = currentExecutionEntity.getParent();
Integer nrOfInstances = (Integer) miExecution.getVariableLocal(EActiviti.NUMBER_OF_INSTANCES);
Integer nrOfActiveInstances = (Integer) miExecution.getVariableLocal(EActiviti.NUMBER_OF_ACTIVE_INSTANCES);
// 判斷當(dāng)前節(jié)點(diǎn)能否加簽
...
// 在當(dāng)前節(jié)點(diǎn)執(zhí)行實(shí)例上面創(chuàng)建一個(gè)任務(wù)執(zhí)行實(shí)例檬果,然后設(shè)置變量
ExecutionEntity childExecution = executionEntityManager.createChildExecution(miExecution);
UserTask userTask = (UserTask) miExecution.getCurrentFlowElement();
childExecution.setActive(true);
childExecution.setScope(false);
childExecution.setCurrentFlowElement(userTask);
childExecution.setVariableLocal("loopCounter", nrOfInstances);
childExecution.setVariableLocal("assignee", assignee);
...
// 修改節(jié)點(diǎn)變量
miExecution.setVariableLocal("nrOfInstances", nrOfInstances + 1);
miExecution.setVariableLocal("nrOfActiveInstances", nrOfActiveInstances + 1);
// 執(zhí)行當(dāng)前任務(wù)實(shí)例
commandContext.getAgenda().planContinueMultiInstanceOperation(childExecution);
三、非多實(shí)例、序簽的加簽
1. 非多實(shí)例加簽
在流程的創(chuàng)建的時(shí)候选脊,將非多實(shí)例加簽?zāi)J(rèn)設(shè)置為多實(shí)例加簽(或簽杭抠、會簽都可以)。\
到底設(shè)置成或簽還是會簽恳啥,這個(gè)不用糾結(jié)偏灿,后面我會介紹如何動態(tài)的在會簽和或簽之間切換。
2. 序簽加簽
序簽加簽可以添加新表解決钝的∥檀梗或者在獲取的審批人的接口中動態(tài)添加解決。
注意: 兩種方案都需要修改節(jié)點(diǎn)的變量(設(shè)置審批人的總數(shù))