2013-10-28 70 views
0

我想在戶外社區版中構建自定義工作流。基本上我試圖修改現有的稱爲lifecycleprocess的工作流程。我已經能夠使用工作流控制檯無誤地部署該流程。但是我無法在工作流表單上做任何改變。我的工作流程被稱爲leaveprocess,我有以下代碼:Alfresco工作流分享表

路徑:露天/ tomcat的/共享/類/戶外/擴展/

leaveprocess-bpmn20.xml

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

<definitions id="leave-definitions" 
      typeLanguage="http://www.w3.org/2001/XMLSchema" 
      expressionLanguage="http://www.w3.org/1999/XPath" 
      targetNamespace="http://activiti.org/bpmn20" 
      xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:activiti="http://activiti.org/bpmn"> 

    <process id="activitileaveApproval" name="Leave Process"> 
     <extensionElements> 
      <!-- When process is deleted/cancelled, status should be set to draft --> 
      <activiti:executionListener event="end" class="org.alfresco.repo.workflow.activiti.listener.ScriptExecutionListener"> 
       <activiti:field name="script"> 
        <activiti:string> 
         if(cancelled || deleted) { 
          for (var i = 0; i &lt; bpm_package.children.length; i++) 
          { 
           if (!bpm_package.children[i].hasAspect("wfl:status")) 
           { 
            bpm_package.children[i].properties["wfl:status"] = "Draft"; 
            bpm_package.children[i].save(); 
           } 
          } 
         } 
        </activiti:string> 
        </activiti:field> 
      </activiti:executionListener> 
     </extensionElements> 
     <startEvent id="start" 
      activiti:formKey="wf:submitReviewTask" /> 

     <sequenceFlow id='flow1' 
      sourceRef='start' 
      targetRef='reviewTask'> 
      <extensionElements> 
       <activiti:executionListener event="take" class="org.alfresco.repo.workflow.activiti.listener.ScriptExecutionListener"> 
        <activiti:field name="script"> 
         <activiti:string> 
          for (var i = 0; i &lt; bpm_package.children.length; i++) 
          { 
           if (!bpm_package.children[i].hasAspect("wfl:status")) 
           { 
            bpm_package.children[i].addAspect("wfl:status"); 
           } 
          } 
         </activiti:string> 
         </activiti:field> 
       </activiti:executionListener> 
      </extensionElements> 
     </sequenceFlow> 

     <userTask id="reviewTask" name="Review Task" 
      activiti:formKey="wf:activitiReviewTask"> 
      <extensionElements> 
       <activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener"> 
        <activiti:field name="script"> 
        <activiti:string> 
         if (typeof bpm_workflowDueDate != 'undefined') task.setVariableLocal('bpm_dueDate', bpm_workflowDueDate); 

         for (var i = 0; i &lt; bpm_package.children.length; i++) 
         { 
          if (bpm_package.children[0].hasAspect("wfl:status")) { 
           bpm_package.children[i].properties["wfl:status"] = "In Review"; 
           bpm_package.children[i].save(); 
          } 
         } 
        </activiti:string> 
        </activiti:field> 
       </activiti:taskListener> 
       <activiti:taskListener event="complete" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener"> 
        <activiti:field name="script"> 
        <activiti:string> 
         execution.setVariable('wf_reviewOutcome', task.getVariable('wf_reviewOutcome')); 
        </activiti:string> 
        </activiti:field> 
       </activiti:taskListener> 
      </extensionElements> 
      <humanPerformer> 
       <resourceAssignmentExpression> 
        <formalExpression>${bpm_assignee.properties.userName}</formalExpression> 
       </resourceAssignmentExpression> 
      </humanPerformer> 
     </userTask> 

     <sequenceFlow id='flow2' 
     sourceRef='reviewTask' 
      targetRef='reviewDecision' /> 

     <exclusiveGateway id="reviewDecision" name="Review Decision" /> 

     <sequenceFlow id='flow3' sourceRef='reviewDecision' targetRef='approved' > 
      <conditionExpression xsi:type="tFormalExpression">${wf_reviewOutcome == 'Approve'}</conditionExpression> 
     </sequenceFlow> 

     <sequenceFlow id='flow4' 
     sourceRef='reviewDecision' 
      targetRef='rejected' /> 

     <userTask id="approved" name="Document Approved" 
      activiti:formKey="wf:approvedTask" > 
      <documentation> 
       The document was reviewed and approved. 
      </documentation> 
      <extensionElements> 
       <activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener"> 
        <activiti:field name="script"> 
        <activiti:string> 
         if (typeof bpm_workflowDueDate != 'undefined') task.setVariableLocal('bpm_dueDate', bpm_workflowDueDate); 

         for (var i = 0; i &lt; bpm_package.children.length; i++) 
         { 
          if (bpm_package.children[0].hasAspect("wfl:status")) { 
           bpm_package.children[i].properties["wfl:status"] = "Approved"; 
           bpm_package.children[i].save(); 
          } 
         } 
        </activiti:string> 
        </activiti:field> 
       </activiti:taskListener> 
      </extensionElements> 
      <humanPerformer> 
       <resourceAssignmentExpression> 
        <formalExpression>${initiator.properties.userName}</formalExpression> 
       </resourceAssignmentExpression> 
      </humanPerformer> 
     </userTask> 

     <userTask id="rejected" name="Document Rejected" 
      activiti:formKey="wf:rejectedTask" > 
      <documentation> 
       The document was reviewed and rejected. 
      </documentation> 
      <extensionElements> 
       <activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener"> 
        <activiti:field name="script"> 
        <activiti:string> 
         if (typeof bpm_workflowDueDate != 'undefined') task.setVariableLocal('bpm_dueDate', bpm_workflowDueDate); 

         for (var i = 0; i &lt; bpm_package.children.length; i++) 
         { 
          if (bpm_package.children[0].hasAspect("wfl:status")) 
          { 
           bpm_package.children[i].properties["wfl:status"] = "Draft"; 
           bpm_package.children[i].save(); 
          } 
         } 
        </activiti:string> 
        </activiti:field> 
       </activiti:taskListener> 
      </extensionElements> 
      <humanPerformer> 
       <resourceAssignmentExpression> 
        <formalExpression>${initiator.properties.userName}</formalExpression> 
       </resourceAssignmentExpression> 
      </humanPerformer> 
     </userTask> 

     <sequenceFlow id='flow5' sourceRef='approved' 
      targetRef='end' /> 

     <sequenceFlow id='flow6' sourceRef='rejected' 
      targetRef='end' /> 

     <endEvent id="end" /> 



    </process> 

