2016-02-22 2 views
3

Когда я начинаю свой рабочий процесс, я хочу, чтобы этот параметр был назначен кому-то. Если никто не выбран, я хочу по умолчанию назначить его инициатору.Рабочий процесс: установка значения по умолчанию для bpm: assignee

Можно ли обойтись без создания новой модели, которая расширяет bpm: цессионарий? Если нет, то как это расширение будет выполнено?

Я считаю, что этот ответ от Джеффа Поттс актуальна: https://stackoverflow.com/a/9418066/4542428

Примечание: Я использую Community Edition 4.2

EDIT: ответ Стефан получил меня подавляющее большинство пути к ответу, но это, кажется, что я как-то неправильно ссылаюсь на ценность ассоциации. Контекст: я никогда не использовал ассоциации, и это, скорее всего, просто неспособность понять их отличие от типов и аспектов.

С моей модели:

<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: старт идентичен. Это успешно отображает селектор человека, не делая его обязательным, ровно на 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 захватывается) возвращает значение undefined для «deliveryTicketWorkflow_assignedPM». Когда он остается пустым, все работает плавно, но в разделе «Общая информация» описания рабочего процесса по-прежнему отображается диспетчер проектов как (Нет).

ответ

4

Вы действительно можете настроить сборщика людей, как описывает Джефф, но для этого требуется довольно много усилий по кодированию.

В качестве альтернативы можно использовать executionlistener рабочего процесса для запуска событий, и использовать его, чтобы установить переменную 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); 
    } 
} 
+0

Это общий подход, я склонялся к, но я был под впечатлением, что вы не могли получить рабочий процесс до точки выстрела прослушиватель выполнения без заполнения всех обязательных полей (т.е. bpm: цессионарий). –

+0

попробуйте использовать настраиваемое поле для правопреемника в стартовой форме и сделать его необязательным. Затем используйте это поле в своей первой задаче bmp как правопреемник.Я обновил ответ –

+0

Я думал, что это решило мою проблему, потому что это сработало, когда я оставил селектор пустым, но я делаю что-то ужасно неправильно и никогда не ссылаюсь на значение селектора. Обновление исходного вопроса и повторное открытие. –

Смежные вопросы