2017-02-15 35 views
0

根據Potts先生親切提供的example,我開發了合同批准系統。如何正確聲明,更改和使用工作流程變量?

下面介紹BPMN表示法中的業務流程。

通過Activiti Eclipse BPMN 2.0 Designer

enter image description here

正在運行的業務流程的露天的方案:

enter image description here

要創建我用的Activiti Eclipse的BPMN 2.0設計者5.18 Activiti的圖。這裏是一個由該插件生成過程的描述:

<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> 
    <process id="contractsApproval" name="Contracts Approval" isExecutable="true"> 
    <startEvent id="startevent1" name="Start" activiti:formKey="scwf:submitReviewTask"></startEvent> 
    <endEvent id="endevent1" name="End"></endEvent> 
    <userTask id="usertask1" name="Approval of the first group" activiti:candidateGroups="GROUP_First" activiti:formKey="scwf:activitiFirstReview"> 
     <extensionElements> 
     <activiti:taskListener event="complete" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener"> 
      <activiti:field name="script"> 
      <activiti:string><![CDATA[if(task.getVariableLocal('scwf_approveRejectOutcome') == 'Approve') { 
          var newApprovedCount = scwf_approveCount + 1; 
          execution.setVariable('scwf_approveCount', newApprovedCount); 
         }]]></activiti:string> 
      </activiti:field> 
     </activiti:taskListener> 
     </extensionElements> 
    </userTask> 
    <userTask id="usertask3" name="Revise" activiti:assignee="${initiator.properties.userName}" activiti:formKey="scwf:activitiRevise"> 
     <extensionElements> 
     <activiti:taskListener event="complete" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener"> 
      <activiti:field name="script"> 
      <activiti:string><![CDATA[if(task.getVariableLocal('scwf_reviseOutcome') == 'Re-submit') { 
        execution.setVariable('scwf_resubmit', true); 
        } else { 
        execution.setVariable('scwf_resubmit', false); 
        }]]></activiti:string> 
      </activiti:field> 
     </activiti:taskListener> 
     </extensionElements> 
    </userTask> 
    <userTask id="usertask4" name="Approval of the second group" activiti:candidateGroups="GROUP_Second" activiti:formKey="scwf:activitiSecondReview"> 
     <extensionElements> 
     <activiti:taskListener event="complete" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener"> 
      <activiti:field name="script"> 
      <activiti:string><![CDATA[if(task.getVariableLocal('scwf_approveRejectOutcome') == 'Approve') { 
          var newApprovedCount = scwf_approveCount + 1; 
          execution.setVariable('scwf_approveCount', newApprovedCount); 
         } 
     ]]></activiti:string> 
      </activiti:field> 
     </activiti:taskListener> 
     </extensionElements> 
    </userTask> 
    <serviceTask id="scripttask1" name="Send a document for approval" activiti:class="org.alfresco.repo.workflow.activiti.script.AlfrescoScriptDelegate"> 
     <extensionElements> 
     <activiti:field name="runAs"> 
      <activiti:string><![CDATA[admin]]></activiti:string> 
     </activiti:field> 
     <activiti:field name="script"> 
      <activiti:string><![CDATA[execution.setVariable('scwf_approveCount', 0); 
      execution.setVariable('scwf_tpApproved', false);]]></activiti:string> 
     </activiti:field> 
     </extensionElements> 
    </serviceTask> 
    <parallelGateway id="parallelgateway1" name="Parallel Gateway"></parallelGateway> 
    <parallelGateway id="parallelgateway2" name="Parallel Gateway"></parallelGateway> 
    <exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway> 
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="scripttask1"></sequenceFlow> 
    <sequenceFlow id="flow2" sourceRef="scripttask1" targetRef="parallelgateway1"></sequenceFlow> 
    <sequenceFlow id="flow3" sourceRef="parallelgateway1" targetRef="usertask1"></sequenceFlow> 
    <sequenceFlow id="flow4" sourceRef="parallelgateway1" targetRef="usertask4"></sequenceFlow> 
    <sequenceFlow id="flow5" sourceRef="usertask1" targetRef="parallelgateway2"></sequenceFlow> 
    <sequenceFlow id="flow6" sourceRef="usertask4" targetRef="parallelgateway2"></sequenceFlow> 
    <sequenceFlow id="flow7" sourceRef="parallelgateway2" targetRef="exclusivegateway1"></sequenceFlow> 
    <sequenceFlow id="flow9" sourceRef="exclusivegateway1" targetRef="usertask3"> 
     <conditionExpression xsi:type="tFormalExpression"><![CDATA[${scwf_approveCount < 2}]]></conditionExpression> 
    </sequenceFlow> 
    <sequenceFlow id="flow13" sourceRef="usertask3" targetRef="scripttask1"> 
     <conditionExpression xsi:type="tFormalExpression"><![CDATA[${scwf_resubmit == true}]]></conditionExpression> 
    </sequenceFlow> 
    <userTask id="usertask5" name="Approved Notification" activiti:assignee="${initiator.properties.userName}" activiti:formKey="scwf:activitiApprovedNotification"> 
     <extensionElements> 
     <activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener"> 
      <activiti:field name="script"> 
      <activiti:string><![CDATA[var setWebFlagAction = actions.create("set-web-flag"); 
         setWebFlagAction.parameters["active"] = true; 
         for (var i = 0; i < bpm_package.children.length; i++) { 
          logger.log("Approving node:" + bpm_package.children[i].nodeRef); 
          setWebFlagAction.execute(bpm_package.children[i]); 
         }]]></activiti:string> 
      </activiti:field> 
     </activiti:taskListener> 
     </extensionElements> 
    </userTask> 
    <sequenceFlow id="flow15" sourceRef="usertask5" targetRef="endevent1"></sequenceFlow> 
    <sequenceFlow id="flow16" sourceRef="usertask3" targetRef="endevent1"> 
     <conditionExpression xsi:type="tFormalExpression"><![CDATA[${scwf_resubmit == false}]]></conditionExpression> 
    </sequenceFlow> 
    <sequenceFlow id="flow17" sourceRef="exclusivegateway1" targetRef="usertask5"></sequenceFlow> 
    </process> 
    <bpmndi:BPMNDiagram id="BPMNDiagram_contractsApproval"> 
    <bpmndi:BPMNPlane bpmnElement="contractsApproval" id="BPMNPlane_contractsApproval"> 
     <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> 
     <omgdc:Bounds height="35.0" width="35.0" x="0.0" y="163.0"></omgdc:Bounds> 
     </bpmndi:BPMNShape> 
     <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> 
     <omgdc:Bounds height="35.0" width="35.0" x="790.0" y="164.0"></omgdc:Bounds> 
     </bpmndi:BPMNShape> 
     <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"> 
     <omgdc:Bounds height="75.0" width="105.0" x="330.0" y="96.0"></omgdc:Bounds> 
     </bpmndi:BPMNShape> 
     <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3"> 
     <omgdc:Bounds height="55.0" width="105.0" x="310.0" y="360.0"></omgdc:Bounds> 
     </bpmndi:BPMNShape> 
     <bpmndi:BPMNShape bpmnElement="usertask4" id="BPMNShape_usertask4"> 
     <omgdc:Bounds height="78.0" width="105.0" x="330.0" y="193.0"></omgdc:Bounds> 
     </bpmndi:BPMNShape> 
     <bpmndi:BPMNShape bpmnElement="scripttask1" id="BPMNShape_scripttask1"> 
     <omgdc:Bounds height="89.0" width="121.0" x="60.0" y="136.0"></omgdc:Bounds> 
     </bpmndi:BPMNShape> 
     <bpmndi:BPMNShape bpmnElement="parallelgateway1" id="BPMNShape_parallelgateway1"> 
     <omgdc:Bounds height="40.0" width="40.0" x="230.0" y="162.0"></omgdc:Bounds> 
     </bpmndi:BPMNShape> 
     <bpmndi:BPMNShape bpmnElement="parallelgateway2" id="BPMNShape_parallelgateway2"> 
     <omgdc:Bounds height="40.0" width="40.0" x="480.0" y="160.0"></omgdc:Bounds> 
     </bpmndi:BPMNShape> 
     <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1"> 
     <omgdc:Bounds height="40.0" width="40.0" x="568.0" y="160.0"></omgdc:Bounds> 
     </bpmndi:BPMNShape> 
     <bpmndi:BPMNShape bpmnElement="usertask5" id="BPMNShape_usertask5"> 
     <omgdc:Bounds height="68.0" width="105.0" x="640.0" y="147.0"></omgdc:Bounds> 
     </bpmndi:BPMNShape> 
     <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> 
     <omgdi:waypoint x="35.0" y="180.0"></omgdi:waypoint> 
     <omgdi:waypoint x="60.0" y="180.0"></omgdi:waypoint> 
     </bpmndi:BPMNEdge> 
     <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> 
     <omgdi:waypoint x="181.0" y="180.0"></omgdi:waypoint> 
     <omgdi:waypoint x="230.0" y="182.0"></omgdi:waypoint> 
     </bpmndi:BPMNEdge> 
     <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"> 
     <omgdi:waypoint x="250.0" y="162.0"></omgdi:waypoint> 
     <omgdi:waypoint x="250.0" y="137.0"></omgdi:waypoint> 
     <omgdi:waypoint x="330.0" y="133.0"></omgdi:waypoint> 
     </bpmndi:BPMNEdge> 
     <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"> 
     <omgdi:waypoint x="250.0" y="202.0"></omgdi:waypoint> 
     <omgdi:waypoint x="250.0" y="233.0"></omgdi:waypoint> 
     <omgdi:waypoint x="330.0" y="232.0"></omgdi:waypoint> 
     </bpmndi:BPMNEdge> 
     <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5"> 
     <omgdi:waypoint x="435.0" y="133.0"></omgdi:waypoint> 
     <omgdi:waypoint x="500.0" y="137.0"></omgdi:waypoint> 
     <omgdi:waypoint x="500.0" y="160.0"></omgdi:waypoint> 
     </bpmndi:BPMNEdge> 
     <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6"> 
     <omgdi:waypoint x="435.0" y="232.0"></omgdi:waypoint> 
     <omgdi:waypoint x="500.0" y="233.0"></omgdi:waypoint> 
     <omgdi:waypoint x="500.0" y="200.0"></omgdi:waypoint> 
     </bpmndi:BPMNEdge> 
     <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7"> 
     <omgdi:waypoint x="520.0" y="180.0"></omgdi:waypoint> 
     <omgdi:waypoint x="568.0" y="180.0"></omgdi:waypoint> 
     </bpmndi:BPMNEdge> 
     <bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9"> 
     <omgdi:waypoint x="588.0" y="200.0"></omgdi:waypoint> 
     <omgdi:waypoint x="362.0" y="360.0"></omgdi:waypoint> 
     </bpmndi:BPMNEdge> 
     <bpmndi:BPMNEdge bpmnElement="flow13" id="BPMNEdge_flow13"> 
     <omgdi:waypoint x="362.0" y="360.0"></omgdi:waypoint> 
     <omgdi:waypoint x="120.0" y="225.0"></omgdi:waypoint> 
     </bpmndi:BPMNEdge> 
     <bpmndi:BPMNEdge bpmnElement="flow15" id="BPMNEdge_flow15"> 
     <omgdi:waypoint x="745.0" y="181.0"></omgdi:waypoint> 
     <omgdi:waypoint x="790.0" y="181.0"></omgdi:waypoint> 
     </bpmndi:BPMNEdge> 
     <bpmndi:BPMNEdge bpmnElement="flow16" id="BPMNEdge_flow16"> 
     <omgdi:waypoint x="415.0" y="387.0"></omgdi:waypoint> 
     <omgdi:waypoint x="598.0" y="387.0"></omgdi:waypoint> 
     <omgdi:waypoint x="807.0" y="199.0"></omgdi:waypoint> 
     </bpmndi:BPMNEdge> 
     <bpmndi:BPMNEdge bpmnElement="flow17" id="BPMNEdge_flow17"> 
     <omgdi:waypoint x="608.0" y="180.0"></omgdi:waypoint> 
     <omgdi:waypoint x="640.0" y="181.0"></omgdi:waypoint> 
     </bpmndi:BPMNEdge> 
    </bpmndi:BPMNPlane> 
    </bpmndi:BPMNDiagram> 