</definitions> 

leave-messages.properties

# For JBPM leave Workflow Example 
wfl_leaveapproval.workflow.title=Leave Application 
wfl_leaveapproval.workflow.description=Leave Application (Auto updates document status) 
wfl_leaveapproval.node.review.transition.reject.title=Reject 
wfl_leaveapproval.node.review.transition.reject.description=Reject 
wfl_leaveapproval.node.review.transition.approve.title=Approve 
wfl_leaveapproval.node.review.transition.approve.description=Approve 

# For Activiti leave Workflow Example 
activitileaveApproval=Leave Application 
activitileaveApproval=Leave Application workflow Activiti (Auto updates document status) 

留工作流的context.xml

<?xml version='1.0' encoding='UTF-8'?> 
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'> 

<beans> 

    <bean id="leave.workflowBootstrap" parent="workflowDeployer"> 
     <property name="workflowDefinitions"> 
      <list> 
       <!-- JBPM version of leave process --> 
       <props> 
        <prop key="engineId">jbpm</prop> 
        <prop key="location">alfresco/extension/leave_processdefinition.xml</prop> 
        <prop key="mimetype">text/xml</prop> 
        <prop key="redeploy">false</prop> 
       </props> 
       <!-- Activiti version of leave process --> 
       <props> 
        <prop key="engineId">activiti</prop> 
        <prop key="location">alfresco/extension/leave-process.bpmn20.xml</prop> 
        <prop key="mimetype">text/xml</prop> 
        <prop key="redeploy">false</prop> 
       </props> 
      </list> 
     </property> 
     <property name="models"> 
      <list> 
       <value>alfresco/extension/leaveModel.xml</value> 
      </list> 
     </property> 
     <property name="labels"> 
      <list> 
       <value>alfresco/extension/leave-messages</value> 
      </list> 
     </property> 
    </bean> 

</beans> 

