![Activity初學(xué)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/2/52ca4fb6-690e-4d87-909f-e225ee0540c7/52ca4fb6-690e-4d87-909f-e225ee0540c71.gif)
![Activity初學(xué)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/2/52ca4fb6-690e-4d87-909f-e225ee0540c7/52ca4fb6-690e-4d87-909f-e225ee0540c72.gif)
![Activity初學(xué)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/2/52ca4fb6-690e-4d87-909f-e225ee0540c7/52ca4fb6-690e-4d87-909f-e225ee0540c73.gif)
![Activity初學(xué)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/2/52ca4fb6-690e-4d87-909f-e225ee0540c7/52ca4fb6-690e-4d87-909f-e225ee0540c74.gif)
![Activity初學(xué)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/2/52ca4fb6-690e-4d87-909f-e225ee0540c7/52ca4fb6-690e-4d87-909f-e225ee0540c75.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、· 1. 初識Activiti· 1.1. 工作流與工作流引擎· 1.2. BPMN2.0規(guī)范· 1.3. Activiti概述· 1.3.1. Activiti由來· 1.3.2. Activiti簡介· 1.4. 文檔說明· 2. 開始學(xué)習(xí)· 2.1. 必要的準(zhǔn)備· 2.1.1. 下載與了解目錄· 2.1.2. 其他準(zhǔn)備· 2.1.3. 一分鐘入門(見用戶手冊)· 2.2. 核心組件介紹· 2.2.1. 關(guān)鍵對象· 2.2.2. 服務(wù)接口
2、183; 3. 入門示例(參考手冊中10分鐘教程)· 3.1. 概述· 3.2. 流程文件xxx.bpmn20.xml· 3.3. Spring配置文件· 3.4. 編寫測試用例· 3.5. 導(dǎo)入activiti-explorer· 4. Eclipse中的Activiti插件· 4.1. 安裝· 4.2. 使用1. 初識Activiti1.1. 工作流與工作流引擎工 作流(workflow)就是工作流程的計算模型,即將工作流程中的工作如何前后組織在一起的邏輯和規(guī)則在計算機(jī)中以恰當(dāng)?shù)哪P瓦M(jìn)行表示并對其實施計算。 它
3、主要解決的是“使在多個參與者之間按照某種預(yù)定義的規(guī)則傳遞文檔、信息或任務(wù)的過程自動進(jìn)行,從而實現(xiàn)某個預(yù)期的業(yè)務(wù)目標(biāo),或者促使此目標(biāo)的實現(xiàn)”。(我的理解就是:將部分或者全部的工作流程、邏輯讓計算機(jī)幫你來處理,實現(xiàn)自動化)所謂工作流引擎是指workflow作為應(yīng)用系統(tǒng)的一部分,并為之提供對各應(yīng)用系統(tǒng)有決定作用的根據(jù)角色、分工和條件的不同決定信息傳遞路由、內(nèi)容等級等核心解決方案。例如開發(fā)一個系統(tǒng)最關(guān)鍵的部分不是系統(tǒng)的界面,也不是和數(shù)據(jù)庫之間的信息交換,而是如何根據(jù)業(yè)務(wù)邏輯開發(fā)出符合實際需要的程序邏輯并確保其穩(wěn)定性、易維護(hù)性和彈性。比如你的系統(tǒng)中有一個任務(wù)流程,一般情況下這個任務(wù)的代碼邏輯、流程你都要
4、自己來編寫。實現(xiàn)它是沒有問題的。但是誰能保證邏輯編寫的毫無紕漏?經(jīng)過無數(shù)次的測試與改進(jìn),這個流程沒有任何漏洞也是可以實現(xiàn)的,但是明顯就會拖慢整個項目的進(jìn)度。 工作流引擎解決的就是這個問題:如果應(yīng)用程序缺乏強(qiáng)大的邏輯層,勢必變得容易出錯(信息的路由錯誤、死循環(huán)等等)。1.2. BPMN2.0規(guī)范BPMN(Business Process Model and Notation)-業(yè)務(wù)流程模型與符號。BPMN是一套流程建模的標(biāo)準(zhǔn),主要目標(biāo)是被所有業(yè)務(wù)用戶容易理解的符號,支持從創(chuàng)建流程輪廓的業(yè)務(wù)分析到這些流程的最終實現(xiàn),知道最終用戶的管理監(jiān)控。通俗一點其實就是一套規(guī)范,畫流程模型的規(guī)范。流程
5、模型包括:流程圖、協(xié)作圖、編排圖、會話圖。詳細(xì)信息請google。1.3. Activiti概述1.3.1. Activiti由來學(xué) 習(xí)過Activiti的朋友都知道,Activiti的創(chuàng)始人也就是JBPM(也是一個優(yōu)秀的BPM引擎)的創(chuàng)始人,從Jboss離職后開發(fā)了一個新的 BPM引擎:Activiti。所以,Activiti有很多地方都有JBPM的影子。所以,據(jù)說學(xué)習(xí)過JBPM的朋友學(xué)起Activiti來非常順手。由于本人之前沒有工作流及JBPM的相關(guān)基礎(chǔ),剛開始學(xué)習(xí)Activiti的時候可以說是無比痛苦的,根本不知道從何下手,這里也建議大家先進(jìn)行工作流及BPMN2.0規(guī)范的學(xué)習(xí),有了一定
6、的基礎(chǔ)后,再著手學(xué)習(xí)Activiti。1.3.2. Activiti簡介Activiti是一個開源的工作流引擎,它實現(xiàn)了BPMN 2.0規(guī)范,可以發(fā)布設(shè)計好的流程定義,并通過api進(jìn)行流程調(diào)度。Activiti 作為一個遵從 Apache 許可的工作流和業(yè)務(wù)流程管理開源平臺,其核心是基于 Java 的超快速、超穩(wěn)定的 BPMN2.0 流程引擎,強(qiáng)調(diào)流程服務(wù)的可嵌入性和可擴(kuò)展性,同時更加強(qiáng)調(diào)面向業(yè)務(wù)人員。Activiti 流程引擎重點關(guān)注在系統(tǒng)開發(fā)的易用性和輕量性上。每一項 BPM 業(yè)務(wù)功能 Activiti 流程引擎都以服務(wù)的形式提供給開發(fā)人員。通過使用這些服務(wù),開發(fā)人員能夠構(gòu)建出功能豐富、輕
7、便且高效的 BPM 應(yīng)用程序。1.4. 文檔說明以上部分對工作流、BPMN、Activiti的概念做了一個簡單的介紹,目的是了解Activiti究竟是什么,能做些什么及在學(xué)習(xí)Activiti之前需要了解的知識與技術(shù)。其中大部分文字來自Copy網(wǎng)上的各種資料與文檔,通過總結(jié)而來的。具體的更詳細(xì)的內(nèi)容需自己google,參考一些官方的文檔與手冊。本文檔之后內(nèi)容如下:1) 下載與使用2) 核心組件與說明3)
8、0; 入門示例4) Eclipse中的Activiti插件的使用本文檔旨在為初學(xué)Activiti的朋友提供入門級別的參考,不會對其原理及其結(jié)構(gòu)進(jìn)行深層次的探究(更多是因為目前自身理解還不是很透徹),只是為大家理清思路,方便以后更深層次的學(xué)習(xí)。本文檔還有一個重要的特點,那就是根據(jù)自己看官方手冊的經(jīng)驗,教大家如何看手冊從而更有效率!由于是初學(xué),很多術(shù)語或解釋難免理解有偏差,所以一定要看官方提供的文檔與手冊,那才是學(xué)習(xí)的最佳途徑!2. 開始學(xué)習(xí)2.1. 必要的準(zhǔn)備2.1.1. 下載與了解目錄下載Activiti:下載路徑
9、,也就是官方網(wǎng)站的地址:/download.html。下載后解壓(我所使用的是5.12版本的,Activiti更新速度飛快,幾乎每兩個月就會有一個更新的小版本),看到如下目錄:1) database: 里面存放的是Activiti使用到的數(shù)據(jù)庫信息的sql文件,它支持的數(shù)據(jù)庫類型如下圖,使用時只需執(zhí)行你自己的數(shù)據(jù)庫類型的文件即可。如:你的數(shù)據(jù)庫 是mysql,那么就執(zhí)行activiti.mysql.create.*.sql即可。2)
10、; docs:毫無疑問,api文檔是也。3) libs:使用Activiti所需要的所有的jar包和源文件。4) wars:官方給我們提供的示例Demo,通過使用Demo可以更加快速的了解Activiti。2.1.2. 其他準(zhǔn)備使用Activiti,首先當(dāng)然要有jdk了!6+版本就可以了。其次,要有一款I(lǐng)DE,我們當(dāng)然會使用Eclipse,這里使用Juno版本。然后,web容器當(dāng)然也要有,這里使用Tomcat6.0版本。然后就是Activiti的
11、Eclipse插件了,這個后面再介紹。2.1.3. 一分鐘入門(見用戶手冊)所謂的一分鐘入門就是通過運行你下載的包里的wars文件夾里的activiti-explorer.war文件,以便更快的了解Activiti。將文件拷貝至Tomcat的webapps目錄,啟動tomcat,輸入http:/localhost:8080/activiti-explorer。然后你就可以開整了!總算是有一點微小的進(jìn)展了。這里需要說明的就是,這個Demo默認(rèn)采用的是h2內(nèi)存數(shù)據(jù)庫,如果想用你自己的數(shù)據(jù)庫,就需要修改web應(yīng)用WEB-INF/classes目錄下的perties。然后,按上面說的,把d
12、atabase里的create文件夾里的數(shù)據(jù)庫文件導(dǎo)入你自己的數(shù)據(jù)庫(如果沒有修改perties,就不用導(dǎo)入了)。Demo的具體解釋與數(shù)據(jù)庫配置的具體信息詳見官方手冊,手冊已經(jīng)說的很清楚了。這里需要重點了解activiti.cfg.xml的配置以及如何構(gòu)建ProcessEngine(配置文件構(gòu)建方式、代碼構(gòu)建方式)。對Demo的使用介紹在官方文檔的后面才開始介紹,這里建議應(yīng)用跑起來之后,先自己試試手(可看后面介紹Demo如何使用的章節(jié)),看看如何跑一個流程、整個流程是怎么流的、并隨時關(guān)注數(shù)據(jù)庫表里的數(shù)據(jù)的變化等,對以后的學(xué)習(xí)很有幫助!2.2. 核心組件介紹2.2.1. 關(guān)鍵對象1.
13、 Deployment:流程部署對象,部署一個流程時創(chuàng)建。2. ProcessDefinitions:流程定義,部署成功后自動創(chuàng)建。3. ProcessInstances:流程實例,啟動流程時創(chuàng)建。 4. Task:任務(wù),在Activiti中的Task僅指有角色參與的任務(wù),即定義中的UserTask。
14、0;5. Execution:執(zhí)行計劃,流程實例和流程執(zhí)行中的所有節(jié)點都是Execution,如UserTask、ServiceTask等。2.2.2. 服務(wù)接口1. ProcessEngine:流程引擎的抽象,通過它我們可以獲得我們需要的一切服務(wù)。 2. RepositoryService:Activiti 中每一個不同版本的業(yè)務(wù)流程的定義都需要使用一些定義文件,部署文件和支
15、持?jǐn)?shù)據(jù)(例如BPMN2.0 XML文件,表單定義文件,流程定義圖像文件等),這些文件都存儲在Activiti內(nèi)建的Repository中。RepositoryService 提供了對 repository的存取服務(wù)。3. RuntimeService: 在Activiti中,每當(dāng)一個流程定義被啟動一次之后,都會生成一個相應(yīng)的流程對象實例。RuntimeService提供了啟動流程、查詢流程實例、 設(shè)置獲取流程實例變量等功能。此外它還提供了對流程部署,流程定義和流程實例的存取服務(wù)。4.
16、60; TaskService: 在Activiti中業(yè)務(wù)流程定義中的每一個執(zhí)行節(jié)點被稱為一個Task,對流程中的數(shù)據(jù)存取,狀態(tài)變更等操作均需要在Task中完成。 TaskService提供了對用戶Task 和Form相關(guān)的操作。它提供了運行時任務(wù)查詢、領(lǐng)取、完成、刪除以及變量設(shè)置等功能。 5. IdentityService: Activiti中內(nèi)置了用戶以及組管理的功能,必須使用這些用戶和組的信息才能獲取到相應(yīng)的Task。IdentityService提供了對Activiti 系統(tǒng)中的用戶
17、和組的管理功能。6. ManagementService: ManagementService提供了對Activiti流程引擎的管理和維護(hù)功能,這些功能不在工作流驅(qū)動的應(yīng)用程序中使用,主要用于Activiti系統(tǒng)的日常維護(hù)。 7. HistoryService: HistoryService用于獲取正在運行或已經(jīng)完成的流程實例的信息,與RuntimeService中獲取的流程信息不同,歷史信息包含已經(jīng)持久化存儲的永久信息,并已經(jīng)被針對查詢優(yōu)化?,F(xiàn)
18、在至少要知道有這些對象和接口。并結(jié)合Activiti Api這一章節(jié)來看,你就會對部署流程、啟動流程、執(zhí)行任務(wù)等操作有一個基本的概念。之后編寫一個簡單的單元測試,主要為了測試activiti.cfg.xml配置的是否正確,流程是否可以被部署即可。至于與Spring的集成,一定要熟悉基于Spring配置Activiti,以及事務(wù)的處理。3. 入門示例(參考手冊中10分鐘教程)3.1. 概述下面開始編寫一個示例。這個Demo為一個“月度報表申請”流程。由“sales(銷售)”組的用戶制作月度報表,提交給“management(經(jīng)理)”組的用戶,經(jīng)理審批該報表,最后結(jié)束。流程圖如下:這 個Demo完
19、成之后,我們會進(jìn)行兩個測試。一個是代碼中的單元測試,就是跑一遍流程,看一下流程在跑的過程中輸出的信息;一個是我們將編輯好的 bpmn20.xml文件通過我們之前一分鐘入門的示例activiti-explorer應(yīng)用導(dǎo)入進(jìn)去,查看它的流程圖,并完整執(zhí)行一遍流程。在編寫這個Demo之前,至少要了解Activiti與Spring如何集成、XxxService各自的任務(wù)與作用,并完成上一章的Demo。3.2. 流程文件xxx.bpmn20.xml首先,我們就來編寫這個流程的bpmn20.xml文件。<definitions id="definitions"
20、; targetNamespace="/bpmn20" xmlns:activiti="/bpmn" xmlns="/spec/BPMN/20100524/MODEL"> <process id="financialReport" name="Month
21、ly financial report reminderprocess"> <startEvent id="theStart" /> <sequenceFlow id='flow1' sourceRef='theStart' targetRef='writeReportTask'
22、/> <userTask id="writeReportTask" name="Write monthly financial report" > <documentation> Write monthly financial rep
23、ortfor publication to shareholders. </documentation> <potentialOwner> <resourceAssignmentExpression>
24、160; <formalExpression>sales</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask>
25、0; <sequenceFlow id='flow2' sourceRef='writeReportTask' targetRef='verifyReportTask' /> <userTask id="verifyReportTask" name="Verify monthly financial
26、 report" > <documentation> Verify monthly financial reportcomposed by the accountancy department. This financial report is goingto be sent
27、to all the company shareholders. </documentation> <potentialOwner> <resourceAssignmentExpression>
28、; <formalExpression>management</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask>
29、160; <sequenceFlow id='flow3' sourceRef='verifyReportTask' targetRef='theEnd' /> <endEvent id="theEnd" /> </process&g
30、t;</definitions> 這里對部分代碼進(jìn)行解釋。1) 文件的開頭部分,這里的id對于Activiti來說, 應(yīng)該叫做key。創(chuàng)建流程實例時,會根據(jù)此id來得到這個流程。2) 開始流程。3) 順序流(就是連接各個節(jié)點的指向線)sourceRef和targetRef分別為起始節(jié)點和目標(biāo)節(jié)點。4)
31、160;描述用戶任務(wù)id為該用戶任務(wù)的標(biāo)識。documentation為該用戶任務(wù)的描述。5) 分配用戶可以把任務(wù)分配給指定的用戶,也可以分配給指定的組,并且可以有多個,詳見用戶手冊。3.3. Spring配置文件這里配置了數(shù)據(jù)源、事務(wù)管理、流程引擎及幾個必要的xxxService。這里數(shù)據(jù)源使用的是dbcp。數(shù)據(jù)庫信息就配置成你自己本地數(shù)據(jù)庫的信息,如果不會配置。 <bean id="dataSource" class=
32、"mons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> &
33、#160; <property name="url" value="jdbc:mysql:/localhost:3306/activiti"/> <property name="username" value="root"/>
34、60; <property name="password" value="root"/> <property name="initialSize" value="20" /> <pr
35、operty name="maxActive" value="50"/> <property name="maxIdle" value="20"/> <property name="minIdle" va
36、lue="10"/> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
37、; <property name="dataSource" ref="dataSource"></property> </bean> <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngi
38、neConfiguration"> <property name="dataSource" ref="dataSource" /> <property name="transactionManager" ref="transactio
39、nManager" /> <property name="databaseSchemaUpdate" value="true" /> <property name="jobExecutorActivate" value="f
40、alse" /> </bean> <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"> <property name="processEngineCo
41、nfiguration" ref="processEngineConfiguration" /> </bean> <bean id="repositoryService" factory-bean="processEngine" factory-metho
42、d="getRepositoryService" /> <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" /> <bean
43、60;id="taskService" factory-bean="processEngine" factory-method="getTaskService" /> <bean id="historyService" factory-bean="processEngine"
44、0; factory-method="getHistoryService" /> <bean id="managementService" factory-bean="processEngine" factory-method="getManagemen
45、tService" /> <tx:annotation-driven transaction-manager="transactionManager" /> 注:bpmn20.xml 文件中用到了兩個用戶組(sales、management),是因為我們啟動Tomcat運行activiti-explorer應(yīng)用初始化時自動就會 往數(shù)據(jù)庫里添加一些數(shù)據(jù),其中用戶組的表中就會添加幾條記錄,其中就包括這兩個組,所以不用管它怎么來的,總之?dāng)?shù)據(jù)庫里有這兩個組就
46、對了。而應(yīng)用默認(rèn)使用的是內(nèi)存數(shù)據(jù)庫,服務(wù)一停止數(shù)據(jù)也就沒有了。所以為了進(jìn)行單元測試,需要按前面講的修改數(shù)據(jù)庫配置的方法:把a(bǔ)ctiviti-explorer應(yīng)用的數(shù)據(jù)庫配置改成你自己的本地數(shù)據(jù)庫的信息,我使用的是Mysql數(shù)據(jù)庫。再啟動tomcat運行應(yīng)用(目的就是為了讓數(shù)據(jù)庫有數(shù)據(jù)),這時你的本地數(shù)據(jù)庫就有數(shù)據(jù)了,可以編寫測試用例進(jìn)行單元測試了。3.4. 編寫測試用例1) 讀取Spring配置文件,注入流程所需的Service2) 編寫測試方法
47、; Test public void monthtest() / 部署流程定義 repositoryService.createDeployment().addClasspathResource("myProcess.bpmn20.xml").deploy();
48、160; / 啟動流程實例 String procId = runtimeService.startProcessInstanceByKey("financialReport").getId(); / 獲得第一個任務(wù) List&l
49、t;Task> tasks = taskService.createTaskQuery().taskCandidateGroup("sales").list(); for (Task task : tasks) System.out.println("Following task is available for
50、sales group: " + task.getName(); / 認(rèn)領(lǐng)任務(wù)這里由foozie認(rèn)領(lǐng),因為fozzie是sales組的成員 taskService.claim(task.getId(), "fozzie");
51、0; / 查看fozzie現(xiàn)在是否能夠獲取到該任務(wù) tasks = taskService.createTaskQuery().taskAssignee("fozzie").list(); for (Task task : ta
52、sks) System.out.println("Task for fozzie: " + task.getName(); / 執(zhí)行(完成)任務(wù) tas
53、kSplete(task.getId(); / 現(xiàn)在fozzie的可執(zhí)行任務(wù)數(shù)就為0了 System.out.println("Number of tasks for fozzie: "
54、 + taskService.createTaskQuery().taskAssignee("fozzie").count(); / 獲得第二個任務(wù) tasks = taskSer
55、vice.createTaskQuery().taskCandidateGroup("management").list(); for (Task task : tasks) System.out.println("Following task is available for accountancy group:"
56、160;+ task.getName(); / 認(rèn)領(lǐng)任務(wù)這里由kermit認(rèn)領(lǐng),因為kermit是management組的成員 taskService.claim(task.getId(), "kermit");
57、160; / 完成第二個任務(wù)結(jié)束流程 for (Task task : tasks) taskSplete(task.getId(); &
58、#160; / 核實流程是否結(jié)束,輸出流程結(jié)束時間 HistoricProcessInstancehistoricProcessInstance = historyService.createHistoricProcessInstanceQuery()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- LY/T 3405-2024竹材弧形原態(tài)重組材
- 人教版數(shù)學(xué)七年級下冊第7課時《平行線的性質(zhì)(一)》聽評課記錄
- 2025年造紙色漿合作協(xié)議書
- 湘教版數(shù)學(xué)七年級上冊《3.4一元一次方程模型的應(yīng)用(1)》聽評課記錄
- 蘇人版道德與法治九年級上冊7.2《違法要受法律處罰》聽課評課記錄
- 生態(tài)保護(hù)資源共享合同(2篇)
- 環(huán)境監(jiān)測設(shè)備合作開發(fā)合同(2篇)
- 六年級上冊聽評課記錄
- (人教版)七年級下冊數(shù)學(xué)配套聽評課記錄:5.1.3 《同位角、內(nèi)錯角、同旁內(nèi)角》
- 四年級科學(xué)聽評課記錄
- 塑料加工碎料指導(dǎo)書
- 海南省儋州市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細(xì)及行政區(qū)劃代碼居民村民委員會
- 人力資源管理專業(yè)畢業(yè)設(shè)計論文
- 法理學(xué)-(第五版)完整版ppt全套教學(xué)教程課件(最新)
- 香港地圖高清矢量可填充編輯PPT模板(精美)
- 《朝天子-詠喇叭》
- 氧化還原反應(yīng)方程式的配平(八大配平技巧)-PPT課件
- 天津人社局解除勞動合同證明書
- (高清正版)JJF(浙)1090—2014薄片千分尺校準(zhǔn)規(guī)范
- 2020年采購部年度目標(biāo)計劃 采購部工作目標(biāo)
- 陽光分級閱讀高一上The Emperor Penguin課件
評論
0/150
提交評論