Creation d'ecran pour Workflow [Résolu]

cancel
Showing results for 
Search instead for 
Did you mean: 
huberd
Member II

Creation d'ecran pour Workflow [Résolu]

Bonjour,

je souhaite pouvoir développer des écrans de Workflow. Après avoir lu de nombreux exemples sur les forums Françcais et Anglais, j'avoue avoir compris un peu la phylosophie de la chose. Là ou cela se gate, c'est que je souhaite réaliser un écran de Worlflow me permettant de sélectionner une liste de lecteurs et une liste d'approbateurs. Je ne sais pas comment coder la chose.

J'ai trouvé l'exemple suivant  dans le repertoire webappsalfrescoWEB-INFclassesalfrescoworkflow (fichier workflowModel.xml) :

<type name="wf:submitReviewTask">
   <parent>bpm:StartTask</parent>
   <mandatory-aspects>
       <aspect>bpm:assignee</aspect>
   </manadtory-aspects>
</type>
ainsi que l'exemple suivant dans le reperoire webappsalfrescoWEB-INFclassesalfresco (fichier web-client-config-properties.xml)

<config evaluator="node-type" condition="bpm:startTask" replace="true">
      <property-sheet>
         <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
         <show-property name="bpm:workflowDescription" component-generator="TextAreaGenerator" />
         <show-property name="bpm:workflowPriority" />
         <show-property name="bpm:workflowDueDate" />
         <separator name="sep2" display-label-id="users_and_roles" component-generator="HeaderSeparatorGenerator" />
         <show-association name="bpm:assignee" />
      </property-sheet>
   </config>

  <!– Review and Approve workflow tasks –>

   <config evaluator="node-type" condition="wf:submitReviewTask" replace="true">
      <property-sheet>
         <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
         <show-property name="bpm:workflowDescription" component-generator="TextAreaGenerator" />
         <show-property name="bpm:workflowPriority" display-label-id="wf_review_priority" />
         <show-property name="bpm:workflowDueDate" display-label-id="wf_review_due_date" />
         <separator name="sep2" display-label-id="users_and_roles" component-generator="HeaderSeparatorGenerator" />
         <show-association name="bpm:assignee" display-label-id="wf_reviewer" />
      </property-sheet>
   </config>
Or cet exemple me permet d'attribuer uniquement dans mon Workflow un seul relecteur. Mon objectif, à partir du premier écran du workflow et de définir une liste de relecteurs, ainsi qu'une liste d'approbateurs et éventuellment une liste d'autres acteurs.

Si quelqu'un a une idée, car je pêche complètement.
3 Replies
huberd
Member II

Re: Creation d'ecran pour Workflow [Résolu]

Une petite question en passant.

Qu'est ce qu'un <mandatory-aspects> et <mandatory>. Quel est leur rôle exacte ?

Merci d'éclairer ma lanterne.
huberd
Member II

Re: Creation d'ecran pour Workflow [Résolu]

Pour ceux que ca interesserait, j'ai réécri aujourdhui la fonction bpm:assignees pour pouvoir réaliser l'assignation de tâche à des relecteurs et des approbateurs. Pour pouvoir définir mon propre Workflow, je me suis inspiré des modèles de workflow existant dans Alfresco et j'ai fini par créé le fichier modèle suivant lprwfModel.xml

<?xml version="1.0" encoding="latin9"?>