leave_processdefinition.xml

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

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

    <swimlane name="initiator" /> 

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

     <event type="node-leave"> 
      <!-- Call script once the workflow package exists i.e. on node-leave --> 
      <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript"> 
       <!-- Apply the Workflow leave Aspect (wfl:status) if not set already. Note: The default wfl:status property is draft --> 
       <script> 
        for (var i = 0; i &lt; bpm_package.children.length; i++) 
        { 
         if (!bpm_package.children[i].hasAspect("wfl:status")) 
         { 
          bpm_package.children[i].addAspect("wfl:status"); 
         } 
        } 
       </script> 
      </action> 
     </event> 

     <transition name="" to="review" /> 
    </start-state> 

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

    <task-node name="review"> 
     <event type="node-enter"> 
      <!-- Update the status to In Review when we enter this task --> 
      <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript"> 
       <script> 
        for (var i = 0; i &lt; bpm_package.children.length; i++) 
        { 
         bpm_package.children[i].properties["wfl:status"] = "In Review"; 
         bpm_package.children[i].save(); 
        } 
       </script> 
      </action> 
     </event> 

     <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="approve" to="approved" /> 
     <transition name="reject" to="rejected" /> 
    </task-node> 

    <task-node name="rejected"> 
     <event type="node-enter"> 
      <!-- Update the status to Draft when we enter this task --> 
      <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript"> 
       <script> 
        for (var i = 0; i &lt; bpm_package.children.length; i++) 
        { 
         bpm_package.children[i].properties["wfl:status"] = "Draft"; 
         bpm_package.children[i].save(); 
        } 
       </script> 
      </action> 
     </event> 

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

    <task-node name="approved"> 
     <event type="node-enter"> 
      <!-- Update the status to Approved when we enter this task --> 
      <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript"> 
       <script> 
        for (var i = 0; i &lt; bpm_package.children.length; i++) 
        { 
         bpm_package.children[i].properties["wfl:status"] = "Approved"; 
         bpm_package.children[i].save(); 
        } 
       </script> 
      </action> 
     </event> 

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

    <end-state name="end" /> 

    <event type="process-end"> 
     <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript"> 
      <script> 
       if (cancelled) 
       { 
        for (var i = 0; i &lt; bpm_package.children.length; i++) 
        { 
         if (bpm_package.children[0].hasAspect("wfl:status")) 
         { 
          bpm_package.children[i].properties["wfl:status"] = "Draft"; 
          bpm_package.children[i].save(); 
         } 
        } 
        if (logger.isLoggingEnabled()) logger.log("Workflow cancelled, status reset to Draft"); 
       } 
       else     
       { 
        if (logger.isLoggingEnabled()) logger.log("Workflow completed"); 
       } 
      </script> 
     </action> 
    </event> 

</process-definition> 

leaveModel.xml

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

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

    <!-- Optional meta-data about the model --> 
    <description>Workflow leave Model</description> 
    <author></author> 
    <version>1.0</version> 

    <!-- Imports are required to allow references to definitions in other models --> 
    <imports> 
     <!-- Import Alfresco Dictionary Definitions --> 
     <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d" /> 
     <!-- Import Alfresco Content Domain Model Definitions --> 
     <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm" /> 
    </imports> 

    <namespaces> 
     <namespace uri="wfl.model" prefix="wfl" /> 
    </namespaces> 

    <constraints> 
     <constraint name="wfl:status" type="LIST"> 
      <parameter name="allowedValues"> 
       <list> 
        <value>Draft</value> 
        <value>In Review</value> 
        <value>Approved</value> 
       </list> 
      </parameter> 
     </constraint> 
    </constraints> 

    <aspects> 

     <!-- Status property is used to manage workflow approval --> 
     <aspect name="wfl:status"> 
      <title>Status</title> 
      <properties> 
       <property name="wfl:status"> 
        <title>Status</title> 
        <type>d:text</type> 
        <default>Draft</default> 
        <constraints> 
         <constraint ref="wfl:status" /> 
        </constraints> 
       </property> 
      </properties> 
     </aspect> 

    </aspects> 

</model> 

路徑:露天/ tomcat的/ webapps中/共享/ WEB-INF /類ES /戶外/

共享工作流表單-config.xml中

