Workflow para revisión de grupo

cancel
Showing results for 
Search instead for 
Did you mean: 
witho
Active Member

Workflow para revisión de grupo

Hola,

¿Alguien puede decirme como lanzar un Workflow en el cual la tarea de revisión se asigne a un grupo, de tal forma que cuando un miembro de dicho grupo apruebe o rechace el documento a revisar la tarea de revisión desaparezca de las tareas pendientes del restod e miembros del grupo?

He visto que el proceso definido en parallelreview_group_processdefinition.xml requiere que un porcentaje de los miembros del gupo (indicado en el parametro requiredAprovePercent) apruebe el documento para que la tarea de Aprobar se conidere realizada.

Mi idea es modificar el review_processdefinition.xml para assignar la tarea de revisión a un grupo y que cuando cualquier miembro de dicho grupo apruebe o rechace el documento en cuestión, la tarea desaparezca de las tareas pendientes del resto de miembros y dicha tarea se considere realizada con que UN solo miembro del grupo la lleve a cabo. Posteo mis ficheros, agradezco cualquier comentario o sugerencia.

workflow.js (javascript que lanza el Workflow)


var workflow = actions.create("start-workflow");
workflow.parameters.workflowName = "jbpm$wf:review";
workflow.parameters["bpm:assignee"] = people.getGroup("GROUP_APROBDOCSCOMERCIAL");
workflow.execute(document);

review_processdefinition.xml


<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="wf:review">

    <swimlane name="initiator" />

    <start-state name="start">
        <task name="wf:submitReviewTask" swimlane="initiator" />
        <transition name="" to="review" />         
    </start-state>

    <swimlane name="reviewer">
      <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
         <pooledactors>#{bpm_assignee}</pooledactors>
      </assignment>      
    </swimlane>

    <task-node name="review">
        <task name="wf:reviewTask" swimlane="reviewer">
            <event type="task-create">
                <script>
                    if (bpm_workflowDueDate != void) taskInstance.dueDate = bpm_workflowDueDate;
                    if (bpm_workflowPriority != void) taskInstance.priority = bpm_workflowPriority;
                </script>
            </event>
        </task>
        <transition name="reject" to="rejected" />
        <transition name="approve" to="approved" />
    </task-node>

    <task-node name="rejected">
        <task name="wf:rejectedTask" swimlane="initiator"/>
        <transition name="" to="end" />   
   </task-node>
   
   <task-node name="approved">
        <task name="wf:approvedTask" swimlane="initiator" />
        <transition name="" to="end" />         
    </task-node>   
   
    <end-state name="end" />

</process-definition>

Muchas garcias.
4 Replies
ajv
Member II

Re: Workflow para revisión de grupo

Hola witho,

No soy nada experto en el tema de workflow's…pero para la asignación de tareas a grupos, está el concepto de pooled actors que creo que te puede servir.
Cuando se define un proceso de negocio es importante considerar la necesidad de emplear "pooled actors" para realizar las tareas. En el caso que se necesitase asignar la tarea, por ejemplo, a un grupo de 20 personas, se podría iterar a través del grupo y asignar una tarea a cada uno de los miembros del grupo y no considerar la tarea completa hasta que todos los actores la hubiesen realizado. Una alternativa a esto es usar pooled actors. De esta forma, todos los miembros de un grupo son notificados de la tarea, pero en el momento en que un actor toma posesión de la tarea, se elimina del resto de miembros como tarea a realizar. El propietario puede completar la tarea o devolverla al pool. Si la devuelve, todos los miembros del grupo verá de nuevo la tarea en sus listas de tareas a realizar hasta que otra persona tome posesión o complete la tarea.
Entiendo que para tu caso los pooled actors te pueden venir bien…

Para usar pooled actors, se debe utilizar el elemento "pooledactors" como hijo del elemento "assignement" en lugar del elemento "actor":
<swimlane name="marketing">
    <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
        <pooledactors>#{people.getGroup('GROUP_marketing')}</pooledactors>
    </assignment>