</definitions> 

這裏是工作流程的內容模型:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Definition of new Model --> 
<model name="scwf:workflowModel" 
     xmlns="http://www.alfresco.org/model/dictionary/1.0"> 

    <!-- Optional meta-data about the model --> 
    <description>...</description> 
    <author>...</author> 
    <version>...</version> 

    <!-- Imports are required to allow references to definitions in other models --> 
    <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" /> 
    </imports> 

    <!-- Introduction of new namespaces defined by this model --> 
    <namespaces> 
     <namespace uri="http://.../model/workflow/1.0" prefix="scwf" /> 
    </namespaces> 

    <types> 

     <type name="scwf:submitReviewTask"> 
      <parent>bpm:startTask</parent> 
     </type> 

     <type name="scwf:activitiFirstReview"> 
      <parent>scwf:activitiReviewTask</parent> 
     </type> 

     <type name="scwf:activitiSecondReview"> 
      <parent>scwf:activitiReviewTask</parent> 
     </type> 

     <type name="scwf:activitiRevise"> 
      <parent>bpm:activitiOutcomeTask</parent> 
      <properties> 
       <property name="scwf:reviseOutcome"> 
        <type>d:text</type> 
        <default>Abort</default> 
        <constraints> 
         <constraint type="LIST"> 
          <parameter name="allowedValues"> 
           <list> 
            <value>Re-submit</value> 
            <value>Abort</value> 
           </list> 
          </parameter> 
         </constraint> 
        </constraints> 
       </property> 
      </properties>    
      <overrides> 
       <property name="bpm:packageItemActionGroup"> 
        <default>edit_package_item_actions</default> 
       </property> 
       <property name="bpm:outcomePropertyName"> 
        <default>{http://.../model/workflow/1.0}reviseOutcome</default> 
       </property> 
      </overrides> 
     </type> 

     <type name="scwf:activitiReviewTask"> 
      <parent>bpm:activitiOutcomeTask</parent> 
      <properties> 
       <property name="scwf:approveRejectOutcome"> 
        <type>d:text</type> 
        <default>Reject</default> 
        <constraints> 
         <constraint type="LIST"> 
          <parameter name="allowedValues"> 
           <list> 
            <value>Approve</value> 
            <value>Reject</value> 
           </list> 
          </parameter> 
         </constraint> 
        </constraints> 
       </property> 
      </properties>    
      <overrides> 
       <property name="bpm:packageItemActionGroup"> 
        <default>read_package_item_actions</default> 
       </property> 
       <property name="bpm:outcomePropertyName"> 
        <default>{http://.../model/workflow/1.0}approveRejectOutcome</default> 
       </property> 
      </overrides> 
     </type> 

     <type name="scwf:activitiApprovedNotification"> 
      <parent>bpm:workflowTask</parent> 
      <overrides> 
       <property name="bpm:packageItemActionGroup"> 
        <default>read_package_item_actions</default> 
       </property> 
      </overrides>    
     </type> 
    </types> 
</model> 

在我的本地計算機上安裝:

露天Share v5.2.d(r134641-b15,Aikau 1.0.101.3,Spring Surf 5.2.d,Spring WebScripts 6.13,Freemarker 2.3.20-露天補丁,Rhino 1.7R4露天補丁,Yui 2.9.0-alfresco -20141223)

露天社區V5.2.0(r134428-B13)架構10005

,一切工作正常...

然而,當我安裝系統的服務器,上發生的問題,即:

露天分享v5.2.c(r133673-B12,Aikau 1.0.99,春衝浪5.2.c, 春WebScripts 6.11,Freemarker的2.3.20-露天打補丁,犀牛 1.7R4,露天打補丁,Yui 2.9.0-alfresco-20141223)

露天社區V5.2.0(r133656-B12)架構10005

在審批的過程中,我得到這個錯誤信息:

org.activiti.engine.ActivitiException:未知屬性在 表達式中使用:$ {scwf_approveCount < 2}

NB:將出現錯誤只有在下一組處理之後(無論是第一個還是第二個) - 例如,如果合同批准/被第一組拒絕,那麼第二組既不能批准也不能拒絕。

門戶ecmarchitect說:

「你可能會奇怪,爲什麼這是一個服務任務,而不是一個腳本任務在5.0.d,在Activiti的底層JavaScript引擎從犀牛切換到犀牛。這導致了與設置執行變量相關的問題。解決方法是使用一個服務任務「

,並顯示瞭如何初始化變量的例子:

<serviceTask id="scripttask1" name="Submit" activiti:class="org.alfresco.repo.workflow.activiti.script.AlfrescoScriptDelegate"> 
    <extensionElements> 
    <activiti:field name="script"> 
     <activiti:string><![CDATA[execution.setVariable('scwf_approveCount', 0); 
      execution.setVariable('scwf_tpApproved', false);]]></activiti:string> 
    </activiti:field> 
    </extensionElements> 
</serviceTask> 

我發現這個多次討論,但沒有在其中描述的方法沒幫助我的情況:

例如,我試圖通過這些方式來初始化變量:

... 

<scriptTask id="scripttask1" name="Submit" scriptFormat="javascript" activiti:autoStoreVariables="true"> 
    <script>var scwf_approveCount = 0; var scwf_tpApproved = false;</script> 
</scriptTask> 

... 

<scriptTask id="scripttask1" name="Submit" scriptFormat="javascript"> 
<script><![CDATA[var scwf_approveCount = 0; var scwf_tpApproved = 
false;]]></script> 
</scriptTask> 

... 

<scriptTask id="scripttask1" name="Submit" scriptFormat="javascript" activiti:autoStoreVariables="true"> 
    <script>execution.setVariable('scwf_approveCount', 0); execution.setVariable('scwf_tpApproved', false);</script> 
</scriptTask> 

... 

我認爲I N eed在服務器上重新安裝Alfresco以匹配本地安裝。

有沒有解決這個問題的另一種方法?我將非常感激這些信息。謝謝大家。


其他信息:我安裝了完全相同的系統。在服務器和我的本地計算機上:

露天分享v5.2.d(r134641-B15,Aikau 1.0.101.3,春衝浪 5.2.d,春天WebScripts 6.13,Freemarker的2.3.20-alfresco-打補丁,犀牛1.7R4,露天打補丁,衣2.9.0-露天-20141223)

露天社區V5.2.0(r134428-B13)架構10005

但它是非常奇怪的 - 當地一切正常但在服務器上我再次得到相同的錯誤:

org.activiti.engine.ActivitiException:在 表達式中使用未知的屬性:$ {scwf_approveCount < 2}

我比較了圖中和在底層XML數據和它們是相同的。

+0

來自[Axel Faust]的非常有用的信息(https://community.alfresco.com/people/afaust) - [我可以使用工作流模型的前綴作爲未映射到內容模型中的流程變量嗎?] (HTTPS://community.alfresco。COM /線程/ 228311燦我使用前綴的最工作流模型換的過程變量,也就是說,是 - 未映射功能於該內容模型#帶註釋808244) –

回答

1

scwf_approveCount您正在使用該屬性確保你已經在你的工作流模型文件scwf定義這個屬性:approveCount 您正在使用該屬性scwf_approveCount,它可能在你的模型文件中沒有定義。

+0

非常感謝您的回答!..好主意。明天早上將在辦公室進行檢查。 –

+0

呃..我查過了。但據我瞭解,這是過程*的*變量,它並不需要在模型聲明...這個變量是通過'execution.setVariable()'調用設置。 –

+0

我的權利。例如,'scwf_approveRejectOutcome'變量映射到了'scwf定義的屬性:activitiReviewTask'類型... –