工作流程:为 bpm:assignee 设置默认值

Workflow: Setting default value for bpm:assignee

当我开始我的工作流程时,我想要将其分配给某人的选项。如果没人选,我想默认分配给发起者。

这是否可以在不创建扩展 bpm:assignee 的新模型的情况下实现?如果没有,该扩展将如何完成?

我相信 Jeff Potts 的这个回答是相关的:

注意:我使用的是社区版 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 的配置是相同的。这成功地显示了这个人 select 或者,在没有强制要求的情况下,正好像 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;

当工作流程是 运行 并且我 select 某人作为 PM 时,最后一行(获取 PM 的名字和姓氏的地方)returns 的值为"deliveryTicketWorkflow_assignedPM" 未定义。当它留空时,一切正常,但工作流程描述的一般信息部分仍然将项目经理列为 (None)。

您确实可以自定义人员选择器,正如 jeff 所描述的,但这需要相当多的编码工作。

或者,您可以使用工作流执行侦听器来启动事件,并使用它将 bpm_assignee 变量设置为发起者,以防它在表单中为空:

给你bpmn20添加监听器:

 <activiti:executionListener event="start" class="com.mycomp.Executionlistener"></activiti:executionListener>

在您的第一个用户任务中,在您的工作流启动表单中定义关联 属性 的受让人。

 <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);
   }
 }