</swimlane>
Despues, cuando estés definiendo los diferentes nodos del proceso puedes emplear el pooled actor anterior en la asignación:
<tasknode name="Marketing Review">
    <task name="scwf:marketingReview" swimlane="marketing" />
    <transition name="approve" to="join1"></transition>
    <transition name="reject" to="join1"></transition>
</tasknode>

Por otro lado, por lo que he visto, además del review_processdefinition.xml, también está el review_pooled_processdefinition.xml que es lo mismo pero jugando con el concepto que te digo de pooled actors…quizás este te venga como anillo al dedo  :wink:
<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="wf:reviewpooled">

    <swimlane name="initiator" />

    <start-state name="start">
        <task name="wf:submitGroupReviewTask" swimlane="initiator" />
        <transition name="" to="review" />
    </start-state>

    <swimlane name="reviewer">
        <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
            <pooledactors>#{bpm_groupAssignee}</pooledactors>
        </assignment>   
    </swimlane>

    <task-node name="review">
        <task name="wf:reviewTask" swimlane="reviewer">
            <event type="task-create">
                <script>
                   if (bpm_workflowDueDate != void) taskInstance.dueDate = bpm_workflowDueDate;
                   if (bpm_workflowPriority != void) taskInstance.priority = bpm_workflowPriority;
                </script>
            </event>
            <event type="task-end">
               <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
                  <script>
                     <variable name="bpm_assignee" access="write"/>
                     <expression>
                        if (taskInstance.actorId != null)
                           people.getPerson(taskInstance.actorId);
                        else
                           person;
                     </expression>
                  </script>
               </action>
            </event>
        </task>
        <transition name="reject" to="rejected" />
        <transition name="approve" to="approved" />
    </task-node>

    <task-node name="rejected">
        <task name="wf:rejectedTask" swimlane="initiator" />
        <transition name="" to="end" />
    </task-node>

    <task-node name="approved">
        <task name="wf:approvedTask" swimlane="initiator" />
        <transition name="" to="end" />
    </task-node>

    <end-state name="end" />

</process-definition>

Ahh, por cierto, para profundizar en el tema este del workflow, puedes echarle un vistazo a un artículo buenísimo de Jeff Potts: http://ecmarchitect.com/images/articles/alfresco-workflow/advanced-workflow-article.pdf
Que lo disfrutes y saludos!!
witho
Active Member

Re: Workflow para revisión de grupo

Gracias pro tu respuesta ajv,

he reconfigurado mis ficheros pero sin conseguir que la tarea "Revisar" se asigne a cada miembro del grupo, al subir un documento y lanzarse el Workflow la tarea "Revisar" únicamente se asigna al usuario que ha subido el documento. Aquí posteo los archivos tal y como los tengo ahora mismo, espero que puedas echarme una mano.

workflow.js (javascript que lanza el Workflow)


var workflow = actions.create("start-workflow");
workflow.parameters.workflowName = "jbpm$wf:review_pooled";
workflow.parameters["bpm:workflowDescription"] = "Asier.";
workflow.parameters["bpm:assignee"] = people.getGroup("GROUP_APROBDOCSCOMERCIAL");
workflow.execute(document);

review_pooled_processdefinition.xml


<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="wf:reviewpooled">

    <swimlane name="initiator" />

    <start-state name="start">
        <task name="wf:submitGroupReviewTask" swimlane="initiator" />
        <transition name="" to="review" />
    </start-state>

    <swimlane name="reviewer">
        <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
            <pooledactors>#{bpm_assignee}</pooledactors>
        </assignment>  
    </swimlane>

    <tasknode name="Marketing Review">
    <task name="scwf:marketingReview" swimlane="reviewer" />
      <event type="task-create">
         <script>
            if (bpm_workflowDueDate != void) taskInstance.dueDate = bpm_workflowDueDate;
            if (bpm_workflowPriority != void) taskInstance.priority = bpm_workflowPriority;
         </script>
      </event>
      <event type="task-end">
         <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
           <script>
             <variable name="bpm_assignee" access="write"/>
             <expression>
               if (taskInstance.actorId != null)
                  people.getPerson(taskInstance.actorId);
               else
                  person;
             </expression>
           </script>
         </action>
      </event>
   </task>
    <transition name="approve" to="approved"></transition>
    <transition name="reject" to="rejected"></transition>
