版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1. 工作流 工作流(Workflow):就是自動(dòng)運(yùn)作的業(yè)務(wù)過(guò)程部分或整體,表現(xiàn)為參與者對(duì)文件、信息或任務(wù)按照規(guī)程采取行動(dòng),并令其在參與者之間傳遞。簡(jiǎn)單地說(shuō),工作流就是一系列相互銜接、自動(dòng)進(jìn)行的業(yè)務(wù)活動(dòng)或任務(wù)。工作流是針對(duì)工作中具有固定程序的常規(guī)活動(dòng)而提出的一個(gè)概念。通過(guò)將工作活動(dòng)分解成定義良好的任務(wù)、角色、規(guī)則和過(guò)程來(lái)進(jìn)行執(zhí)行和監(jiān)控,達(dá)到提高生產(chǎn)組織水平和工作效率的目的。 工作流就是工作流程的計(jì)算機(jī)化,即將工作流程中的工作如何前后組織在一起的邏輯和規(guī)則在計(jì)算機(jī)中以恰當(dāng)?shù)哪P瓦M(jìn)行表示并對(duì)其實(shí)施計(jì)算。工作流要解決的主要問(wèn)題是:為實(shí)現(xiàn)某個(gè)業(yè)務(wù)目標(biāo),在多個(gè)參與者之間,利用計(jì)算機(jī),按某種預(yù)定規(guī)則自動(dòng)傳
2、遞文檔、信息或者任務(wù)。 通俗的說(shuō),就是多個(gè)人在一起合作完成某件事情。 工作流可實(shí)現(xiàn)業(yè)務(wù)或公文的申請(qǐng)、審批、會(huì)簽、登記、操作等環(huán)節(jié)的管理,可將工作過(guò)程進(jìn)行記錄,便于日后檢查。并實(shí)現(xiàn)數(shù)據(jù)的規(guī)范化錄入、查詢(xún)、統(tǒng)計(jì)和存檔。OA(辦公自動(dòng)化)主要技術(shù)之一就是工作流。2. 工作流管理系統(tǒng)(Workflow Management System, WfMS) 主要功能是通過(guò)計(jì)算機(jī)技術(shù)的支持去定義、執(zhí)行和管理工作流,協(xié)調(diào)工作流執(zhí)行過(guò)程中工作之間以及群體成員之間的信息交互。工作流需要依靠工作流管理系統(tǒng)來(lái)實(shí)現(xiàn)。 工作流管理系統(tǒng)是定義、創(chuàng)建、執(zhí)行工作流的系統(tǒng),應(yīng)能提供以下三個(gè)方面的功能支持: 定義工作流:包括具體的活
3、動(dòng)、規(guī)則等; 運(yùn)行控制功能:在運(yùn)行環(huán)境中管理工作流過(guò)程,對(duì)工作流過(guò)程中的活動(dòng)進(jìn)行調(diào)度; 運(yùn)行交互功能:指在工作流運(yùn)行中,WfMS與用戶(hù)(活動(dòng)的參與者)及外部應(yīng)用程序工具交互的功能。3. JBPMM,全稱(chēng)是JJava BBusineess Prrocesss Manaagemennt JBPM是是一種基于JJ2EE的輕輕量級(jí)工作流流管理系統(tǒng),jBPM是是公開(kāi)源代碼碼項(xiàng)目, 官官方主頁(yè)為: HYPERLINK /jbossjbpm http:/g/jbosssjbpmm JJbpm的使使用* 步步驟* 編寫(xiě)寫(xiě)流程定義(定定義規(guī)則);* 部署流流程定義到系系統(tǒng)中;* 執(zhí)行流程(使使用指定的流流程定義
4、); 編寫(xiě)流程定定義舉例:?jiǎn)T員工報(bào)銷(xiāo)費(fèi)用用的流程描述述:?jiǎn)T工需要要先填寫(xiě)報(bào)銷(xiāo)銷(xiāo)單據(jù);交給給其經(jīng)理進(jìn)行行審批;審批批(通過(guò))后后到財(cái)務(wù)去領(lǐng)領(lǐng)款。以上流程由三個(gè)個(gè)步驟組成,每每個(gè)步驟即是是一個(gè)任務(wù),分分別由一個(gè)角角色執(zhí)行。應(yīng)應(yīng)該使用jBBPM提供的的JPDL(jjBPM PProcesss Deffinitiion Laanguagge)來(lái)描述述這個(gè)流程,這這樣使用了jjBPM的系系統(tǒng)才能看的的懂。jPDL:是一一種直觀的流流程語(yǔ)言,可可以使用任務(wù)務(wù)、等待狀態(tài)態(tài)、定時(shí)器、自自動(dòng)化動(dòng)作等等等圖形化地地表示流程。jjPDL認(rèn)為為一個(gè)商務(wù)流流程可以被看看作是一個(gè)UUML狀態(tài)圖圖。jPDLL就是詳細(xì)定定義
5、了這個(gè)狀狀態(tài)圖的每個(gè)個(gè)部分,如起起始、結(jié)束狀狀態(tài),狀態(tài)之之間的轉(zhuǎn)換等等。(就是寫(xiě)寫(xiě)一個(gè)xmll文件) 使用 jbbpm 提供供的 jbppm connsole web 應(yīng)應(yīng)用程序測(cè)試試/使用流程程jBPM Consoole weeb 是由 jBPM 提供的一個(gè)個(gè)web應(yīng)用用。它是一個(gè)個(gè)管理和監(jiān)控控流程的控制制臺(tái),用于檢檢查和操縱運(yùn)運(yùn)行的流程實(shí)實(shí)例。雙擊 servver/sttart.bbat 啟動(dòng)動(dòng)jbpm提提供的jbooss服務(wù)器器,要訪(fǎng)問(wèn)地地址為:htttp:/locallhost:8080/jbpm-consoole/部署流程定義到到 jbpmm-conssole 中中時(shí)的注意事事項(xiàng):A
6、)要要求流程定義義文件的名字字為proccessdeefinittion.xxml,并且且在一個(gè)ziip壓縮文件件的根目錄中中;B)存放放流程定義的的zip文件件所在的路徑徑中不能含有有中文(因?yàn)闉閖bpm-consoole應(yīng)用沒(méi)沒(méi)有處理中文文)。 執(zhí)行流程部部署流程定義義后,就可以以使用這個(gè)流流程定義了(執(zhí)執(zhí)行流程)。在在開(kāi)始一個(gè)流流程后,要先先進(jìn)入到 ttokenss 頁(yè)面中點(diǎn)點(diǎn)擊 Siggnal 鏈鏈接,這樣才才能使流程離離開(kāi)開(kāi)始狀態(tài)態(tài),以后的步步驟中都不需需再做這個(gè)操操作。當(dāng)流程程執(zhí)行到有任任務(wù)的節(jié)點(diǎn)時(shí)時(shí),就可以看看到當(dāng)前節(jié)點(diǎn)點(diǎn)中定義的任任務(wù)了。任務(wù)務(wù)的辦理分為為兩步:開(kāi)始始和結(jié)束。*
7、 流程實(shí)例例通過(guò)Tokken的維護(hù)護(hù)當(dāng)前正在執(zhí)執(zhí)行的節(jié)點(diǎn)JJbpm是怎怎么知道一個(gè)個(gè)流程實(shí)例現(xiàn)現(xiàn)在走到哪個(gè)個(gè)節(jié)點(diǎn)了呢?每個(gè)流程實(shí)實(shí)例都有一個(gè)個(gè)指針,指向向當(dāng)前正在執(zhí)執(zhí)行的節(jié)點(diǎn),在在當(dāng)前節(jié)點(diǎn)執(zhí)執(zhí)行完后,到到達(dá)了下一個(gè)個(gè)節(jié)點(diǎn),就是是讓這個(gè)指針針指向下一個(gè)個(gè)節(jié)點(diǎn)。這個(gè)個(gè)指針叫做TToken(也也叫做令牌)。Token是運(yùn)運(yùn)行時(shí)的概念念,用來(lái)維護(hù)護(hù)指向圖結(jié)點(diǎn)點(diǎn)的指針。TToken需需要一個(gè)信號(hào)號(hào)(signnal)來(lái)讓讓流程向前執(zhí)執(zhí)行。當(dāng)一個(gè)個(gè)signaal來(lái)到的時(shí)時(shí)候,Tokken就會(huì)通通過(guò)trannsitioon離開(kāi)當(dāng)前前的結(jié)點(diǎn)走到到下一個(gè)結(jié)點(diǎn)點(diǎn)。4. jBPMM提供了一個(gè)個(gè)圖形化的流流程設(shè)計(jì)器,是
8、是一個(gè)ecllipse插插件。 使用插件件設(shè)計(jì)流程定定義還可以生生成圖片,這這樣就可以實(shí)實(shí)現(xiàn)流程的圖圖形化監(jiān)控。 使用插插件設(shè)計(jì)完流流程定義并保保存后,會(huì)有有三個(gè)文件:A)proocessddefiniition.xml,流流程定義文件件;B)prrocesssimagee.jpg,流流程圖片;CC)gpd.xml,保保存流程圖片片中的各個(gè)節(jié)節(jié)點(diǎn)的坐標(biāo)信信息。 插件安安裝方法:在在Eclippse安裝目目錄下的liinks目錄錄中新建一個(gè)個(gè)文本文件,把把擴(kuò)展名改為為.linkk,并且修改改內(nèi)容為paath=$插件中的eeclipsse文件夾所所在的路徑。 使用插插件時(shí)會(huì)遇到到的幾個(gè)問(wèn)題題 插件
9、在eeclipsse3.3的的版本上才能能正常工作,所以myeeclipsse5.1(eclippse3.22)不能使用用這個(gè)插件。 安裝插時(shí),如如果 Mysseclippse安裝目目錄下的ecclipsee目錄中沒(méi)有有l(wèi)inkss目錄,可以以手工創(chuàng)建一一個(gè)。還要注注意指定的插插件的路徑中中不能含有中中文。 使用插件設(shè)設(shè)計(jì)流程定義義時(shí),如果再再點(diǎn)擊插件下下方的 SSourcee 選項(xiàng)卡卡修改生成的的proceessdeffinitiion.xmml,會(huì)出現(xiàn)現(xiàn)突然少了一一些內(nèi)容或多多出一些內(nèi)容容等情況,這這是插件的問(wèn)問(wèn)題。如果想想修改流程定定義源文件,可可以使用普通通的xml編編輯器打開(kāi)進(jìn)進(jìn)行修
10、改,方方法是在文件件上點(diǎn)擊右鍵鍵 - OOpen WWith - MyEEclipsse XMLL Edittor。 如果節(jié)點(diǎn)的的名字中有中中文,則生成成的gpd.xml中的的節(jié)點(diǎn)名字會(huì)會(huì)出現(xiàn)亂碼,這這會(huì)導(dǎo)致不能能正確的進(jìn)行行圖形化監(jiān)控控。修正方法法:在部署流流程定義前把把gpd.xxml文件的的編碼改為GGBK(改為為本地編碼,也也要修改xmml文件中的的encodding的值值為GBK)。要要注意如果修修改并保存了了一下流程定定義,就會(huì)重重新生成prrocesssimagee.jpg和和gpd.xxml文件,這這時(shí)gpd.xml中的的encodding又變變成了UTFF-8,應(yīng)再再改為GB
11、KK。(這是一一個(gè)Bug)。今天,在課堂上上,湯陽(yáng)光老老師教我們大大家熟悉了JJbpm,并并實(shí)現(xiàn)了一個(gè)個(gè)簡(jiǎn)單的辦公公流程事例,以以下是課堂總總結(jié)和相關(guān)實(shí)實(shí)現(xiàn)代碼。1. 概念 流程定定義:預(yù)先定定義的業(yè)務(wù)流流轉(zhuǎn)邏輯。 流程實(shí)實(shí)例(proocess instaance):業(yè)務(wù)的一次次實(shí)際流轉(zhuǎn)過(guò)過(guò)程。(是流流程定義執(zhí)行行期間的體現(xiàn)現(xiàn),包含了流流程定義被解解釋之后的一一些信息,諸諸如開(kāi)始時(shí)間間、結(jié)束時(shí)間間和其他相關(guān)關(guān)聯(lián)的信息)。 任務(wù)實(shí)實(shí)例(tassk insstancee): 組成成流程實(shí)例的的元素。(TTask被解解釋執(zhí)行時(shí)的的信息,有開(kāi)開(kāi)始時(shí)間、結(jié)結(jié)束時(shí)間、參參與者等,有有creatte、sta
12、art、ennd 三種狀狀態(tài))。2. 搭建環(huán)境境:* Jbbpm的APPI:流程有有關(guān)的所有信信息都是要保保存到數(shù)據(jù)庫(kù)庫(kù)中的。jBBPM的其中中一個(gè)特色就就是它使用HHibernnate來(lái)管管理它的數(shù)據(jù)據(jù)庫(kù)。這樣,jjBPM就將將數(shù)據(jù)的管理理職能分離出出去,自己則則專(zhuān)注于商務(wù)務(wù)邏輯的處理理。 添加jarr包:jbpm-jpdl.jar(核核心);jbpm-identtity.jjar(可選選,組織機(jī)構(gòu)構(gòu));bsh.jjar(BeeanSheell腳本);jbosss-j2eee.jar;hibernnate3.jar(HHibernnate);antlrr-2.7.6.jarr(Hibeern
13、atee);asm.jjar(Hiibernaate);cglibb.jar(HHibernnate);dom4jj.jar(HHibernnate);commoons-coollecttions.jar(HHibernnate);commoons-looggingg.jar(HHibernnate);hsqldbb.jar(可可選,純Jaava寫(xiě)的數(shù)數(shù)據(jù)庫(kù));log4jj.jar(可可選,日志記記錄);Junit44(單元測(cè)試試); 添加配配置文件(在在jbpm-jpdl-3.2.22/conffig目錄中中):jbpm.cfg.xxml;hiberrnate.cfg.xxml;pperti
14、ees(可選,llog4j配配置文件);修改數(shù)據(jù)庫(kù)庫(kù)庫(kù)連接信息息,如果使用用的不是HssqlDB數(shù)數(shù)據(jù)庫(kù),還應(yīng)應(yīng)添加相應(yīng)的的jdbc驅(qū)驅(qū)動(dòng)。我們選選用mysqql數(shù)據(jù)庫(kù)驅(qū)驅(qū)動(dòng)mysqql-connnectoor-javva-5.11.7-biin.jarr。 生成數(shù)數(shù)據(jù)庫(kù)表。選選用單元測(cè)試試的方式生成成數(shù)據(jù)庫(kù)表,以以下是測(cè)試類(lèi)類(lèi)代碼:puublic void creatteScheema() / 讀取取配置文件并并創(chuàng)建數(shù)據(jù)庫(kù)庫(kù)new CConfigguratiion().confiigure().buiildSesssionFFactorry();3. 編寫(xiě)流程程定義員工報(bào)報(bào)銷(xiāo),由其經(jīng)經(jīng)理審批
15、。審審批通過(guò)后,此此員工到財(cái)務(wù)務(wù)去領(lǐng)款,流流程結(jié)束;如如果未經(jīng)理審審批通過(guò),流流程結(jié)束。經(jīng)經(jīng)理在審批的的時(shí)候應(yīng)能看看到這個(gè)員工工要報(bào)銷(xiāo)的金金額,根據(jù)金金額做出是否否通過(guò)的決定定。* 編程步驟,要要實(shí)現(xiàn)的功能能有:a 部署署流程定義。b 啟動(dòng)流程。c 獲取任務(wù)列表。d 開(kāi)始任務(wù)。e 結(jié)束任務(wù)。其中編寫(xiě)流程定義和步驟a是添加流程定義到系統(tǒng)中;步驟b,c,d,e是使用系統(tǒng)中存在的某個(gè)流程定義執(zhí)行流程;步驟c,d,e是辦理一個(gè)任務(wù)的過(guò)程,流程的執(zhí)行就是一次次辦理任務(wù)的過(guò)程。有兩個(gè)重要的類(lèi):JbpmConfiguration和JbpmContext。JbpmConfiguration是jBPM的相關(guān)配置
16、信息,并有創(chuàng)建JbpmContext的功能,可以把JbpmConfiguration想像成Hibernate中的Configuration與SessionFactory的結(jié)合體。使用JbpmConfiguration.getInstance()方法創(chuàng)建一個(gè)JbpmConfiguration對(duì)象,這會(huì)使用默認(rèn)的jbpm配置文件:在classpath根目錄中,并且名字為jbpm.cfg.xml?;蛘呤鞘褂胓etInstance(String configFilePath)方法,用指定的配置文件構(gòu)造。Jbpm中幾乎所有的操作都是通過(guò)JbpmContext完成的,可以把他想像成Hibernate中的S
17、ession。他是通過(guò)JbpmConfiguration.createJbpmContext()方法創(chuàng)建的,JbpmContext中包裝有一個(gè)Hibernate的Session(通過(guò)他做的數(shù)據(jù)庫(kù)操作)。使用完JbpmContext后一定要調(diào)用他的close()方法,否則所有信息都不會(huì)持久化到數(shù)據(jù)庫(kù)當(dāng)中。因?yàn)樵谡{(diào)用JbpmConfiguration.createJbpmContext()方法時(shí)會(huì)創(chuàng)建一個(gè)Hibernate的Session并開(kāi)始事務(wù);在調(diào)用JbpmContext.close()方法時(shí)會(huì)提交事務(wù)并且關(guān)閉所關(guān)聯(lián)的Session。如果在執(zhí)行JbpmContext.close()之前調(diào)用方
18、法jbpmContext.setRollbackOnly(),則在JbpmContext.close()時(shí)會(huì)回滾事務(wù)。4. 部署流程程定義這個(gè)過(guò)過(guò)程就是把流流程定義的相相關(guān)信息保存存到j(luò)BPMM的數(shù)據(jù)庫(kù)中中。解析流程定義大大致有三種方方式,所使用用的方法都在在ProceessDeffinitiion中,并并且都是sttatic的的:1)parseeXmlReesourcce,parrseXmllInputtStreaam和parrseXmllReadeer,是解析析一個(gè)xmll的流程定義義文件;2)parseeXmlSttring,是是解析一個(gè)字字符串;3)parseeParReesourcc
19、e與parrseParrZipInnputSttream是是解析一個(gè)ppar包。ProcesssDefinnitionn.parsseXmlRResourrce(xmmlResoource)接受的參數(shù)數(shù)是流程定義義文件的路徑徑,這個(gè)路徑徑是相對(duì)于cclassppath的根根路徑的一個(gè)個(gè)相對(duì)路徑。Processs archhive(ppar),流流程檔案文件件,是一個(gè)zzip文件。必必須要有一個(gè)個(gè)流程定義文文件,名字為為proceessdeffinitiion.xmml,流程檔檔案也可以包包含其他的相相關(guān)文件,如如proceessimaage.jppg,gpdd.xml或或classses(類(lèi)的
20、的字節(jié)碼文件件)等等,(流流程定義中使使用到的cllass要放放到classspathh中;或者是是放到流程檔檔案的/cllassess文件夾中,這這樣就會(huì)被流流程類(lèi)裝載器器來(lái)裝載)。以下是部署流程的實(shí)現(xiàn)相關(guān)代碼:Testpublic void deployProcessDefinition() / 1, 從文件到實(shí)體/ProcessDefinition pd = ProcessDefinition.parseXmlString(xml);/ 接受流程定義文件/ProcessDefinition pd = ProcessDefinition.parseXmlInputStream(inputS
21、tream);/ProcessDefinition pd = ProcessDefinition.parseXmlReader(reader);/ProcessDefinition pd = ProcessDefinition.parseXmlResource(first/processdefinition.xml);/ 接受流程定義文檔/ProcessDefinition pd = ProcessDefinition.parseParZipInputStream(zipInputStream);ProcessDefinition pd = ProcessDefinition.parsePar
22、Resource(firstPD.zip);/ 2, 從實(shí)體到數(shù)據(jù)庫(kù)JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();/ sessiontry jbpmContext.deployProcessDefinition(pd); catch (Exception e) jbpmContext.setRollbackOnly();/ 告訴JbpmContext在close的時(shí)候回滾th
23、row new RuntimeException(e); finally jbpmContext.close();流程定義不應(yīng)該改變,因?yàn)轭A(yù)測(cè)流程變化帶來(lái)的所有可能的影響是非常困難的(或者說(shuō)是不可能的)。圍繞這個(gè)問(wèn)題,jBPM有一個(gè)明智的流程版本機(jī)制。版本機(jī)制允許在數(shù)據(jù)庫(kù)中多個(gè)同名流程定義共存,流程實(shí)例以當(dāng)時(shí)的最新版本來(lái)啟動(dòng),并且在它的整個(gè)生命周期中將保持以相同的流程定義執(zhí)行。當(dāng)一個(gè)新的版本被部署,新的流程實(shí)例以新版本啟動(dòng),而老的流程實(shí)例則以老的流程定義繼續(xù)執(zhí)行。部署流程定義義時(shí),如果存存在同名的流流程定義,則則版本自動(dòng)累累加(加1);如果不存在在,則版本為為1。在部署到j(luò)BBPM數(shù)據(jù)庫(kù)庫(kù)之后
24、改變流流程定義有很很多潛在的缺缺陷,因此非非常不鼓勵(lì)這這樣做??梢砸灾苯硬渴馂闉橐粋€(gè)新的版版本。5. 執(zhí)行流程程流程實(shí)例可可以通過(guò)PrrocesssDefinnitionn.creaateProocessIInstannce()方方法創(chuàng)建,或或者是使用nnew PrrocesssInstaance(PProcesssDefiinitioon pd)并傳遞一個(gè)個(gè)流程定義來(lái)來(lái)創(chuàng)建,總之之創(chuàng)建的流程程實(shí)例一定是是要是屬于(使使用)某個(gè)流流程定義的。啟啟動(dòng)流程后不不要忘了使用用ProceessInsstancee.signnal()方方法離開(kāi)開(kāi)始始狀態(tài)。注意:流程定定義的名字是是proceessdef
25、finitiion.xmml文件中的的根元素的nname屬性性的值,不是是流程定義文文件的名字!任務(wù)列表:當(dāng)當(dāng)前需要辦理理(未完成)的的任務(wù)集合。可可以通過(guò)TaaskMgmmtSesssion獲得得。開(kāi)始任務(wù)的方方法為:TaaskInsstancee.starrt();結(jié)結(jié)束任務(wù)為:TaskIInstannce.ennd(),TTaskInnstancce.endd(Striing trransittionNaame);無(wú)無(wú)參的endd()方法是是使用第一個(gè)個(gè)transsitionn離開(kāi)節(jié)點(diǎn);第二個(gè)方法法是指定完成成任務(wù)后使用用指定的trransittion離開(kāi)開(kāi)節(jié)點(diǎn)。一個(gè)個(gè)任務(wù)實(shí)例只只能開(kāi)始
26、和結(jié)結(jié)束一次(再再次開(kāi)始或結(jié)結(jié)束會(huì)拋異常常)。下面是是執(zhí)行流程的的相關(guān)代碼:Testtpubliic voiid staartProocessIInstannce() JbpmCConfigguratiion jbbpmConnfigurrationn = JbbpmConnfigurrationn.getIInstannce();JbpmCContexxt jbppmConttext = jbpmmConfiigurattion.ccreateeJbpmCContexxt();/ seessionnProceessDeffinitiion pdd = jbbpmConntext.getGrr
27、aphSeessionn().fiindLattestPrrocesssDefinnitionn(firrst);/ProceessInsstancee pi = new ProceessInsstancee(pd);ProceessInsstancee pi = pd.ccreateeProceessInsstancee();jbpmCContexxt.savve(pi);/ siignalpi.geetRoottTokenn().siignal();jbpmCContexxt.cloose();TesttSupppressWWarninngs(uuncheccked)publiic voi
28、id gettTaskLList() JbpmCConfigguratiion jbbpmConnfigurrationn = JbbpmConnfigurrationn.getIInstannce();JbpmCContexxt jbppmConttext = jbpmmConfiigurattion.ccreateeJbpmCContexxt();/ seessionnStrinng acttorId = 員工工張三;/ Sttring actorrId = 經(jīng)理李四四;List ttaskLiist = jbpmCContexxt.gettTaskLList(aactorIId);Sys
29、teem.outt.prinntln(n- + acttorId + 的任任務(wù)列表);for (TaskIInstannce tii : taaskLisst) Systeem.outt.prinntln(id= + ti.getIdd()/+ ,nname= + tii.getNName()/+ ,aactorIId= + ti.ggetActtorId()/+ ,ccreatee= + ti.geetCreaate()/+ ,sstart= + tti.gettStartt()/+ ,eend= + ti.getEnnd();Systeem.outt.prinntln();jbpmCCon
30、texxt.cloose();Testtpubliic voiid staartTassk() JbpmCConfigguratiion jbbpmConnfigurrationn = JbbpmConnfigurrationn.getIInstannce();JbpmCContexxt jbppmConttext = jbpmmConfiigurattion.ccreateeJbpmCContexxt(); / seessionnTaskIInstannce tii = jbbpmConntext.getTaaskInsstancee(3);ti.sttart();jbpmCContexxt
31、.cloose();Testtpubliic voiid enddTask() JbpmCConfigguratiion jbbpmConnfigurrationn = JbbpmConnfigurrationn.getIInstannce();JbpmCContexxt jbppmConttext = jbpmmConfiigurattion.ccreateeJbpmCContexxt();/ seessionnTaskIInstannce tii = jbbpmConntext.getTaaskInsstancee(3);/ tii.end();ti.ennd(too end);jbpmC
32、oontextt.closse();在員工填寫(xiě)寫(xiě)報(bào)銷(xiāo)單任務(wù)務(wù)完成前,應(yīng)應(yīng)把業(yè)務(wù)數(shù)據(jù)據(jù)報(bào)銷(xiāo)金額額與流程關(guān)關(guān)聯(lián)起來(lái),可可以通過(guò)設(shè)置置流程變量實(shí)實(shí)現(xiàn)。流程變變量是與流程程實(shí)例關(guān)聯(lián)的的,并且會(huì)持持久化到數(shù)據(jù)據(jù)庫(kù)中。不同同的流程實(shí)例例是互不相干干的,就好比比web中的的sessiion,在其其中設(shè)置變量量(setAAttribbute)是是跟其它的ssessioon中的變量量無(wú)關(guān)的。利用變量動(dòng)動(dòng)態(tài)的設(shè)置參參與者。在流流程定義中指指定參與者(aactor-id)時(shí),可可以使用變量量,變量是以以#開(kāi)開(kāi)頭,以結(jié)束,中中間的是變量量名。這里的的變量引用的的是在執(zhí)行流流程時(shí)設(shè)置的的流程變量。流程實(shí)例有了結(jié)束時(shí)間(
33、end!=null)就表示這個(gè)流程實(shí)例結(jié)束了。任務(wù)實(shí)例如果開(kāi)始時(shí)間不為null(start!=null),表示已經(jīng)開(kāi)始了,即已對(duì)其調(diào)用了start()方法;同樣在調(diào)用任務(wù)實(shí)例的end()方法時(shí),結(jié)束時(shí)間被填充(end!=null表示任務(wù)實(shí)例已結(jié)束)。以下是一些實(shí)體體與表的對(duì)應(yīng)應(yīng)關(guān)系:+-+-+-|PO|tablee|實(shí)體+-+-+-|ProocessDDefiniition|jbpmm_proccessdeefinittion|流程定義+-+-+-|PProcesssInsttance|jbpmm_proccessinnstancce|流程實(shí)例+-+-+-|TTaskInnstancce|jb
34、pmm_taskkinstaance|任務(wù)實(shí)例+-+-+-|VVariabbleInsstancee|jbpmm_variiableiinstannce |流程變量+-+-+-在Jbpm中中,標(biāo)識(shí)各個(gè)個(gè)節(jié)點(diǎn)的類(lèi)型型是不同的,功功能也各不相相同。今天,在在課堂上,湯湯老師重點(diǎn)為為我們講解了了各個(gè)節(jié)點(diǎn)的的作用及用法法。1. 節(jié)點(diǎn)不同同的節(jié)點(diǎn)類(lèi)型型代表不同的的行為。 staart-sttate開(kāi)始節(jié)點(diǎn),標(biāo)標(biāo)識(shí)流程開(kāi)始始邊界。開(kāi)始始狀態(tài)有且只只有一個(gè),就就是說(shuō)流程中中不能有任何何transsitionn指向開(kāi)始節(jié)節(jié)點(diǎn)。在流程實(shí)例例被創(chuàng)建后(啟啟動(dòng)),RoootTokken(根令令牌)就指向向start
35、t-statte,并且處處于等待狀態(tài)態(tài),需要給TToken發(fā)發(fā)信號(hào)(siignal)才才能使流程繼繼續(xù)執(zhí)行。 endd-statte結(jié)束節(jié)點(diǎn),標(biāo)標(biāo)識(shí)流程的結(jié)結(jié)束邊界。不不需要traansitiion元素。 tassk-nodde任務(wù)節(jié)點(diǎn),可可以包含任意意數(shù)量的Taask(任務(wù)務(wù))。當(dāng)執(zhí)行行到一個(gè)任務(wù)務(wù)節(jié)點(diǎn)的時(shí)候候,將會(huì)根據(jù)據(jù)這個(gè)tassk-nodde中的taask的定義義,創(chuàng)建相同同數(shù)量的TaaskInsstancee(為每一個(gè)個(gè)Task都都創(chuàng)建一個(gè)任任務(wù)實(shí)例,并并且分配給任任務(wù)定義中指指定的參與者者)。然后,這這個(gè)taskk-nodee一直處于等等待狀態(tài),等等到這些任務(wù)務(wù)實(shí)例都被完完成后,才
36、會(huì)會(huì)離開(kāi)當(dāng)前的的節(jié)點(diǎn),到達(dá)達(dá)下一個(gè)節(jié)點(diǎn)點(diǎn)。調(diào)用TasskInsttance.end(SStringg trannsitioonNamee)時(shí),如果果這個(gè)任務(wù)實(shí)實(shí)例不是當(dāng)前前任務(wù)節(jié)點(diǎn)中中的最后完成成的那個(gè),那那這個(gè)方法就就只是完成任任務(wù)而已,并并不會(huì)使用這這指定的trransittion離開(kāi)開(kāi)節(jié)點(diǎn)。就是是說(shuō):只有當(dāng)當(dāng)這個(gè)任務(wù)實(shí)實(shí)例完成后,TToken就就要離開(kāi)當(dāng)前前節(jié)點(diǎn),到達(dá)達(dá)下一個(gè)節(jié)點(diǎn)點(diǎn)時(shí),指定的的transsitionnName才才有作用。如果一個(gè)ttask-nnode中沒(méi)沒(méi)有定義任務(wù)務(wù),執(zhí)行時(shí),一一進(jìn)入這個(gè)節(jié)節(jié)點(diǎn)就會(huì)馬上上離開(kāi),即TToken不不會(huì)在這個(gè)ttask-nnode上停停留,因?yàn)?/p>
37、他他發(fā)現(xiàn)所有的的任務(wù)實(shí)例都都執(zhí)行完了(任任務(wù)實(shí)例的數(shù)數(shù)量為0)。 staate狀態(tài)節(jié)點(diǎn),這這是一個(gè)等待待節(jié)點(diǎn)。當(dāng)執(zhí)執(zhí)行到達(dá)這個(gè)個(gè)節(jié)點(diǎn)的時(shí)候候,就會(huì)處于于等待狀態(tài),須須給tokeen發(fā)一個(gè)信信號(hào)(siggnal)才才能使流程繼繼續(xù)執(zhí)行。 deccisionn決策節(jié)點(diǎn),用用于計(jì)算流向向。有兩種計(jì)計(jì)算方式:1) 在ddecisiion中使用用DecissionHaandlerr,或使用一一個(gè)表達(dá)式。(都是返回要使用的transition的name);2) 在decision中的transition元素中使用boolean表達(dá)式。這樣將使用表達(dá)式計(jì)算結(jié)果為真的那個(gè)transition離開(kāi)節(jié)點(diǎn)。 只有d
38、ecision節(jié)點(diǎn)中的transition元素的的condition可以計(jì)算。在其他節(jié)點(diǎn)是不起作用的! 如果有多個(gè)transition的condition計(jì)算為true,將會(huì)使用第一個(gè)結(jié)果為true的transition(按定義中的順序); 如果所有的transition的condition的值都為false,則使用第一個(gè)。如果以上方法法同時(shí)使用,調(diào)調(diào)用的順序?yàn)闉椋喝绻衐eecisioonDeleegatioon,則使用用它的計(jì)算結(jié)結(jié)果。否則,如果有decisionExpression,則使用它的計(jì)算結(jié)果。否則,如果使用decisionConditions(trasnition中的表達(dá)式)的
39、計(jì)算結(jié)果。 exppressiion(表達(dá)達(dá)式)和我們們?cè)趈sp中中使用的ell表達(dá)式相似似,只是$改為#。表達(dá)式中可以直直接使用已設(shè)設(shè)置的流程變變量,并且可可以直接使用用以下變量:taskIInstannceproceessInsstanceeproceessDeffinitiiontokenntaskMMgmtInnstancceconteextInsstancee forrk / jjoin分支節(jié)點(diǎn)與與合并節(jié)點(diǎn)。分分支節(jié)點(diǎn)的作作用是將單個(gè)個(gè)執(zhí)行流程分分裂成多個(gè)并并發(fā)的執(zhí)行流流程。默認(rèn)的的行為是為每每個(gè)子流程生生成一個(gè)子令令牌,并建立立子令牌和主主流程令牌之之間的父子關(guān)關(guān)系。此時(shí),父父令牌
40、指向ffork節(jié)點(diǎn)點(diǎn),子令牌指指向各個(gè)分支支節(jié)點(diǎn)。合并節(jié)點(diǎn)將將分支收攏。當(dāng)當(dāng)所有的分支支(從同一個(gè)個(gè)fork中中出來(lái)的)都都到達(dá)該節(jié)點(diǎn)點(diǎn)的時(shí)候,jjoin結(jié)點(diǎn)點(diǎn)將結(jié)束這些些分支上的子子tokenn,并通給他他們的父Tooken發(fā)一一個(gè)信號(hào)離開(kāi)開(kāi)join節(jié)節(jié)點(diǎn)。如果只只有分支中的的部分tokken到達(dá)時(shí)時(shí),joinn結(jié)點(diǎn)將處于于等待狀態(tài)。需要注意的是:fork和join節(jié)點(diǎn)要成對(duì)的出現(xiàn)。fork節(jié)點(diǎn)中的transition都要指定名字。否則。用程序運(yùn)行沒(méi)有問(wèn)題,用jbpm-console運(yùn)行時(shí)執(zhí)行到這個(gè)fork節(jié)點(diǎn)的時(shí)候就會(huì)拋空指針異常。 nodde可定制的節(jié)節(jié)點(diǎn)。可以在在node元元素中指定一
41、一個(gè)Actiion子元素素,可以指定定一個(gè)實(shí)現(xiàn)了了Actioonhanddler接口口的類(lèi),用這這個(gè)類(lèi)可定制制這個(gè)節(jié)點(diǎn)的的行為。這時(shí)時(shí),如是果想想讓流程繼續(xù)續(xù)執(zhí)行,需要要給tokeen發(fā)一個(gè)信信號(hào)。如果nodde中沒(méi)有aactionn子元素,他他的默認(rèn)行為為是一到達(dá)就就離開(kāi)了,不不作停留。2. Actiion動(dòng)作,是一一段代碼,在在指定的情況況下被執(zhí)行。屬性:cllass:指定處理理類(lèi);name:actiion的名字字;ref-nname:所所引用的acction的的名字;一個(gè)actiion是一段段java代代碼,用來(lái)引引入附加的處處理邏輯??煽梢苑旁趎oode節(jié)點(diǎn)中中,也可以放放在evenn
42、t(事件)中中,用來(lái)輔助助當(dāng)前節(jié)點(diǎn)完完成業(yè)務(wù)邏輯輯。Actionn是一種在圖圖形表示之外外增加更多技技術(shù)細(xì)節(jié)的機(jī)機(jī)制??梢宰屪宩ava代代碼在不修改改圖結(jié)構(gòu)的情情況下和圖關(guān)關(guān)聯(lián)起來(lái)。3. scriipt 與 beansshellbeansshell,可可以直接使用用java類(lèi)類(lèi)。聲明變量量時(shí)可以不指指定類(lèi)型而直直接使用??煽梢栽趯?xiě)腳本本時(shí)當(dāng)成是寫(xiě)寫(xiě)Java代代碼(可以透透明的使用JJava的AAPI)。scriptt就是使用的的beansshell。sscriptt也可以指定定一個(gè)namme屬性,可可以在配置aactionn元素的時(shí)候候指定reff-namee為此scrript的nname,代
43、代表引用這個(gè)個(gè)動(dòng)作。以下變量在Sccript中中可以直接引引用:execuutionCContexxttokennnodetasktaskIInstannce提示:能使用aactionn的地方一般般也能使用sscriptt;配置scrript時(shí)可可用包包圍內(nèi)容。4. evennt事件。每個(gè)事件有一一個(gè)動(dòng)作(aactionn)清單。當(dāng)當(dāng)jBPM引引擎產(chǎn)生一個(gè)個(gè)事件,動(dòng)作作(actiion)清單單就會(huì)被執(zhí)行行. 不同的的節(jié)點(diǎn)支持的的事件類(lèi)型不不同,是由eevent元元素所在的節(jié)節(jié)點(diǎn)的類(lèi)型決決定的,例如如transsitionn只有一個(gè)事事件??梢栽谠趀ventt元素用可以以指定一個(gè)動(dòng)動(dòng)作,當(dāng)指定定
44、的事件發(fā)生生時(shí),這個(gè)動(dòng)動(dòng)作被執(zhí)行。可可以給同一個(gè)個(gè)事件指定多多個(gè)動(dòng)作,當(dāng)當(dāng)這個(gè)事件觸觸發(fā)的時(shí)候,這這些動(dòng)作執(zhí)行行的順序和定定義先后順序序是一致的。不同元素支持持不同的事件件類(lèi)型:一般般的節(jié)點(diǎn)都具具有的事件:node-enterr,nodee-leavve;staart-sttate只有有node-leavee;end-statee只有nodde-entter;trransittion只有有一個(gè)執(zhí)行轉(zhuǎn)轉(zhuǎn)換的事件(takinng a ttransiition)(所以配置置時(shí)不用寫(xiě)eevent元元素,而直接接配置Acttion)ttask有ttask-ccreatee,taskk-assiign,t
45、aask-sttart,ttask-eend。關(guān)于哪些元素支支持哪些事件件,可以通過(guò)過(guò)文檔的188.4節(jié)中的的xml文件件的寫(xiě)法中獲獲得。如果配置的事件件類(lèi)型不存在在,不會(huì)報(bào)錯(cuò)錯(cuò),也不會(huì)執(zhí)執(zhí)行。注意:在事件中中定義的動(dòng)作作不應(yīng)該影響響流程的執(zhí)行行。即不要在在事件的動(dòng)作作中給tokken發(fā)信號(hào)號(hào),否則會(huì)拋拋異常。task-noode的siingal屬屬性可取的值值:lastt: 默認(rèn)值值.當(dāng)lasst實(shí)例被完完成時(shí)候獲得得執(zhí)行.當(dāng)在在這個(gè)入口沒(méi)沒(méi)有任務(wù)被生生成時(shí)候,執(zhí)執(zhí)行繼續(xù).ffirst: 當(dāng)firrst實(shí)例被被完成時(shí)候獲獲得執(zhí)行. 當(dāng)在這個(gè)入入口沒(méi)有任務(wù)務(wù)被生成時(shí)候候,執(zhí)行繼續(xù)續(xù).nevee
46、r: 執(zhí)行行永遠(yuǎn)不繼續(xù)續(xù), 不管任任務(wù)是否建立立或依然沒(méi)有有完成.unnsynchhronizzed: 執(zhí)執(zhí)行一直繼續(xù)續(xù),不管任務(wù)務(wù)是否沒(méi)建立立或依然沒(méi)有有完成.laast-waait: 當(dāng)當(dāng)last實(shí)實(shí)例被完成時(shí)時(shí)候獲得執(zhí)行行.當(dāng)這個(gè)節(jié)節(jié)點(diǎn)入口沒(méi)有有任務(wù)被建立立時(shí),任務(wù)節(jié)節(jié)點(diǎn)執(zhí)行等待待直到任務(wù)被被建立.fiirst-wwait: 當(dāng)firsst實(shí)例被完完成時(shí)候獲得得執(zhí)行.當(dāng)在在這個(gè)入口沒(méi)沒(méi)有任務(wù)被生生成時(shí)候,執(zhí)執(zhí)行繼續(xù).last-waait和fiirst-wwait的wwait是分分開(kāi)來(lái)理解的的,waitt是指的等待待任務(wù)實(shí)例的的創(chuàng)建,而到到達(dá)taskk-nodee后有任務(wù)實(shí)實(shí)例被創(chuàng)建了了,
47、waitt就沒(méi)有影響響了,這時(shí)ttask-nnode的行行為就是waait前面那那個(gè)firrst或last決定了,即即執(zhí)行完第一一個(gè)任務(wù)實(shí)例例就離開(kāi)節(jié)點(diǎn)點(diǎn)還是所有任任務(wù)實(shí)例都執(zhí)執(zhí)行完才離開(kāi)開(kāi)節(jié)點(diǎn).在演示lastt-waitt時(shí),要用ccreatee-taskks屬性配合合(設(shè)置他的的值為fallse,就是是不創(chuàng)建任務(wù)務(wù)實(shí)例).在在設(shè)置為laast-waait或fiirst-wwait時(shí),在taskk-nodee元素中沒(méi)有有配置任務(wù),流程執(zhí)行到到這個(gè)節(jié)點(diǎn)時(shí)時(shí)也會(huì)等待.5. 動(dòng)態(tài)的創(chuàng)創(chuàng)建不確定數(shù)數(shù)量的任務(wù)實(shí)實(shí)例實(shí)現(xiàn)任務(wù)務(wù)分配給多個(gè)個(gè)人,需要做做以下工作:1, 阻止止jBPM自自動(dòng)創(chuàng)建任務(wù)務(wù)實(shí)例(設(shè)
48、置置task-node的的creatte-tassks=ffalse);2,在在流程定義中中定義的相應(yīng)應(yīng)的任務(wù),不不指定參與者者;3,在nnode-eenter事事件中定義一一個(gè)動(dòng)作指定定用于創(chuàng)建TTaskInnstancce的類(lèi)。創(chuàng)建任務(wù)實(shí)例要要調(diào)用方法:TaskMMgmtInnstancce.creeateTaaskInsstancee(Taskk, ExeecutioonConttext);其中的Taask 是任任務(wù)的定義,可以先得到到當(dāng)前的節(jié)點(diǎn)點(diǎn):TaskNNode ttaskNoode = (TaskkNode) execcutionnConteext.geetNodee();然后后
49、通過(guò)任務(wù)的的名字得到任任務(wù)的定義:Task task = tasskNodee.getTTask(審批);今天,在課堂上上,湯老師做做了一個(gè)工作作流的實(shí)際應(yīng)應(yīng)用,以下是是Demo的的環(huán)境搭建和和分析及組織織與人員管理理模塊的具體體實(shí)現(xiàn)總結(jié)。1. 搭建環(huán)境境: strruts1.2.9 + jstll1.1 + hibeernatee3 + jjbpm3.2.2 拷拷貝jar包包與配置文件件. 其中sttruts和和jstl的的jar包:引用了ecclipsee提供的sttruts11.2的jaar; jbpmm3.2.22的jar:其中里面包包含了hibbernatte3.jaar,對(duì)liib
50、文件夾下下的jar進(jìn)進(jìn)行了簡(jiǎn)單的的挑選,其中中servllet-appi.jarr是Tomccat自帶的的,不用添加加,還有juunit.jjar也不用用添加,因?yàn)闉槲覀冞x用的的是ecliipse提供供的juniit4.jaar。 修改改數(shù)據(jù)庫(kù)連接接信息與創(chuàng)建建數(shù)據(jù)庫(kù).以以下是hibbernatte.cfgg.xml文文件中數(shù)據(jù)庫(kù)庫(kù)配置的主要要內(nèi)容:orrg.hibbernatte.diaalect.MySQLL5Diallectcom.mmysql.jdbc.Driveerjjdbc:mmysql:/ittcastooa-0900513roott12234org.hiberrnate.cac
51、hee.HashhtableeCacheeProviideruupdateernatte.connnectiion.drriver_classscomm.mysqql.jdbbc.Driiverjdbcc:mysqql:/itcasstoa-00905133rooot1234orrg.hibbernatte.cacche.HaashtabbleCaccheProoviderrupdaate2, 完成組織織與人員管理理: 分分析實(shí)體(DDeparttment, Userr, Rolle), 各各實(shí)體的屬性性及之間的關(guān)關(guān)聯(lián)關(guān)系.下下面是UMLL圖: 寫(xiě)寫(xiě)出映射文件件, 并創(chuàng)建建數(shù)庫(kù)數(shù)表; 然后檢查
52、查表結(jié)構(gòu)是否否正確. Depaartmennt.hbmm.xml: Rolee.hbm.xml: Userr.hbm.xml: 部部門(mén)(Deppartmeent)操作作的功能分析析(增,刪,改,查), 列出Acction方方法, AcctionFForm, 與業(yè)務(wù)方法法. DepaartmenntActiion中的方方法publiic ActtionFoorwardd listt(ActiionMappping mappiing, AActionnForm form, HttppServlletReqquest requeest,HttpSServleetRespponse respoonse
53、) throwws Excceptioon DeparrtmenttForm deptFForm = (DeppartmeentForrm) foorm;int pparenttId = deptFForm.ggetParrentIdd();Deparrtmentt pareent = deparrtmenttServiice.geetDeptt(pareentId);List deptts = ddeparttmentSServicce.finndDeptts(parrent);/ 準(zhǔn)備備數(shù)據(jù)requeest.seetAttrributee(deppts, deptss);requeest.
54、seetAttrributee(parrent, pareent);returrn mappping.findFForwarrd(liist);publiic ActtionFoorwardd treee(ActiionMappping mappiing, AActionnForm form, HttppServlletReqquest requeest,HttpSServleetRespponse respoonse) throwws Excceptioon List deppts = deparrtmenttServiice.fiindDeppts(nuull);/ 準(zhǔn)備備數(shù)據(jù)requee
55、st.seetAttrributee(deppts, deptss);returrn mappping.findFForwarrd(trree);publiic ActtionFoorwardd saveeUI(AcctionMMappinng mappping, ActiionForrm forrm, HtttpSerrvletRRequesst reqquest,HttpSServleetRespponse respoonse) throwws Excceptioon DeparrtmenttForm deptFForm = (DeppartmeentForrm) foorm;Deparr
56、tmentt deptt = deepartmmentSeervicee.getDDept(ddeptFoorm.geetId();if (ddept != nulll) deptFForm.ssetId(dept.getIdd();deptFForm.ssetNamme(deppt.gettName();deptFForm.ssetParrentIdd(deptt.getPParentt() = nulll ? 0 : deppt.gettParennt().ggetId();returrn mappping.findFForwarrd(saave);publiic ActtionFoorw
57、ardd savee(ActiionMappping mappiing, AActionnForm form, HttppServlletReqquest requeest,HttpSServleetRespponse respoonse) throwws Excceptioon DeparrtmenttForm deptFForm = (DeppartmeentForrm) foorm;Departtment parennt = ddeparttmentSServicce.gettDept(deptFForm.ggetParrentIdd();Deparrtmentt deptt = dee
58、partmmentSeervicee.getDDept(ddeptFoorm.geetId();if (ddept = nulll) dept = neww Depaartmennt();dept.ssetNamme(depptFormm.getNName();dept.setPaarent(parennt);deparrtmenttServiice.saave(deept);returnn mappping.ffindFoorwardd(shoowDeptts);publiic ActtionFoorwardd del(ActioonMappping mmappinng, AcctionFForm fform, HttpSServleetRequuest rrequesst,HttpSServleetRespponse respoonse) throwws Excce
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年大學(xué)大一(數(shù)字媒體技術(shù))數(shù)字媒體交互產(chǎn)品設(shè)計(jì)階段測(cè)試題及答案
- 2025年高職新材料(再生資源應(yīng)用)試題及答案
- 多組學(xué)技術(shù)在環(huán)境危險(xiǎn)因素識(shí)別中的應(yīng)用
- 2025年中職機(jī)械制造與自動(dòng)化(機(jī)械自動(dòng)化操作)試題及答案
- 2025年高職(農(nóng)業(yè)技術(shù))土壤肥料應(yīng)用試題及答案
- 2026年汽車(chē)銷(xiāo)售(成交轉(zhuǎn)化)試題及答案
- 2025年高職印刷媒體技術(shù)(排版工藝)試題及答案
- 2025年大學(xué)(生物工程專(zhuān)業(yè))酶工程試題及答案
- 2025年大學(xué)本科(動(dòng)物醫(yī)學(xué))動(dòng)物傳染病防控試題及答案
- 2025年大學(xué)大二(設(shè)計(jì)學(xué))設(shè)計(jì)方法學(xué)基礎(chǔ)理論測(cè)試題及答案
- DB15∕T 3722-2024 公路基層水泥穩(wěn)定高爐重礦渣混合料設(shè)計(jì)與施工技術(shù)規(guī)范
- 2025年國(guó)家能源集團(tuán)招聘筆試真題及答案
- 擋土墻施工培訓(xùn)
- 企業(yè)環(huán)保管理制度(2025年版)
- 2025至2030中國(guó)掃雪車(chē)行業(yè)發(fā)展趨勢(shì)分析與未來(lái)投資戰(zhàn)略咨詢(xún)研究報(bào)告
- 內(nèi)河電動(dòng)船舶充換電模式的經(jīng)濟(jì)性與適用性分析
- 刮板撈渣機(jī)課件
- 《城市軌道交通全自動(dòng)運(yùn)行系統(tǒng)驗(yàn)收規(guī)范》
- 幼兒園3-6歲兒童學(xué)習(xí)與發(fā)展指南語(yǔ)言領(lǐng)域課件
- 透析液檢測(cè)不合格應(yīng)急預(yù)案
- 印刷機(jī)操作安全培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論