1. 程式人生 > >activiti自定義流程之整合(四):整合自定義表單部署流程定義

activiti自定義流程之整合(四):整合自定義表單部署流程定義

綜合前幾篇博文內容,我想在整合這一部分中應該會有很多模組會跳過不講,就如自定義表單的表單列表那一塊,因為這些模組在整合的過程中都幾乎沒有什麼改動,再多講也是重複無用功。


正因為如此,在建立了流程模型之後,模型列表的展示也是和之前的沒有什麼區別,而且都是很簡單的後臺查詢以及前臺展示,這一部分也就不過多的講了。


模型列表頁面如下:


 
至於其中的修改和刪除也沒什麼多講的,刪除很簡單,而修改也是activiti-modeler實現的主要功能,我們只需要跳轉過去就行。


重要的部分在於部署,因為點選部署到達後臺以後,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>建立時間</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);
        }
      
  
}])  



而後程式到達後臺,後臺程式碼如下:
/**
	 * 根據模型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());
                 //區別在這裡
				List<JsonNode> forms = modelNode
						.findValues("formkeydefinition");
				for (JsonNode node : forms) {
					// aaa.form
					String formName = node.textValue();
					if (!"".equals(formName)) {
						// 就是頁面的html程式碼根據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的設定。



在這段程式碼中,需要我們自己根據formKey(即自定義的表單的檔名)從資料中查詢出相應的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;
	}


實現這個表單設定的目的實際上是為了之後啟動流程時的操作,因為部署之後就有了流程定義列表,在流程定義列表中就可以啟動流程,只有在這裡設定了,那麼點選啟動流程時才能呼叫activitiService的相關方法獲取對應節點的表單。


有了這個操作,在我們部署成功之後,可以看到與之前的部署相比,在資料庫ac_ge_bytearray表中會再多出一條表單相關的資料,如圖:


那麼至此,整合自定義表單部署流程結束。

相關推薦

activiti定義流程整合整合定義部署流程定義

綜合前幾篇博文內容,我想在整合這一部分中應該會有很多模組會跳過不講,就如自定義表單的表單列表那一塊,因為這些模組在整合的過程中都幾乎沒有什麼改動,再多講也是重複無用功。 正因為如此,在建立了流程模型之後,模型列表的展示也是和之前的沒有什麼區別,而且都是很簡單的後臺查詢以及前

activiti自己定義流程整合整合自己定義部署流程定義

borde row ont 創建 source als dst art select 綜合前幾篇博文內容。我想在整合這一部分中應該會有非常多模塊會跳過不講,就如自己定義表單的表單列表那一塊,由於這些模塊在整合的過程中都差點兒沒有什麽修改,再多講也是反復無用功。

activiti定義流程整合整合定義建立模型

本來在建立了表單之後應該是表單列表和預覽功能,但是我看了看整合的程式碼,和之前沒有用angularjs的基本沒有什麼變化,一些極小的變動也只是基於angularjs的語法,因此完全可以參考之前說些的表單列表展示相關的內容,這裡也就直接進入到下一個步驟,建立流程模型了。

我的C#跨平臺使用AOP進行系統增強

odata ima ges rest eba 技術分享 啟動 get header 使用OData提速REST API開發 引入NuGet包:Microsoft.AspNet.WebApi.OData 在啟動類中添加如下配置(示例為全局配置,也可基於Contro

我的機器學習回歸與工程應用

多個 算法 ati function RR numpy pen 圖片 bsp 內容:線性回歸;邏輯回歸,應用場景。 一、線性回歸 有監督學習,根據學習樣本{x->y},學習一個映射f:X->Y(線性相關),輸出預測結果y_i。最簡單的例子:y=ax+b 重要組成

深度學習 TensorFlow卷積神經網絡

padding valid 叠代 val 分析 此外 nbsp drop BE 基礎概念:   卷積神經網絡(CNN):屬於人工神經網絡的一種,它的權值共享的網絡結構顯著降低了模型的復雜度,減少了權值的數量。卷積神經網絡不像傳統的識別算法一樣,需要對數據進行特征提取和數據重

Linux 學習管道、重定向、正則

管道及IO重定向 運算器、控制器:CPU 儲存器:RAM 輸入裝置/輸出裝置 程式:指令和資料 控制器:指令 運算器: 儲存器: 地址匯流排:記憶體定址 資料匯流排:傳輸資料 控制匯流排:控制指令 暫存器:CPU暫時儲存器 I/O:硬碟 系

微信小程式填坑微信登入獲取openid、unionid

在微信小程式中,因為各種各樣的原因我們會需要獲取到使用者的openid或者unionid下面就簡單來講一下在小程式中如何獲取openid和unionid。 步驟一:微信登入獲取登入憑證

Cocos2D遊戲卡牌翻轉效果的實現

曉石頭的部落格 郵箱:[email protected] 上篇講解了用ScaleTo縮放卡牌,達到翻轉的效果。 條條大道通羅馬,RotateBy 旋轉卡牌同樣能夠實現,而且效果更棒,就看你喜歡哪種了! 效果對比圖 一、先談思路: 用ScaleTo縮放卡

linux系統程式設計程序程序退出exit,_exit區別即atexit函式

一,程序終止有5種方式: 正常退出: 從main函式返回 呼叫exit 呼叫_exit 異常退出: 呼叫abort 由訊號終止 二,exit和_exit區別: 關於_exit():        #include <unistd.h>     

MyEclipse整合SSM框架整合前端頁面,通過ajax請求獲得資料

Spring+SpringMVC+Mybatis 框架已經搭建完成,其中包括:(1)maven工程的搭建 (2)框架所需要的配置檔案的配置 (3)Mybatis 建立逆向工程連結資料庫。相應的配置檔案參見前幾篇部落格。此篇整理前端頁面傳送ajax 請求到後端,後端通過 Myb

我的python列表

mage cycle 之間 信息 索引 網站 告訴 tor 提取 1、列表是什麽 列表是由一系列按照特定順序排列的元素組成,它可以創建包含字母表中的所有字母、數字0-9或所有家庭成員姓名的列表;也可以將任何東西加入列表中,其中的元素之間可以沒有任何關系。鑒於列

Spring Boot 2.x整合Mybatis的種方式

前言 目前的大環境下,使用Mybatis作為持久層框架還是佔了絕大多數的,下面我們來說一下使用Mybatis的幾種姿勢。 姿勢一:

詳解C#中Socket通訊使用雜湊管理客戶端

public void StartListening() { //獲取本機IP地址 IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName()); HostIP = ipHo

ASP.NET 安全認證如何運用 Form 認證

程式碼寫 N 久了,總想寫得別的。這不,上頭說在整合兩個專案,做成單一登入(Single Sign On),也有人稱之為“單點登入”。查閱相關文件後,終於實現了,現在把它拿出來與大家一起分享。或許大家會問:“這與標題不符呀?”別急,在下筆之前,我腦子裡想到了我剛使用 Form

activiti定義流程整合獲取我的申請任務

流程啟動後,流程節點便進入到了任務相關的部分。可以看到我之前的做法是在啟動節點就綁定了form表單,啟動時就填寫相關的資料。實際上在之前我的做法是不對開始節點做任何操作,知道任務節點的時候再填寫相關的資料進行設定。 至於這兩種方式的優劣,我暫時還不太確定,單獨從功能上來說

從零開始學 Web HTML5拖拽介面,Web儲存,定義播放器

>大家好,這裡是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... > > - github:https://github.com/Daotin/Web > - 微信公眾號:[Web前端之巔](https://github.com/Daotin/pi

從零開始學 Web jQuery元素的建立新增與刪除,定義屬性

一、元素的建立新增和刪除 1、方式一:以物件的方式建立元素 append,appendTo :在被選元素所有子元素的結尾插入內容(增加子元素)。 prepend,prependTo:在被選元素所有子元素的開頭插入元素(增加子元素)。 before:在當前被選元素之後插入內容(相當於增加兄弟元素)。 af

定義控制元件繪圖篇canvas變換與操作

前言:前幾篇講解了有關canvas繪圖的一些操作,今天更深入一些,講講對畫布的操作,這篇文章不像前幾篇那麼容易理解,如果以前沒有接觸過畫布的童鞋可能比較難以理解,為什麼會這樣。我儘量多畫圖,讓大家更清晰明白。前幾天偶然看到一篇文章,寫的樸實無華,充滿正能量,我非常喜歡裡面的一

Django 筆記模板標籤 ~ 定義過濾器

模板標籤: 標籤在渲染的過程中提供任意的邏輯 語法: 由{% ... %} 和 {% end... %}   常用標籤:      with:類似取別名     模版繼承: Django模版引擎中最強大也是最