<!-- Leave Workflow Definition --> 
    <config evaluator="string-compare" condition="jbpm$wfl:leaveApproval"> 
     <forms> 
     <form> 
      <field-visibility> 
       <show id="bpm:workflowDescription" /> 
       <show id="bpm:workflowDueDate" /> 
       <show id="bpm:workflowPriority" /> 
       <show id="bpm:assignee" /> 
       <show id="packageItems" /> 
       <show id="bpm:sendEMailNotifications" /> 
      </field-visibility> 
      <appearance> 
       <set id="" appearance="title" label-id="workflow.set.general" /> 
       <set id="info" appearance="" template="/org/alfresco/components/form/2-column-set.ftl" /> 
       <set id="assignee" appearance="title" label-id="workflow.set.assignee" /> 
       <set id="items" appearance="title" label-id="workflow.set.items" /> 
       <set id="other" appearance="title" label-id="workflow.set.other" /> 

       <field id="bpm:workflowDescription" label-id="workflow.field.message"> 
        <control template="/org/alfresco/components/form/controls/textarea.ftl"> 
        <control-param name="style">width: 95%</control-param> 
        </control> 
       </field> 
       <field id="bpm:workflowDueDate" label-id="workflow.field.due" set="info" /> 
       <field id="bpm:workflowPriority" label-id="workflow.field.priority" set="info"> 
        <control template="/org/alfresco/components/form/controls/workflow/priority.ftl" /> 
       </field> 
       <field id="bpm:assignee" label-id="workflow.field.reviewer" set="assignee" /> 
       <field id="packageItems" set="items" /> 
       <field id="bpm:sendEMailNotifications" set="other"> 
        <control template="/org/alfresco/components/form/controls/workflow/email-notification.ftl" /> 
       </field> 
      </appearance> 
     </form> 
     </forms> 
    </config> 

    <config evaluator="string-compare" condition="activiti$activitileaveApproval"> 
     <forms> 
     <form> 
      <field-visibility> 
       <show id="bpm:workflowDescription" /> 
       <show id="bpm:workflowDueDate" /> 
       <show id="bpm:workflowPriority" /> 
       <show id="bpm:assignee" /> 
       <show id="packageItems" /> 
       <show id="bpm:sendEMailNotifications" /> 
      </field-visibility> 
      <appearance> 
       <set id="" appearance="title" label-id="workflow.set.general" /> 
       <set id="info" appearance="" template="/org/alfresco/components/form/2-column-set.ftl" /> 
       <set id="assignee" appearance="title" label-id="workflow.set.assignee" /> 
       <set id="items" appearance="title" label-id="workflow.set.items" /> 
       <set id="other" appearance="title" label-id="workflow.set.other" /> 

       <field id="bpm:workflowDescription" label-id="workflow.field.message"> 
        <control template="/org/alfresco/components/form/controls/textarea.ftl"> 
        <control-param name="style">width: 95%</control-param> 
        </control> 
       </field> 
       <field id="bpm:workflowDueDate" label-id="workflow.field.due" set="info"> 
        <control template="/org/alfresco/components/form/controls/date.ftl"> 
         <control-param name="showTime">false</control-param> 
         <control-param name="submitTime">false</control-param> 
        </control> 
       </field> 
       <field id="bpm:workflowPriority" label-id="workflow.field.priority" set="info"> 
        <control template="/org/alfresco/components/form/controls/workflow/priority.ftl" /> 
       </field> 
       <field id="bpm:assignee" label-id="workflow.field.reviewer" set="assignee" /> 
       <field id="packageItems" set="items" /> 
       <field id="bpm:sendEMailNotifications" set="other"> 
        <control template="/org/alfresco/components/form/controls/workflow/email-notification.ftl" /> 
       </field> 
      </appearance> 
     </form> 
     </forms> 
    </config> 

我無法理解,不管我在這個代碼共享工作流表單配置做什麼樣的變化。 xml,它不反映什麼時候去Share->我已經開始工作流程 - >選擇Leave Process。它總是顯示那裏的默認窗體。有人請指導我在這裏做錯了什麼。

+0

爲什麼是否創建jbpm和activiti流程定義? 如果你不需要jbpm,那麼只使用activiti並移除你的jbpm定義。 – alfrescian

+0

謝謝,我現在刪除它。我實際上是在編輯預製生命週期流程工作流程,所以只使用相同的代碼。每當我做任何改變時,我都能夠通過重新啓動tomcat來獲得共享工作流程中反映的變化。但是我覺得它很荒謬,可能是因爲我來自Web服務器端編程背景。 – Ricky

+0

有沒有可能一直使用工作流形式的UI,而無需一直重新啓動tomcat? – Ricky

回答

3

你需要用下面一行

<form id="workflow-details"> 

手段在你的表單標籤

0

添加屬性「身份證」在share-config進行更改後,必須重新啓動露天替換此

<form> 

:)

部署工作流程(通過workflow console),使工作流程定義(也喜歡的車型部署的只是重新部署,..)

<config evaluator="string-compare" condition="jbpm$wfl:leaveApproval"> 

是否應適用:d,爲什麼不工作沒有別的想法..