代码之家  ›  专栏  ›  技术社区  ›  Chelsea Kay

工作流:设置bpm:assignee的默认值

  •  3
  • Chelsea Kay  · 技术社区  · 10 年前

    当我启动工作流程时,我希望选择将其分配给某人。如果没有选择任何人,我想默认将其分配给发起人。

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

    我相信Jeff Potts的回答是相关的: https://stackoverflow.com/a/9418066/4542428

    注意:我使用的是社区版4.2

    编辑:斯特凡的回答让我获得了绝大多数答案,但我似乎在某种程度上错误地引用了关联的价值。上下文:我从未使用过关联,这可能只是我未能理解它们与类型和方面的区别。

    根据我的模型:

    <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所说的那样。

    在我的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的名字和姓氏)返回“deliveryTicketWorkflow_assignedPM”的值undefined。如果将其留空,则一切正常,但工作流描述的“常规信息”部分仍将项目经理列为(无)。

    1 回复  |  直到 9 年前
        1
  •  4
  •   Stefan De Laet    10 年前

    正如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);
       }
     }
    
    推荐文章