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

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

borde row ont 創建 source als dst art select

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




正由於如此,在創建了流程模型之後。模型列表的展示也是和之前的沒有什麽差別。並且都是非常easy的後臺查詢以及前臺展示。這一部分也就只是多的講了。




模型列表頁面例如以下:

技術分享


至於當中的改動和刪除也沒什麽多講的,刪除非常easy,而改動也是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自己定義流程之整合(四):整合自己定義表單部署流程定義