您好,登錄后才能下訂單哦!
一直以來都是從事大量的工作流相關的項目,用過很多商用的工作流產品,包括國內與國外的,盡管商用的工作產品在UI操作上比較人性化,但個人用戶覺得,這東西只需要一些初級用戶,對于我們一直在為一些高級的客戶提供一些專業的數據整合、流程梳理、系統間的數據穿透時,這些系統因為不開源,給項目的實施帶來巨大的風險,在一些項目栽過跟頭后,我更偏向于使用開源的平臺了。但開源平臺最大的難點是在于你是否有足夠的技術人員來學習及掌握它,否則,它也一樣面臨項目實施失敗的風險。后來在一些項目上使用JBPM4,Activiti5,發現Activiti5的流程功能真的很強大,幾乎是無所不能。套用一句廣告語,老板再也不擔心我的流程實現了。在實施國外的項目時,流程的設計幾乎是交給開發人員來處理的,因此用Activiti的合適的。但在國內,我們的客戶則提出更高的要求,要求普通的人員也可以參與流程的設計要求。Activiti后續的版本也在完善這些功能,特別是Activiti-5.18版本,Activiti-Modeler的建模工具幾乎進行了重寫,看來Activiti的開源團隊也慢慢意識了這點,加大了人力在這方面的投入,以目前的使用,可以達到商用級別,通過功能的擴展,可以很好實現在線流程建模。
為了平臺未來的延伸擴展,我建議直接使用該團隊的Activiti-Modeler,原因很簡單,可以有效跟著團隊進行產品的升級,當然我們也需要擴展自己的特色功能,這塊我在后面不斷把文章寫出來,以供大家學習。
在此,先展示一下我在JSAAS平臺上初步整合Activiti-Modeler的效果:
說實話,雖然這設計器還有一些小小的缺陷,但仍然阻止不了我愛它,因為全新自己開發這東西,那是比較要命的,呵呵,苦逼的程序員呀。于是我多么希望在我的Activiti的流程應用里,直接就帶這么一款應用。
現實提美好的, 整合是苦逼的,于是就有本文的出現。
在我的博客前一篇中,已經有說明如何利用Activiti-Modeler的源碼跑起來,加至eclipse下運行起來,在本文中即是以該文為基礎,進行本文的說明及整合。
Activiti-Modeler 5.18用了新的WEB框架,其是基于Spring-Mvc 4.0以上的框架,同時用了VAADIN的RIA的UI,特別是后者,這框架帶有太多的jar包,雖然它也是結合了spring來使用,要整合這玩意,幾乎就得把這東西加入我們的項目中,同時還需要整合它的用戶管理,這是要命的。我們的出發點,僅是用它的前端畫圖處理功能,后端的流程邏輯處理即由我們來實現。
于是我研究了一下Activiti-webapp-explorer2項目,發現要實現我以上的目標,原來很簡單。以下假定我的環境要求,以下為我的原項目的環境,是基于Spring 3的,我的平臺可直接轉為Spring4.0,特別是Spring-MVC的環境也轉成4.0
3.1. 把前端的設計器文件從activiti-webapp-explorer2拷至我平臺上新建的目錄process-editor,如下圖所示:
同時把resources下的stencilset.json文件拷至我的項目中的resources目錄下。
3.2.在Spring項目中加入Activiti 5.18的依賴引用,注意,不能直接從explorer項目中直接取,那樣會帶有很多無用的jar包,以下為精簡后的pom引用。
Xml代碼
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.18.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>5.18.0</version>
<exclusions>
<exclusion>
<artifactId>commons-dbcp</artifactId>
<groupId>commons-dbcp</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-diagram-rest</artifactId>
<version>5.18.0</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-transcoder</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-dom</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>5.18.0</version>
<exclusions>
<exclusion>
<artifactId>commons-collections</artifactId>
<groupId>commons-collections</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-bridge</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-css</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-anim</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-codec</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-ext</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-gvt</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-script</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-parser</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-svg-dom</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-svggen</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-util</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-xml</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-js</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis-ext</artifactId>
<version>1.3.04</version>
</dependency>
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>1.3.04</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>xmlgraphics-commons</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>batik</groupId>
<artifactId>batik-awt-util</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
如不采用common-dbcp的數據源時,以上配置排除該包的引用,
Batik的包主要是用來解析html中的svg的內容,包比較多,但都不大。
3.3.配置如下的spring-activiti.xml文件,其格式如下所示(可從activiti-webapp-explorer2下的resources的activiti-custom-context.xml文件拷出來),把以下的一些用到explorer表單的配置信息刪除。因為我們不采用其表單的配置信息。
注意點:
1. 擴展實現自身的idGenerator
目的是為了產生唯一的數據主鍵,方法很多,請自行實現,不擴展也可以。
2. 配置對應的數據連接信息及數據源、事務等
3.4 .在Spring的配置文件中引入spring-activiti.xml,啟動應用程序即可,可看到其已經把數據庫表創建出來。
3.5. 處理Activiti-Moderler的后臺處理的配置。即創建模型設計、保存、更新等內容,它需要與后端進行交互處理。我們看了activiti-webapp-explorer2的web.xml就清楚其后臺交互的處理模式。
簡要說明:explorer2這個項目在啟動后,就會spring mvc4進行包掃描,把(請參考org.activiti.explorer.servlet.DispatcherServletConfiguration),org.activiti.rest.editor、org.activiti.rest.diagram包下的Controller掃描至響應映射中來,為的就是實現編輯器及設計模型的流程展示時,相應有對應的controller服務。
因此,我們比較好的辦法就是重寫這些controller即可,這些controller的實現也很簡單,在這里,我最簡單的做法就是把這些類直接拷到我的項目中,重命名了包名。(當然也可以直接把以上兩包通過pom依賴加進來),本人不想自己的項目帶有太多的依賴包,所以不直接引用了。
拷完后,我這里的包如下所示:
在SpringMVC中加載這些包,注意,SpringMvc需要為4.0以上的,這樣才能比較好支持RestController的注解方式,否則,請用舊的方式來支持這種Rest URL訪問。
Java代碼
<!--加入Spring Activiti-Modeler的運行配置-->
<context:component-scan base-package="com.redxun.bpm.rest.diagram"/>
<context:component-scan base-package="com.redxun.bpm.rest.editor"/>
在web.xml中配置攔截這些訪問路徑
Java代碼
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>/service/*</url-pattern>
;/servlet-mapping>
3.6. 修改process-editor下的一些配置文件,以支持我們的在線流程設計
A)去掉Activiti Afresco的logo標題欄,并且把樣式上的空白欄去掉
修改modeler.html中的以下內容,注意不要把該文本刪除,建議加style=”display:none”,刪除后其會造成底層下的一些內容有40個像數的東西顯示不出來。
Java代碼
<div class="navbar navbar-fixed-top navbar-inverse" role="navigation" id="main-header">
<div class="navbar-header">
<a href="" ng-click="backToLanding()" class="navbar-brand"
title="{{'GENERAL.MAIN-TITLE' | translate}}"><span
class="sr-only">{{'GENERAL.MAIN-TITLE' | translate}}</span></a>
</div>
</div>
B)在editor-app/css/style-common.css中,把以下樣式的padding-top部分改為0px;
Java代碼
.wrapper.full {
padding: 40px 0px 0px 0px;
overflow: hidden;
max-width: 100%;
min-width: 100%;
}
C)在modeler.html中加上CloseWindow的函數
Js代碼
<script type="text/javascript">
function CloseWindow(action) {
if (window.CloseOwnerWindow) return window.CloseOwnerWindow(action);
else window.close();
}
</script>
目的是為了保存模型時,可以關閉當前的彈出的mini窗口,修改保存后彈出的窗口的保存及關閉動作,如下所示,把editor-app/configuration/toolbar-default-action.js的以下函數:
Java代碼
$scope.saveAndClose = function () {
$scope.save(function() {
window.location.href = "./";
});
};
改成以下:
Java代碼
$scope.saveAndClose = function () {
$scope.save(function() {
CloseWindow('ok');
});
};
D) 修改editor-app編輯器的根目錄,如app-cfg.jsJava代碼
ACTIVITI.CONFIG = {
'contextRoot' : '/activiti-explorer/service',
};
改成自己的根目錄:Java代碼
ACTIVITI.CONFIG = {
'contextRoot' : '/redxun_web/service',
};
在實際的項目中,可以把這些ContextRoot改成動態的獲值方式 至此,重啟你的應用后,可直接進入目錄訪問modeler.html頁面。直接訪問該頁面時,框架會出現,但是沒有出現你想要的內容。這是因為后臺出錯了,這個頁面要能正常訪問要求必須傳入Activiti的設計Model的Id,即act_re_model表中的主鍵,訪問路徑如:Myroot/process-editor/modeler.html?modelId=12312312。但這個表的記錄怎么產生,這里需要調用一下Acitiviti的API來創建,如下代碼片段可以實現該功能。Java代碼
String descp=request.getParameter("description");
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode editorNode = objectMapper.createObjectNode();
editorNode.put("id", "canvas");
editorNode.put("resourceId", "canvas");
ObjectNode stencilSetNode = objectMapper.createObjectNode();
stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");
editorNode.set("stencilset", stencilSetNode);
Model modelData = repositoryService.newModel();
ObjectNode modelObjectNode = objectMapper.createObjectNode();
modelObjectNode.put(MODEL_NAME, actReModel.getName());
modelObjectNode.put(MODEL_REVISION, 1);
//String description = null;
modelObjectNode.put(MODEL_DESCRIPTION, descp);
modelData.setMetaInfo(modelObjectNode.toString());
modelData.setName(actReModel.getName());
repositoryService.saveModel(modelData);
repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("utf-8"));
至此,整合創建完成,后續我們會基于Activiti上進行擴展,以實現流程在線定義,流程人員掛接、表單關聯、×××事項、代理、轉辦、歸檔等復雜的中國特色流程的需求。在線訪問整合效果,如:
查看整合的視頻效果如下:
在線整合的效果如登錄后的流程管理--流程定義設計--添加流程
了解咨詢:1361783075
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。