当我开始我的工作流程时,我想要选择将其分配给某人。如果没有人被选中,我想默认将它分配给发起人。
如果不创建扩展bpm:assignee的新模型,是否可以这样做?如果没有,该扩展将如何完成?
我相信Jeff Potts的答案是相关的:https://stackoverflow.com/a/9418066/4542428
注意:我使用的是社区版4.2
编辑:Stefan的回答让我得到了答案的绝大部分,但似乎我在某种程度上错误地引用了关联的价值。背景:我从未使用过关联,这可能只是因为我无法理解它们与类型和方面的区别。从我的模特:
<type name="deliveryTicketWorkflow:start">
<parent>bpm:startTask</parent>
<properties>
</properties>
<associations />
<overrides />
<mandatory-aspects>
<aspect>deliveryTicketWorkflow:pmAspect</aspect>
<aspect>deliveryTicketWorkflow:requestDetailsAspect</aspect>
</mandatory-aspects>
</type>
<aspect name="deliveryTicketWorkflow:pmAspect">
<associations>
<association name="deliveryTicketWorkflow:assignedPM">
<source>
<mandatory>false</mandatory>
<many>false</many>
</source>
<target>
<class>cm:person</class>
<mandatory>false</mandatory>
<many>true</many>
</target>
</association>
</associations>
</aspect>
我的配置用作:
<config condition="activiti$deliveryTicketWorkflow" evaluator="string-compare">
<forms>
<form>
<field-visibility>
...
<show id="deliveryTicketWorkflow:assignedPM" />
...
</field-visibility>
<appearance>
...
<field id="deliveryTicketWorkflow:assignedPM" label-id="Project Manager" />
...
</appearance>
</form>
</forms>
</config>
我的deliveryTicketworkflow配置:start是完全相同的。这成功地显示了人物选择器,而没有强制要求,正好像Stefan所说的那样100%。
在我的bpmn工作流定义中,我将这些片段放在启动事件的执行监听器中:
if(!execution.getVariable("deliveryTicketWorkflow_assignedPM")){
execution.setVariable("deliveryTicketWorkflow_assignedPM", initiator);
}
...
deliveryTicket.properties["dtdlm:projectManager"] = execution.getVariable("deliveryTicketWorkflow_assignedPM").properties.firstName + " " + execution.getVariable("deliveryTicketWorkflow_assignedPM").properties.lastName;
当工作流程运行并且我选择某人作为PM时,该最后一行(抓取PM的名字和姓氏)返回未定义的值为&#34; deliveryTicketWorkflow_assignedPM&#34;。当它保持空白时,一切都在游泳,但工作流描述的常规信息部分仍然将项目管理器列为(无)。
答案 0 :(得分:4)
正如杰夫所描述的,你确实可以自定义人员选择器,但它需要相当多的编码工作。
或者,您可以使用工作流执行顺序器来启动事件,并使用它将bpm_assignee变量设置为启动器,以防它在表单上为空:
向你添加监听器bpmn20:
<activiti:executionListener event="start" class="com.mycomp.Executionlistener"></activiti:executionListener>
在您的第一个usertask中,在工作流程开始表单中定义关联属性的受让人。
<userTask id="firsttask" name="firsttask" activiti:assignee="${mymodel.myassoc.properties.userName}" >
同时将此关联添加到您的启动任务内容模型。
com.mycomp.Executionlistener中的代码如下所示:
public void notify(DelegateExecution execution) throws Exception {
if (execution.getVariable("mymodel_myassoc") == null ){
ActivitiScriptNode userScriptNode= (ActivitiScriptNode) execution.getVariable("initiator");
execution.setVariable("mymodel_myassoc",userScriptNode);
}
}