綜合前幾篇博文內容,我想在整合這一部分中應該會有很多模塊會跳過不講,,就如自定義表單的表單列表那一塊,,因為這些模塊在整合的過程中都幾乎沒有什么改動,再多講也是重復無用功,。
正因為如此,,在創(chuàng)建了流程模型之后,模型列表的展示也是和之前的沒有什么區(qū)別,,而且都是很簡單的后臺查詢以及前臺展示,,這一部分也就不過多的講了。
模型列表頁面如下:
至于其中的修改和刪除也沒什么多講的,,刪除很簡單,,而修改也是activiti-modeler實現(xiàn)的主要功能,我們只需要跳轉過去就行,。
重要的部分在于部署,,因為點擊部署到達后臺以后,activiti就要和自定義的form表單打賞關系,。
以上頁面的html代碼如下:
-
<div id="logdiv1" ng-init="init();">
-
<p style="font-size:24px;margin:3px">模型列表</p>
-
<center>
-
<table border="1px" style="margin-top:1px;width:87%;font-size:18px;text-align:center;margin-left:2px;margin-top:auto;position:relative;float:left;" cellSpacing="0px" cellPadding="0px">
-
<tr style="background-color:#ccc">
-
<td>ID</td>
-
<td>NAME</td>
-
<td>KEY</td>
-
<td>描 述</td>
-
<td>版本</td>
-
<td>創(chuàng)建時間</td>
-
<td>修改時間</td>
-
<td>操 作</td>
-
</tr>
-
<tr ng-repeat="model in modelList | orderBy:'id'" >
-
<td>{{model.id}}</td>
-
<td>{{model.name}}</td>
-
<td>{{model.key}}</td>
-
<td>{{model.metaInfo}}</td>
-
<td>{{model.version}}</td>
-
<td>{{model.createTime | date:"yyyy-MM-dd HH:mm:ss"}}</td>
-
<td>{{model.lastUpdateTime | date:"yyyy-MM-dd HH:mm:ss"}}</td>
-
<td><a href="script:;" ng-click="deploye(model)">部署</a>
-
<a href="script:;" ng-click="delete(model)">刪除</a>
-
<a href="script:;" ng-click="update(model.id)">修改</a>
-
</td>
-
</tr>
-
</table>
-
</center>
-
</div>
點擊部署要走到后臺,,前臺就需要js控制,相應的js代碼如下:
-
angular.module('activitiApp')
-
.controller('modelCtr', ['$rootScope','$scope','$http','$location', function($rootScope,$scope,$http,$location){
-
$scope.init=function(){
-
$http.post("./modelList.do").success(function(result) {
-
if(result.isLogin==="yes"){
-
$rootScope.userName=result.userName;
-
console.log(result.data);
-
$scope.modelList=result.data;
-
}else{
-
$location.path("/login");
-
}
-
});
-
}
-
$scope.deploye=function(model){
-
console.log(model);
-
$http.post("./deploye.do",model).success(function(deployResult){
-
$location.path("/processList");
-
});
-
}
-
-
$scope.update=function(modelId){
-
window.open("http://localhost:8080/activitiTest1/service/editor?id="+modelId);
-
}
-
-
-
}])
而后程序到達后臺,,后臺代碼如下:
-
/**
-
* 根據(jù)模型id部署流程定義
-
*
-
* @author:tuzongxun
-
* @Title: deploye
-
* @param @param activitiModel
-
* @param @param redirectAttributes
-
* @param @return
-
* @return Object
-
* @date Mar 17, 2016 12:30:05 PM
-
* @throws
-
*/
-
@RequestMapping(value = "/deploye.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
-
@ResponseBody
-
public Object deploye(@RequestBody ActivitiModel activitiModel,
-
HttpServletRequest req) {
-
Map<String, Object> map = new HashMap<String, Object>();
-
boolean isLogin = this.isLogin(req);
-
if (isLogin) {
-
String modelId = activitiModel.getId();
-
try {
-
// 獲取forms拿到formname
-
Model modelData = repositoryService.getModel(modelId);
-
ObjectNode modelNode = (ObjectNode) new ObjectMapper()
-
.readTree(repositoryService
-
.getModelEditorSource(modelData.getId()));
-
byte[] bpmnBytes = null;
-
BpmnModel model = new BpmnJsonConverter()
-
.convertToBpmnModel(modelNode);
-
bpmnBytes = new BpmnXMLConverter().convertToXML(model);
-
DeploymentBuilder db = repositoryService.createDeployment()
-
.name(modelData.getName());
-
//區(qū)別在這里
-
List<JsonNode> forms = modelNode
-
.findValues("formkeydefinition");
-
for (JsonNode node : forms) {
-
// aaa.form
-
String formName = node.textValue();
-
if (!"".equals(formName)) {
-
// 就是頁面的html代碼根據(jù)formName找到
-
String formContent = myFormService
-
.findFormByFormName(formName);
-
ByteArrayInputStream bi = new ByteArrayInputStream(
-
formContent.getBytes());
-
db.addInputStream(formName, bi);
-
break;
-
}
-
}
-
Deployment deployment = db.addString(
-
modelData.getName() + ".bpmn20.xml",
-
new String(bpmnBytes)).deploy();
-
if (deployment != null && deployment.getId() != null) {
-
map.put("isLogin", "yes");
-
map.put("userName",
-
(String) req.getSession().getAttribute("userName"));
-
map.put("result", "success");
-
}
-
} catch (Exception e) {
-
e.printStackTrace();
-
-
-
}
-
} else {
-
map.put("isLogin", "no");
-
}
-
return map;
-
}
拿這段代碼和之前單獨的activiti流程部署的代碼相比,,就可以看到這里多出了查詢form的操作以及部署時新的inputStream的設置。
在這段代碼中,,需要我們自己根據(jù)formKey(即自定義的表單的文件名)從數(shù)據(jù)中查詢出相應的html表單代碼,,這段代碼也是自己寫的,如下:
-
public Connection getDb() {
-
Connection connection = null;
-
try {
-
Class.forName("com.mysql.jdbc.Driver");
-
connection = DriverManager.getConnection(
-
"jdbc:mysql://localhost:3306/testtu", "root", "123456");
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
return connection;
-
}
-
-
-
public String findFormByFormName(String formName) {
-
String formString = null;
-
Connection connection = this.getDb();
-
Statement statement;
-
try {
-
statement = connection.createStatement();
-
PreparedStatement ps = connection
-
.prepareStatement("select * from formtest where formType=?");
-
ps.setString(1, formName);
-
ResultSet resultSet = ps.executeQuery();
-
while (resultSet.next()) {
-
formString = resultSet.getString(3);
-
}
-
;
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
return formString;
-
}
實現(xiàn)這個表單設置的目的實際上是為了之后啟動流程時的操作,,因為部署之后就有了流程定義列表,,在流程定義列表中就可以啟動流程,只有在這里設置了,,那么點擊啟動流程時才能調用activitiService的相關方法獲取對應節(jié)點的表單,。
有了這個操作,在我們部署成功之后,,可以看到與之前的部署相比,,在數(shù)據(jù)庫ac_ge_bytearray表中會再多出一條表單相關的數(shù)據(jù),如圖:
那么至此,,整合自定義表單部署流程結束,。
|