</tasknode>

    <task-node name="rejected">
        <task name="wf:rejectedTask" swimlane="initiator" />
        <transition name="" to="end" />
    </task-node>

    <task-node name="approved">
        <task name="wf:approvedTask" swimlane="initiator" />
        <transition name="" to="end" />
    </task-node>

    <end-state name="end" />

</process-definition>

Gracias por tu tiempo.
witho
Active Member

Re: Workflow para revisión de grupo

Hola de nuevo,

He detectado bastantes errores en mi configuración anterior, la que he posteado en mi último mensaje, así que he seguido haciendo pruebas y he intentado utilizar el review_pooled_processdefinition.xml. Finalmente he detectado que el log del tomcat me da un  java.lang.NullPointerException en el JavaScript que lanza el workflow (workflow.js), concretamente en la última línea (workflow.execute(document);).

El caso es que si lanzo un Workflow de tipo review con el XML review_processdefinition.xml y le indico el usuario que quiero que reciba la tarea de revisión no me da ningún error y al tarea se le asigna al usuario indicado sin problemas. Sin embargo, al intentar hacer algo similar pero lanzando un Workflow de tipo review_pooled obtengo el error de NullPointerException. En algunos foros he visto la opción de declarar la variable document de al siguiente manera: var document = search.findNode(yourNodeRef); El problema es que no se como podría indicar el nodeRef del documento o del espacio en el que quiero lanzar el Workflow.

Posteo la configuración actual del Javascript y el XML que producen el NullPointerException a ver si alguien me puede echar una mano. MUCHAS GRACIAS!!!

workflow.js


var workflow = actions.create("start-workflow");
workflow.parameters.workflowName = "jbpm$wf:reviewpooled";
workflow.parameters["bpm:workflowDescription"] = "Revision de documento.";
workflow.parameters["bpm:groupAssignee"] = "GROUP_APROBDOCSCOMERCIAL";
workflow.execute(document);

review_pooled_processdefinition.xml


<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="wf:reviewpooled">

    <swimlane name="initiator" />

    <start-state name="start">
        <task name="wf:submitReviewTask" swimlane="initiator" />
        <transition name="" to="review" />         
    </start-state>

    <swimlane name="reviewer">
      <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
         <pooledactors>#{people.getMembers(bpm_groupAssignee)}</pooledactors>
      </assignment>      
    </swimlane>

    <task-node name="review">
        <task name="wf:reviewTask" swimlane="reviewer">
            <event type="task-create">
                <script>
                    if (bpm_workflowDueDate != void) taskInstance.dueDate = bpm_workflowDueDate;
                    if (bpm_workflowPriority != void) taskInstance.priority = bpm_workflowPriority;
                </script>
            </event>
        </task>
        <transition name="reject" to="rejected" />
        <transition name="approve" to="approved" />
    </task-node>

    <task-node name="rejected">
        <task name="wf:rejectedTask" swimlane="initiator"/>
        <transition name="" to="end" />
   </task-node>
   
   <task-node name="approved">
        <task name="wf:approvedTask" swimlane="initiator" />
        <transition name="" to="end" />      
    </task-node>   
   
    <end-state name="end" />

</process-definition>
giorgio
Member II

Re: Workflow para revisión de grupo

Buenas, he seguido los pasos que poneis en este post y me ocurre el mismo problema, me salta una excepcion null

Failed to execute script 'workspace://SpacesStore/faf49540-9a6a-4142-ab30-a1667c66da72': null

habeis conseguido solventarlo. Gracias

Saludos.