0 引言
作為PDM系統(tǒng)的重要組成部分,工作流管理有利于工作流的建立與執(zhí)行,從而達(dá)到簡化業(yè)務(wù)流程的目的。然而,現(xiàn)有的工作流管理解決方案是用來處理靜態(tài)業(yè)務(wù)流程。當(dāng)一個工作流程發(fā)生變化的時(shí)候,這些解決方案會完全中止執(zhí)行受到影響的工作流程實(shí)例,然后從頭開始執(zhí)行修改過的工作流程實(shí)例。這種簡單化的解決方案會導(dǎo)致任務(wù)已經(jīng)完成的工作流節(jié)點(diǎn)被重復(fù)執(zhí)行,從而造成系統(tǒng)資源的浪費(fèi)。目前許多學(xué)者對工作流的研究大多局限于工作流建模,有關(guān)動態(tài)工作流變化的問題卻沒有得到很好的解決,現(xiàn)存的解決方案不能夠?yàn)楣芾砉ぷ髁髯兓峁┯行У姆椒。因此,對PDM系統(tǒng)中動態(tài)工作流變化的分析與研究是十分必要的。
1 PDM系統(tǒng)中工作流的表達(dá)
工作流是一類能夠完全或部分自動執(zhí)行的業(yè)務(wù)過程,根據(jù)一系列過程規(guī)則,文檔、信息或任務(wù)能夠在不同的執(zhí)行者傳遞、執(zhí)行。作為一種計(jì)算機(jī)化的業(yè)務(wù)流程,工作流可以采用Petri網(wǎng)(Petri Net,PN)、有向圖(Directed Network Graph,DNG)等許多正式方法對其建模。因?yàn)榛谟邢驁D的表達(dá)形式被廣泛的應(yīng)用在各種業(yè)務(wù)平臺中,所以本文采用它來實(shí)現(xiàn)工作流程平臺。于是,一個工作流W可以用一個二元組(N,C)來表示,其中N={n1,n2,…)為工作流中的各個活動,在工作流模型中表現(xiàn)為節(jié)點(diǎn):C={c1,c2,…}為各個活動間的次序關(guān)系,在工作流模型中表現(xiàn)為節(jié)點(diǎn)間的連接線。圖1舉例說明了一個簡單的工作流W=(N,C),其中N={n0,n1,n2,n3,n4),C={c0,c1,c2,c3,c4}。如果連接線c指向節(jié)點(diǎn)n,那么c是節(jié)點(diǎn)n的輸入連接線;反之c是節(jié)點(diǎn)n的輸出連接線。每一個節(jié)點(diǎn)n又可以用一個四元組(t,u,Ci,Co)來表示,其中t代表相關(guān)任務(wù),u代表相關(guān)用戶,Ci代表所有輸入連接線,Co代表所有輸出連接線。每一條連接線c由一個三元組(r,ns,ne)表示,其中r是關(guān)于c的響應(yīng),ns是連接線c的開始節(jié)點(diǎn),ne是連接線c的結(jié)束節(jié)點(diǎn),節(jié)點(diǎn)ns是節(jié)點(diǎn)ne的前節(jié)點(diǎn),節(jié)點(diǎn)ne是節(jié)點(diǎn)ns的后節(jié)點(diǎn)。一條連接線的響應(yīng)類型決定了它的觸發(fā)條件,假如一個節(jié)點(diǎn)被成功執(zhí)行,則它的輸出連接線將會觸發(fā)“接受”響應(yīng),否則其連接線將會觸發(fā)“拒絕”響應(yīng)。圖2提供了一個帶有不同響應(yīng)連接線的示例。
圖1 由五個節(jié)點(diǎn)和五條連接線組成的一個簡單的工作流
圖2 兩種響應(yīng)類型:“接受”和“拒絕”
在實(shí)際的工作流管理系統(tǒng)中,工作流被定義成模板或圖示的形式。當(dāng)一個工作流模板被初始化,它就被稱之為實(shí)例。任何時(shí)候,一個工作流實(shí)例中的所有節(jié)點(diǎn)可以按照狀態(tài)的不同劃分為三種類型:就緒提交節(jié)點(diǎn),等待執(zhí)行節(jié)點(diǎn),已完成節(jié)點(diǎn)。工作流實(shí)例中節(jié)點(diǎn)的狀態(tài)在執(zhí)行過程中會發(fā)生變化,節(jié)點(diǎn)不同狀態(tài)間的轉(zhuǎn)換如圖3所示。
圖3 狀態(tài)轉(zhuǎn)換
每個節(jié)點(diǎn)的初始狀都是“就緒提交”,當(dāng)此狀態(tài)的節(jié)點(diǎn)被其用戶開發(fā)來執(zhí)行時(shí),這時(shí)節(jié)點(diǎn)狀態(tài)為“等待執(zhí)行”。如果節(jié)點(diǎn)被成功執(zhí)行,它的狀態(tài)就轉(zhuǎn)化成“完成”,否則就變成“就緒提交”狀態(tài)。必須引起注意的是,有一些節(jié)點(diǎn)可能由于“拒絕”響應(yīng)而被多次執(zhí)行。理想狀態(tài)為,工作流實(shí)例應(yīng)該是未受中斷影響而一直執(zhí)行完成。然而,工作流變化會在實(shí)際的工程環(huán)境中發(fā)生。一個工作流實(shí)例的變化通常有可能是:1)節(jié)點(diǎn)的增加或去除;2)連接線的增加或去除:3)節(jié)點(diǎn)屬性的修改。一旦工作流實(shí)例受上述變化的影響,它將被迫中止執(zhí)行。此后,這種變化會應(yīng)用于受影響的工作流實(shí)例。通常情況下,修改后的工作流模板將會用來初始化工作流實(shí)例,并且該實(shí)例將重新啟動。在普通工作流管理系統(tǒng)中,重啟工作流實(shí)例將會導(dǎo)致所有節(jié)點(diǎn)回到初始狀態(tài),而不論這些節(jié)點(diǎn)現(xiàn)有狀態(tài)情況。這是一種消極的處理方式,因?yàn)樗性谥貑?shí)例中的節(jié)點(diǎn)都將再執(zhí)行一次。
2 節(jié)點(diǎn)識別
為了方便動態(tài)工作流變化的管理,主要依據(jù)以下三個條件對節(jié)點(diǎn)進(jìn)行識別,依次對這三個條件識別完成后,才能確定節(jié)點(diǎn)n在新工作流實(shí)例中是否需要重新執(zhí)行。這三個條件為:
1)節(jié)點(diǎn)n的屬性和連接線(觸發(fā)條件)是否發(fā)生了變化,即節(jié)點(diǎn)是否為未變節(jié)點(diǎn);
2)節(jié)點(diǎn)n的任務(wù)是否已經(jīng)完成,即節(jié)點(diǎn)n是否為完成節(jié)點(diǎn);
3)節(jié)點(diǎn)n的所有前節(jié)點(diǎn)是否都不需要重新執(zhí)行,即節(jié)點(diǎn)n的所有前節(jié)點(diǎn)是否都為可繞開節(jié)點(diǎn)。
2.1 未變節(jié)點(diǎn)的識別
假設(shè)一個工作流模板T1,一個被初始化的工作流實(shí)例W1。當(dāng)執(zhí)行W1時(shí),工作流模板T1改變成T2,一個新工作流實(shí)例W2在模板T2中被初始化,用來取代工作流實(shí)例W1。對于實(shí)例W1中的任何一個節(jié)點(diǎn)n可能發(fā)生屬性改變或連接線改變。如果該節(jié)點(diǎn)的位置在實(shí)例W2中發(fā)生了改變,事實(shí)上就是該節(jié)點(diǎn)的連接線發(fā)生了改變,因此該節(jié)點(diǎn)屬于第二種情況。假設(shè)節(jié)點(diǎn)n在新工作流實(shí)例W2中發(fā)生了改變,并且它的名稱也變化了,那么該節(jié)點(diǎn)被認(rèn)定為一個新節(jié)點(diǎn)。
2.1.1 節(jié)點(diǎn)屬性變化的識別
在工作流實(shí)例中,一個節(jié)點(diǎn)的屬性主要包括任務(wù)與用戶兩個部分。如果任務(wù)發(fā)生了變化,那么該節(jié)點(diǎn)應(yīng)當(dāng)識別為變化的。如果節(jié)點(diǎn)的用戶發(fā)生了改變,那么該節(jié)點(diǎn)可以認(rèn)為沒有變化。因?yàn)橛脩舻母淖儾粫绊懝?jié)點(diǎn)的狀態(tài),如果節(jié)點(diǎn)的任務(wù)已經(jīng)完成了,那么在新的工作流實(shí)例中,新用戶就不用去執(zhí)行該任務(wù)了;如果節(jié)點(diǎn)處于就緒提交狀態(tài)或等待執(zhí)行狀態(tài),不論用戶改變與否,它在新工作流實(shí)例中都要被執(zhí)行。
因?yàn)楣?jié)點(diǎn)的用戶名具有唯一索引,所以發(fā)現(xiàn)節(jié)點(diǎn)用戶的改變是比較容易的,而發(fā)現(xiàn)節(jié)點(diǎn)任務(wù)的改變卻是比較困難。一般的,節(jié)點(diǎn)的任務(wù)可能由人工或系統(tǒng)自動產(chǎn)生。人工產(chǎn)生的任務(wù)往往用來代表一系列描述信息或文檔(包括文本和圖形),因此通過比較描述信息或文檔標(biāo)識(文檔編號、大小、修改時(shí)間等)可以比較容易的區(qū)分兩個人工產(chǎn)生的任務(wù)。如果任務(wù)是由系統(tǒng)自動的生成的,它實(shí)際上是一個可以調(diào)用的計(jì)算機(jī)程序。通過比較兩個計(jì)算機(jī)程序的全路徑(如果它們都是本地可執(zhí)行文件)或統(tǒng)一資源定位(如果它們來自遠(yuǎn)程服務(wù)器的調(diào)用),可以明確的把它們區(qū)分開來。然而,應(yīng)該有一種方法用來檢查這種情況:當(dāng)計(jì)算機(jī)程序發(fā)生了變化而它的全路徑或統(tǒng)一資源定位卻沒有改變。為了解決這樣的問題,自動產(chǎn)生的任務(wù)應(yīng)該有版本管理功能,即它能對版本進(jìn)行響應(yīng)。作為一個例子,接下來的邏輯方法可以用來判斷一個節(jié)點(diǎn)的任務(wù)是否發(fā)生了變化。
如果兩個節(jié)點(diǎn)n1,n2有相同的屬性,那兩個節(jié)點(diǎn)的關(guān)系可以表示為n1en2。
2.1.2 節(jié)點(diǎn)連接線變化的識別
工作流實(shí)例中的節(jié)點(diǎn)也可能發(fā)生連接線的變化,圖4舉例說明了一些連接線變化的類型。如圖所示,在(a)中節(jié)點(diǎn)n2的位置變化導(dǎo)致節(jié)點(diǎn)n2連接線的改變;在(b)中增加節(jié)點(diǎn)n3和節(jié)點(diǎn)n4導(dǎo)致節(jié)點(diǎn)n1連接線的改變。
圖4 連接線的改變
嚴(yán)格意義上來說,如果一個節(jié)點(diǎn)的所有輸入與輸出連接線都沒有發(fā)生變化,那么這個節(jié)點(diǎn)就不會有連接線變化,即W1nCi=W2nCi∩W1nCo=W2nCo。為了驗(yàn)證上述兩種情況,有必要確定兩條連接線c1∈W1n和c2∈W2n是否相同。如前面說明的那樣,連接線c可由三元組(r,ns,ne)來表示。如果兩條連接線c1與c2相同,那么就要滿足下列條件:
1)c1r=c2r,
2)c1ns=c2ns,
3)c1ne=c2ne。
條件1是可以得到比較直觀的判斷,然而條件2和3實(shí)際上是一個循環(huán)問題:要判斷W1n=W2n成立,那么首先要判斷條件W1ncins=W2ncjns和W1ncine=W2ncjne成立。
為了解決上述問題,需要設(shè)定以下規(guī)則:
1)任何兩個工作流實(shí)例的開始節(jié)點(diǎn)是相同的。
2)如果c1nsec2ns與c1neec2ne相同,則連接線c1寫c2相同。
理想情況是,如果兩個節(jié)點(diǎn)不僅屬性相同,而且連接線也相同,那么這兩個節(jié)點(diǎn)相同。對于舊工作流實(shí)例中的節(jié)點(diǎn)n,如果在新工作流實(shí)例中有一個節(jié)點(diǎn)滿足n=,則說明節(jié)點(diǎn)n沒有變化。
2.2 完成節(jié)點(diǎn)的識別
判斷一個節(jié)點(diǎn)在舊工作流實(shí)例中是否為完成節(jié)點(diǎn)是比較簡單的,因?yàn)樗械墓ぷ髁鞴芾硐到y(tǒng)都允許節(jié)點(diǎn)的狀態(tài)查詢,通過訪問節(jié)點(diǎn)狀態(tài)屬性的方式來獲得節(jié)點(diǎn)的狀態(tài)。
2.3 可繞開節(jié)點(diǎn)的識別
如果一個節(jié)點(diǎn)的任務(wù)在舊工作流實(shí)例中被執(zhí)行完成,在新工作流實(shí)例中仍然有效而不需要重新執(zhí)行,那么該節(jié)點(diǎn)在新工作流實(shí)例中就是可繞開節(jié)點(diǎn)。顯然,可繞開節(jié)點(diǎn)應(yīng)該是:1)舊工作流實(shí)例中存在的,2)已經(jīng)執(zhí)行完成的。然而,以上兩個條件還是不足以確定一個節(jié)點(diǎn)是否為可繞開節(jié)點(diǎn),其緣由是一個節(jié)點(diǎn)的執(zhí)行狀況受到其輸入情況的影響。為了掌握節(jié)點(diǎn)輸入情況的關(guān)鍵部分,本文定義了如下概念:
1)如果連接線c對于節(jié)點(diǎn)n1來說是輸出連接線,對節(jié)點(diǎn)n2來說是輸入連接線,那么節(jié)點(diǎn)n1就是節(jié)點(diǎn)n2的前節(jié)點(diǎn)。兩個節(jié)點(diǎn)之間的相互關(guān)系可用n1→n2來表示。
2)如果n1到n2之間有一個節(jié)點(diǎn)集{nai}使得n1→na1,na1→na2,…,nan→na2,即n1→n2,那么可以認(rèn)為n1到n2之間有一個路徑。
為了確定新工作流實(shí)例中的節(jié)點(diǎn)是否為可繞開節(jié)點(diǎn),需要增加一個概念:一個指向當(dāng)前節(jié)點(diǎn)的路徑中的所有節(jié)點(diǎn)都為可繞開節(jié)點(diǎn)。
因?yàn)橐粋可繞開節(jié)點(diǎn)在舊工作流實(shí)例和新工作流實(shí)例中產(chǎn)生的輸出結(jié)果是相同的,所以可繞開節(jié)點(diǎn)的聚合肯定也會產(chǎn)生相同的效果。因此,使用下面三個條件判斷一個節(jié)點(diǎn)在新工作流實(shí)例中是否為可繞開節(jié)點(diǎn)是足夠的。
1)節(jié)點(diǎn)n的屬性在新工作流實(shí)例沒有改變;
2)節(jié)點(diǎn)n在舊工作流實(shí)例中被執(zhí)行完成;
3)在新工作流實(shí)例中的所有節(jié)點(diǎn){:→n}都是可繞開節(jié)點(diǎn),都可以不用重復(fù)執(zhí)行。
顯然,在一個新工作流實(shí)例中,開始節(jié)點(diǎn)總是可繞開節(jié)點(diǎn),因?yàn)樗偸菨M足以上三個條件(在所有的工作流管理系統(tǒng)中,任何工作流實(shí)例中的開始節(jié)點(diǎn)都是由系統(tǒng)自動完成)。
我們可以運(yùn)用以上三個條件,對新工作流實(shí)例中的每一個節(jié)點(diǎn)進(jìn)行分析,然后確定其是否為可繞開節(jié)點(diǎn)。判斷步驟如下所示:
1)建立一個包括新工作流實(shí)例W2中所有節(jié)點(diǎn)的有序列表L;
2)從列表L中去除W2中的開始節(jié)點(diǎn),并把開始節(jié)點(diǎn)設(shè)置為可繞開節(jié)點(diǎn);
3)對于列表L中的任何節(jié)點(diǎn)n,核查在舊工作流實(shí)例W1中是否有一個節(jié)點(diǎn),使得與n有相同的屬性,并且是被執(zhí)行完成的。如果節(jié)點(diǎn)n不滿足這兩個條件,再次從步驟(1)開始執(zhí)行,進(jìn)行下一個節(jié)點(diǎn)的判斷;若節(jié)點(diǎn)n滿足這兩個條件,則進(jìn)行下一步。
4)識別W2中所有的節(jié)點(diǎn),確定其中是否存在指向節(jié)點(diǎn)n的路徑。若存在,則該路徑中所有的節(jié)點(diǎn)都為可繞開節(jié)點(diǎn),那么就可以把節(jié)點(diǎn)n設(shè)置成可繞開節(jié)點(diǎn),并從列表L中移除,重新回到步驟(1)再進(jìn)行下一個節(jié)點(diǎn)的判斷。
5)當(dāng)列表L中所有的節(jié)點(diǎn)都經(jīng)過了判斷,核實(shí)列表的長度有沒有發(fā)生變化。如果發(fā)生了變化,再次從步驟1開始判斷;如果長度沒有發(fā)生變化,中止整個判斷步驟,因?yàn)榱斜鞮中的所有可繞開節(jié)點(diǎn)已經(jīng)被識別出來,并且已從列表L中移除。
以上的非遞歸步驟確保了在一個或多個可繞開節(jié)點(diǎn)識別以后,有序列表L中的所有節(jié)點(diǎn)都會得到處理。盡管這種方式是非常簡單和健壯的,但由于一些位于有序列表前端的節(jié)點(diǎn)在識別是否為可繞開節(jié)點(diǎn)之前已經(jīng)被重復(fù)判斷了多次,從而導(dǎo)致該種方式缺乏效率。
一種更有效的理念就是運(yùn)用新工作流實(shí)例的拓?fù)浣Y(jié)構(gòu)來檢查節(jié)點(diǎn),該理念能夠使這些節(jié)點(diǎn)有更多的機(jī)會被識別為可繞開節(jié)點(diǎn)。顯而易見的是,在新工作流實(shí)例中,由于開始節(jié)點(diǎn)總是可繞開節(jié)點(diǎn),所以它是第一個被檢查到的可繞開節(jié)點(diǎn);谝延械囊(guī)則,如果在新工作流實(shí)例中存在指向節(jié)點(diǎn)的路徑中有一個節(jié)點(diǎn)不是可繞開節(jié)點(diǎn),那么節(jié)點(diǎn)就不是可繞開節(jié)點(diǎn)。因此,從新工作流實(shí)例的開始節(jié)點(diǎn),即第一個可繞開節(jié)點(diǎn)開始,沿著開始節(jié)點(diǎn)的輸出連接線方向,遍歷整個工作流的方法是非常合理的。在開始節(jié)點(diǎn)的所有后續(xù)節(jié)點(diǎn)中,這些非可繞開節(jié)點(diǎn)能夠被識別出來,通過這樣的方式能簡化工作流實(shí)例,避免不必要的檢查。為了實(shí)現(xiàn)上述這些理念,本文開發(fā)了一種遞歸方法,如下所述:
1)如果輸入節(jié)點(diǎn)n足新工作流實(shí)例的開始節(jié)點(diǎn),或者該節(jié)點(diǎn)的所有前節(jié)點(diǎn)都是可繞開節(jié)點(diǎn),那么把節(jié)點(diǎn)n設(shè)置為可繞開節(jié)點(diǎn)。
2)經(jīng)過步驟(1)之后,如果輸入節(jié)點(diǎn)n是可繞開節(jié)點(diǎn),則找出節(jié)點(diǎn)n的所有后續(xù)節(jié)點(diǎn),把每一個后續(xù)節(jié)點(diǎn)設(shè)置為這種流程的輸入節(jié)點(diǎn),重復(fù)相應(yīng)的流程;否則就退出該流程。
以上的方法從第一個可繞開節(jié)點(diǎn)開始。該方法只測試了一個可繞開節(jié)點(diǎn)的后續(xù)節(jié)點(diǎn),通過利用工作流實(shí)例的拓?fù)浣Y(jié)構(gòu),可以避免對非可繞開節(jié)點(diǎn)的檢測。但是,對內(nèi)存的巨大需求卻成為該方法的一個主要問題。當(dāng)處理大量工作流實(shí)例的時(shí)候,這樣的一種遞歸算法可能會嚴(yán)重的降低工作流管理系統(tǒng)的運(yùn)行效率。因此,針對工作流,適度的運(yùn)用遞歸方法是合理的。為了處理大量的工作流的變化,這就需要有高效穩(wěn)定的非遞歸方法。
為了提出一種非遞歸方法,本文引入了節(jié)點(diǎn)層的概念。節(jié)點(diǎn)的層指的是從開始節(jié)點(diǎn)到節(jié)點(diǎn)的路徑中節(jié)點(diǎn)的個數(shù)。例如,在一個路徑n0→n1→n2→n3中,節(jié)點(diǎn)n2和n3的層分別為3和4。如果從開始節(jié)點(diǎn)到節(jié)點(diǎn)n有多條路徑,那么節(jié)點(diǎn)n的層被定義為最短路徑中節(jié)點(diǎn)的個數(shù)。
當(dāng)評估一個節(jié)點(diǎn)成為可繞開節(jié)點(diǎn)的可能性時(shí),從前面層的節(jié)點(diǎn)開始運(yùn)行是可取的。因?yàn)檫@些節(jié)點(diǎn)有更多的機(jī)會成為可繞開節(jié)點(diǎn),能夠更早的從有序列表中移除。隨后,在有序列表中對節(jié)點(diǎn)進(jìn)行排序之后,能夠運(yùn)用先前提及的非遞歸方法來實(shí)現(xiàn)對可繞開節(jié)點(diǎn)的識別。通過合理的消耗內(nèi)存,節(jié)點(diǎn)排序能夠有效的減少動態(tài)工作流變化的處理時(shí)間。
3 應(yīng)用實(shí)現(xiàn)
在上述理論研究的基礎(chǔ)之上,運(yùn)用Java開發(fā)語言,以MyEclipse 9.0 M1為開發(fā)環(huán)境,SQL Server 2005為數(shù)據(jù)庫,開發(fā)了支持動態(tài)工作流變化的工作流管理系統(tǒng),并實(shí)現(xiàn)與已有PDM系統(tǒng)的集成。系統(tǒng)界面如圖5所示。用戶可以根據(jù)不同企業(yè)的工作習(xí)慣,靈活的使用可視化的工作流編輯器,建立相應(yīng)的工作流程。為了方便對動態(tài)工作流變化的管理,運(yùn)用Java程序來實(shí)現(xiàn)所提出的方法,程序執(zhí)行步驟如下:
1)打開PDM系統(tǒng),在工作流編輯器中產(chǎn)生必要的數(shù)據(jù)集對象。
2)獲得一個流程實(shí)例。
3)獲得流程的新舊工作流模板。
4)把舊工作流實(shí)例保存在內(nèi)存中,給工作流過程附加新的工作流模板。
5)識別新工作流實(shí)例中的所有可繞開節(jié)點(diǎn)。
6)對新工作流實(shí)例進(jìn)行初始化,執(zhí)行所有可繞開節(jié)點(diǎn)。
7)把修改后的工作流過程釋放給所有等待執(zhí)行節(jié)點(diǎn)的用戶。
圖5 工作流管理系統(tǒng)界面
4 結(jié)束語
工作流管理是PDM系統(tǒng)的重要組成部分,是其基本功能,對動態(tài)工作流變化進(jìn)行分析與研究可以提高工作流管理系統(tǒng)的柔性。將動態(tài)工作流變化管理技術(shù)應(yīng)用到現(xiàn)有的PDM系統(tǒng)中來,實(shí)現(xiàn)了產(chǎn)品設(shè)計(jì)開發(fā)相關(guān)數(shù)據(jù)的完整性,提高了企業(yè)管理經(jīng)營的自動化水平。
核心關(guān)注:拓步ERP系統(tǒng)平臺是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊(yùn)涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴品牌。
轉(zhuǎn)載請注明出處:拓步ERP資訊網(wǎng)http://www.ezxoed.cn/
本文標(biāo)題:PDM系統(tǒng)中動態(tài)工作流變化的分析與研究
本文網(wǎng)址:http://www.ezxoed.cn/html/solutions/1401931989.html