<model name="lwf:lprwfmodel" xmlns="http://www.alfresco.org/model/dictionary/1.0">

   <!– Optional meta-data about the model –>
   <description>My Workflow Documents Model</description>
   <author>Huberson David</author>
   <version>1.0</version>

   <imports>
      <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
      <import uri="http://www.alfresco.org/model/bpm/1.0" prefix="bpm"/>
      <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>
   </imports>

   <namespaces>
      <namespace uri="lwf.workflowModel" prefix="lwf"/>
   </namespaces>

   <types>

      <type name="lwf:submitReviewAndApprovalTask">
         <parent>bpm:startTask</parent>
         <properties>
            <property name="lwf:requiredReviewPercent">
               <type>d:int</type>
               <mandatory>true</mandatory>
               <default>50</default>
               <constraints>
                  <constraint type="MINMAX">
                     <parameter name="minValue"><value>1</value></parameter>
                     <parameter name="maxValue"><value>100</value></parameter>
                  </constraint>
               </constraints>
            </property>
         </properties>
         <mandatory-aspects>
            <aspect>lwf:reviewAssignees</aspect>
            <aspect>lwf:approvalAssignees</aspect>
         </mandatory-aspects>
      </type>

      <type name="lwf:rejectedReviewTask">
         <parent>bpm:workflowTask</parent>
         <mandatory-aspects>
            <aspect>lwf:ReviewStats</aspect>
         </mandatory-aspects>
      </type>

      <type name="lwf:approvalReviewTask">
         <parent>bpm:workflowTask</parent>
         <mandatory-aspects>
            <aspect>lwf:ReviewStats</aspect>
         </mandatory-aspects>
      </type>
   </types>

   <aspects>
      <aspect name="lwf:reviewAssignees">
         <associations>
            <association name="lwf:reviewAssignees">
               <source>
                  <mandatory>false</mandatory>
                  <many>false</many>
               </source>
               <target>
                  <class>cm:person</class>
                  <mandatory>true</mandatory>
                  <many>true</many>
               </target>
            </association>
         </associations>
      </aspect>

      <aspect name="lwf:approvalAssignees">
         <associations>
            <association name="lwf:approvalAssignees">
               <source>
                  <mandatory>false</mandatory>
                  <many>false</many>
               </source>
               <target>
                  <class>cm:person</class>
                  <mandatory>true</mandatory>
                  <many>true</many>
               </target>
            </association>
         </associations>
      </aspect>
     
      <aspect name="lwf:ReviewStats">
         <properties>
            <property name="lwf:reviewerCount">
               <type>d:int</type>
            </property>
            <property name="lwf:requiredPercent">
               <type>d:int</type>
            </property>
            <property name="lwf:reviewCount">
               <type>d:int</type>
            </property>
            <property name="lwf:actualPercent">
               <type>d:int</type>
            </property>
         </properties>
      </aspect>
   </aspects>

</model>
Ce modèle est encore incomplet car il ne permet que la première étape de validation, la relecture de documents uniquement.

puis j'ai rajouté ces quelques lignes dans le fichier web-client-config-custom.xml

   <!– Workflow Configuration –>

   <config evaluator="node-type" condition="lwf:submitReviewAndApprovalTask" replace="true">
      <property-sheet>
         <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
         <show-property name="bpm:workflowDescription" component-generator="TextAreaGenerator" />
         <show-property name="bpm:workflowPriority" display-label-id="wf_review_priority" />
         <show-property name="bpm:workflowDueDate" display-label-id="wf_review_due_date" />
         <separator name="sep2" display-label-id="users_and_roles" component-generator="HeaderSeparatorGenerator" />
         <show-association name="lwf:reviewAssignees" display-label-id="lwf_reviewers" />
         <show-association name="lwf:approvalAssignees" display-label-id="lwf_approvals" />
         <separator name="sep3" display-label-id="lwf_review_options" component-generator="HeaderSeparatorGenerator" />
         <show-property name="lwf:requiredReviewPercent" />
      </property-sheet>
   </config>

   <config evaluator="node-type" condition="lwf:rejectedReviewTask" replace="true">
      <property-sheet>
         <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
         <show-property name="bpm:TaskID"/>
         <show-property name="bpm:description" component-generator="TextAreaGenerator" read-only="true"/>
         <show-property name="bpm:dueDate" read-only="true"/>
         <show-property name="bpm:priority" read-only="true"/>
         <show-property name="bpm:status" read-only="true"/>
         <show-property name="bpm:comment" component-generator="TextAreaGenerator"/>
         <separator name="sep2" display-label-id="lwf_review_status" component-generator="HeaderSeparatorGenerator" />
         <show-property name="lwf:reviewerCount" read-only="true"/>
         <show-property name="lwf:requiredPercent" read-only="true"/>
         <show-property name="lwf:reviewCount" read-only="true"/>
         <show-property name="lwf:actualPercent" read-only="true"/>
      </property-sheet>
   </config>
  
   <config evaluator="node-type" condition="lwf:approvedReviewTask" replace="true">
      <property-sheet>
         <separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
         <show-property name="bpm:TaskID"/>
         <show-property name="bpm:description" component-generator="TextAreaGenerator" read-only="true"/>
         <show-property name="bpm:dueDate" read-only="true"/>
         <show-property name="bpm:priority" read-only="true"/>
         <show-property name="bpm:status" read-only="true"/>
         <show-property name="bpm:comment" component-generator="TextAreaGenerator"/>
         <separator name="sep2" display-label-id="lwf_review_status" component-generator="HeaderSeparatorGenerator" />
         <show-property name="lwf:reviewerCount" read-only="true"/>
         <show-property name="lwf:requiredPercent" read-only="true"/>
         <show-property name="lwf:reviewCount" read-only="true"/>
         <show-property name="lwf:actualPercent" read-only="true"/>
      </property-sheet>
   </config>
