相信現在關(guān)注工作流的人越來(lái)越多了,我也是其中之一,上網(wǎng)狂搜了一下,發(fā)現很多人說(shuō)開(kāi)源的工作流OSWorkFlow還不錯,我也Download下載研究研究。
文檔很少,只有上網(wǎng)再搜,發(fā)現很多資料都是你轉載我,我轉載你,原創(chuàng )的不多。反來(lái)復去地看了看網(wǎng)上的資料,再看看OSWorkFlow的自帶文檔,調試帶的例子。
發(fā)現那個(gè)例子說(shuō)明性不是很強,把人弄得很暈,經(jīng)過(guò)一翻分析,我把例子修改了一下,添加了些注釋?zhuān)恍㎎SP頁(yè)面也修改了一下并進(jìn)行了漢化,設定了幾個(gè)用戶(hù)組,分別具有不同的權限,使工作流流轉起來(lái)真正象個(gè)工作流。希望能對剛開(kāi)始學(xué)習工作流的同志有所幫助。下面我貼出工作流定義的XML文件。完整的例子請到我的網(wǎng)絡(luò )硬盤(pán)下載。下載地址:http://wallimn.gbaopan.com
工作流文件內容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.6//EN" "<!--OSWorkFlow工作流定義文件修改 by 王力猛(wallimn@sohu.com)-->
<!--歡迎轉載,轉載請保留這些信息。-->
<workflow>
<initial-actions>
<action id="100" name="啟動(dòng)工作流">
<restrict-to>
<conditions type="AND">
<condition type="beanshell">
<arg name="script">true</arg>
</condition>
<condition type="class"><!--僅作家組可以啟動(dòng)流程-->
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">writer</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
</function>
</pre-functions>
<results><!--轉到step 1,流程所有者設為流程啟動(dòng)者-->
<unconditional-result old-status="Finished" status="Underway" step="1" owner="${caller}"/>
</results>
</action>
</initial-actions>
<steps>
<step id="1" name="撰寫(xiě)初稿">
<external-permissions>
<permission name="permA">
<restrict-to>
<conditions type="AND">
<condition type="class"><!--流程處于Underway狀態(tài)(流程已經(jīng)啟動(dòng))-->
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class"><!--流程啟動(dòng)者(也即流程所有者)-->
<arg name="class.name">com.opensymphony.workflow.util.AllowOwnerOnlyCondition</arg>
</condition>
</conditions>
</restrict-to>
</permission>
</external-permissions>
<actions>
<action id="1" name="完成初稿">
<restrict-to>
<conditions type="AND">
<condition type="beanshell">
<arg name="script">true</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.AllowOwnerOnlyCondition</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="beanshell">
<arg name="script">
String caller = context.getCaller();
propertySet.setString("caller", caller);
boolean test = true;
String yuck = null;
String blah = "987654321";
System.out.println("Step:1預處理函數");
</arg>
</function>
</pre-functions>
<results>
<result old-status="Finished" split="1">
<conditions type="AND"><!--如果是新手(假定新手的用戶(hù)名為newplayer),流轉到分枝1-->
<condition type="beanshell">
<arg name="script">
propertySet.getString("caller").equals("newplayer")
</arg>
</condition>
</conditions>
<post-functions>
<function type="beanshell">
<arg name="script">
System.out.println("Step:1的Action后處理函數");
</arg>
</function>
</post-functions>
</result>
<unconditional-result old-status="Finished" split="2"/><!--其余情況跳轉到分枝2-->
</results>
<post-functions>
<function type="beanshell">
<arg name="script">
System.out.println("Step:2的后處理函數");
</arg>
</function>
<!--
<function type="class">
<arg name="class.name">com.opensymphony.workflow.util.ScheduleJob</arg>
<arg name="triggerId">1</arg>
<arg name="jobName">testJob</arg>
<arg name="triggerName">testTrigger</arg>
<arg name="groupName">test</arg>
<arg name="repeat">10</arg>
<arg name="repeatDelay">2000</arg>
<arg name="cronExpression">0,5,10,15,20,25,30,35,40,45,50,55 * * * * ?</arg>
<arg name="username">test</arg>
<arg name="password">test</arg>
<arg name="local">true</arg>
<arg name="schedulerStart">true</arg>
</function>
-->
</post-functions>
</action>
</actions>
</step>
<step id="2" name="校對稿件"><!--稿件都弄好了,校對一下吧-->
<external-permissions>
<permission name="permB">
<restrict-to>
<conditions type="AND">
<condition type="class"><!--狀態(tài)為Underway-->
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class"><!--僅允許editor組的成員-->
<argname="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">editor</arg>
</condition>
</conditions>
</restrict-to>
</permission>
</external-permissions>
<actions>
<action id="2" name="準備校對積壓的稿件"><!--從隊列中提取,準備校對-->
<restrict-to>
<conditions type="AND">
<condition type="class"><!--隊列中-->
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Queued</arg>
</condition>
<condition type="class"><!--僅允許editor組的成員-->
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">editor</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class"><!--設置caller變量為執行當前action的用戶(hù)-->
<arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
</function>
</pre-functions>
<results><!--狀態(tài)變?yōu)閁nderway-->
<unconditional-result old-status="Finished" status="Underway" step="2" owner="${caller}"/>
</results>
</action>
<action id="3" name="校對完成"><!--檢驗完成,流轉到下一步-->
<restrict-to>
<conditions type="AND">
<condition type="class"><!--處理當前的任務(wù)(也就是說(shuō)不在隊列中的)-->
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class"><!--僅允許editor組的成員-->
<argname="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">editor</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class"><!--設置mostRecentOwner的值為第一階段時(shí)的Owner-->
<arg name="class.name">com.opensymphony.workflow.util.MostRecentOwner</arg>
<arg name="stepId">1</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Underway" step="3" owner="${mostRecentOwner}"/>
</results>
</action>
<action id="4" name="處理不過(guò)來(lái)了,等一等"><!--還有幾個(gè)沒(méi)有下理,排一下隊,等我空閑了再說(shuō)吧-->
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class"><!--僅允許editor組的成員-->
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">editor</arg>
</condition>
</conditions>
</restrict-to>
<results><!--轉為排隊等候狀態(tài)-->
<unconditional-result old-status="Finished" status="Queued" step="2"/>
</results>
</action>
</actions>
</step>
<step id="3" name="檢查校對情況">
<external-permissions>
<permission name="permA">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class"><!--publisher組的成員來(lái)檢查-->
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">publisher</arg>
</condition>
</conditions>
</restrict-to>
</permission>
</external-permissions>
<actions>
<action id="5" name="重新校對"><!--錯誤比較多,重新校對-->
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">publisher</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<arg name="class.name">com.opensymphony.workflow.util.MostRecentOwner</arg>
<arg name="stepId">2</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Underway" step="2" owner="${mostRecentOwner}"/>
</results>
</action>
<action id="6" name="需要二審"><!--需要二審-->
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">publisher</arg>
</condition>
</conditions>
</restrict-to>
<results><!--轉入二審階段-->
<unconditional-result old-status="Finished" status="Queued" step="4"/>
</results>
</action>
<action id="7" name="可以出版了"><!--可以了,準備出版-->
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">publisher</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<arg name="class.name">com.opensymphony.workflow.util.MostRecentOwner</arg>
<arg name="stepId">2</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Underway" step="5" owner="${mostRecentOwner}"/>
</results>
</action>
</actions>
</step>
<step id="4" name="二審階段"><!--二審階段-->
<external-permissions>
<permission name="permC">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">publisher</arg>
</condition>
</conditions>
</restrict-to>
</permission>
</external-permissions>
<actions>
<action id="8" name="二審通過(guò)"><!--二審通過(guò),轉到step2,等候出版-->
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">publisher</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<arg name="class.name">com.opensymphony.workflow.util.MostRecentOwner</arg>
<arg name="stepId">3</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Underway" step="3" owner="${mostRecentOwner}"/>
</results>
</action>
<action id="9" name="從排隊中取出準備二審"><!--仍停留在此階段-->
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Queued</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">publisher</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Underway" step="4" owner="${caller}"/>
</results>
</action>
<action id="10" name="好多要二審的,排隊等等">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">publisher</arg>
</condition>
</conditions>
</restrict-to>
<results><!--變?yōu)榕抨牋顟B(tài)-->
<unconditional-result old-status="Finished" status="Queued" step="4"/>
</results>
</action>
</actions>
</step>
<step id="5" name="出版稿件">
<actions>
<action id="11" name="出版">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">publisher</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Finished" step="5" owner="${caller}"/>
</results>
</action>
</actions>
</step>
<step id="6" name="設計封面">
<actions>
<action name="封面設計完成" id="12">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
<arg name="stepId">6</arg>
</condition>
<condition type="class"><!--僅允許美工組-->
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">designer</arg>
</condition>
</conditions>
</restrict-to>
<results>
<unconditional-result old-status="Finished" join="1"/>
</results>
</action>
</actions>
</step>
<step id="7" name="設計插圖">
<actions>
<action name="插圖設計完畢" id="13">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
<arg name="stepId">7</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">designer</arg>
</condition>
</conditions>
</restrict-to>
<results>
<unconditional-result old-status="Finished" owner="test" status="Underway" step="8"/>
</results>
</action>
</actions>
</step>
<step id="8" name="排版">
<actions>
<action name="排版完畢" id="14">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Underway</arg>
<arg name="stepId">8</arg>
</condition>
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
<arg name="group">designer</arg>
</condition>
</conditions>
</restrict-to>
<results>
<unconditional-result old-status="Finished" join="1"/>
</results>
</action>
</actions>
</step>
</steps>
<splits>
<split id="1">
<unconditional-result old-status="Finished" status="Underway" owner="test" step="6"/>
<unconditional-result old-status="Finished" status="Underway" owner="test" step="7"/>
</split>
<split id="2">
<unconditional-result old-status="Finished" status="Queued" step="2"/>
</split>
</splits>
<joins>
<join id="1">
<conditions type="AND">
<condition type="beanshell">
<arg name="script"><![CDATA[
"Finished".equals(jn.getStep(6).getStatus()) && "Finished".equals(jn.getStep(8).getStatus())
]]></arg>
</condition>
</conditions>
<unconditional-result old-status="Finished" status="Underway" owner="test" step="2"/>
</join>
</joins>
</workflow>
聯(lián)系客服