Et voici enfin le fichier de définition du Workflow non finalisé (partie review uniquement) :

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

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="wf:LPRvalidation">
 
   <swimlane name="initiator"/>
   
   <start-state name="start">
      <task name="lwf:submitReviewAndApprovalTask" swimlane="initiator" />
      <transition name="" to="startreview"/>
   </start-state>
  
   <node name="startreview">
      <action class="org.alfresco.repo.workflow.jbpm.ForEachFork">
         <foreach>#{lwf_reviewAssignees}</foreach>
         <var>reviewer</var>
      </action>
      <event type="node-enter">
         <script>
            <variable name="lwf_reviewCount" access="write" />
            <expression>
               lwf_reviewCount = 0;
            </expression>
         </script>
      </event>
      <transition name="review" to="review"/>
   </node>
  
   <task-node name="review">
      <task name="wf_reviewTak">
         <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
            <actor>#{reviewer}</actor>
         </assignment>
      </task>
      <transition name="reject" to="endreview" />
      <transition name="approve" to="endreview" >
         <script>
            <variable name="lwf_reviewCount" access="read,write" />
            <expression>
               lwf_reviewCount = lwf_reviewCount + 1;
            </expression>
         </script>
      </transition>
   </task-node>
  
   <join name="endreview">
      <transition to="isapproved" />
   </join>

   <decision name="isapproved">
      <event type="node-enter">
         <script>
            <variable name="lwf_reviewerCount" access="Write"/>
            <variable name="lwf_requiredPercent" access="Write"/>
            <variable name="lwf_actualPercent" access="Write"/>
            <expression>
               lwf_requiredPercent = lwf_requiredApprovePercent;
               lwf_reviewerCount = lwf_reviewAssignees.size();
               lwf_actualPercent = ((lwf_reviewCount * 100) / lwf_reviewerCount);
            </expression>
         </script>
      </event>
      <transition name="reject" to="rejected"/>
      <transition name="approve" to="approved">
         <condition>#{lwf_actualPercent >= lwf_requiredApprovePercent}</condition>
      </transition>  
   </decision>
  
   <task-node name="rejected">
      <task name="lwf:rejectedReviewTask" swimlane="initiator" />
      <transition to="end"/>
   </task-node>
  
  <task-node name="approved">
      <task name="lwf:approvedReviewTask" swimlane="initiator" />
      <transition to="end"/>
   </task-node>
  
   <end-state name="end"/>
  
</process-definition>
bch
Member II

Re: Creation d'ecran pour Workflow [Résolu]

Une petite question en passant.

Qu'est ce qu'un <mandatory-aspects> et <mandatory>. Quel est leur rôle exacte ?

Merci d'éclairer ma lanterne.
Bonjour,

La balise permet <mandatory-aspects> permet d'indiquer les aspects obligatoires qui seront ajoutés à un type de document. Et évidemment, ma balise <mandatory> permet d'indiquer qu'un élément est obligatoire.