activiti自己定义流程之Spring整合activiti-modeler实例(六):启动流程
1.启动流程并分配任务是单个流程的正式開始,因此要使用到runtimeService接口。以及相关的启动流程的方法。我习惯于用流程定义的key启动,由于有多个版本号的流程定义时,用key启动默认会使用最新版本号。同一时候,由于启动中查询了流程部署时xml文件里流程节点的信息。也用到了repositoryService及相关方法。
2.后台业务代码,
(1)自己定义的申请单实体类(为的目的仅仅为了跑通整个流程。因此仅仅定义了一个实体类。按公司标准开发来说,应该是和前台交互一个command类(事实上也还是实体类,叫法不一样而已),和数据库交互另一个实体类),在这里定义了一个申请单的基本信息:
- package model;
- public class applyModel {
- /**
- * 流程定义id
- */
- private String proDefId;
- /**
- * 流程定义的key
- */
- private String key;
- private String name;
- /**
- * 申请人
- */
- private String appPerson;
- /**
- * 原因
- */
- private String cause;
- /**
- * 内容
- */
- private String content;
- /**
- * 处理人。即下一个任务节点的受理人
- */
- private String proPerson;
- public String getKey() {
- return key;
- }
- public void setKey(String key) {
- this.key = key;
- }
- public String getAppPerson() {
- return appPerson;
- }
- public void setAppPerson(String appPerson) {
- this.appPerson = appPerson;
- }
- public String getCause() {
- return cause;
- }
- public void setCause(String cause) {
- this.cause = cause;
- }
- public String getContent() {
- return content;
- }
- public void setContent(String content) {
- this.content = content;
- }
- public String getProPerson() {
- return proPerson;
- }
- public void setProPerson(String proPerson) {
- this.proPerson = proPerson;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getProDefId() {
- return proDefId;
- }
- public void setProDefId(String proDefId) {
- this.proDefId = proDefId;
- }
- @Override
- public String toString() {
- return "applyModel [proDefId=" + proDefId + ", key=" + key + ", name="
- + name + ", appPerson=" + appPerson + ", cause=" + cause
- + ", content=" + content + ", proPerson=" + proPerson + "]";
- }
- }
(2)业务逻辑:
A,这种方法获取流程部署时xml文件中的各个节点相关信息。用来辨别当前是哪个节点,下一节点又是什么,共下边的B方法调用。
由于操作部署时的文件,因此使用repositoryService:
- /**
- * @throws XMLStreamException
- * 查询流程节点
- *
- * @author:tuzongxun
- * @Title: findFlow
- * @param @return
- * @return Iterator<FlowElement>
- * @date Mar 21, 2016 9:31:42 AM
- * @throws
- */
- public Iterator<FlowElement> findFlow(String processDefId)
- throws XMLStreamException {
- List<ProcessDefinition> lists = repositoryService
- .createProcessDefinitionQuery()
- .processDefinitionId(processDefId)
- .orderByProcessDefinitionVersion().desc().list();
- ProcessDefinition processDefinition = lists.get(0);
- processDefinition.getCategory();
- String resourceName = processDefinition.getResourceName();
- InputStream inputStream = repositoryService.getResourceAsStream(
- processDefinition.getDeploymentId(), resourceName);
- BpmnXMLConverter converter = new BpmnXMLConverter();
- XMLInputFactory factory = XMLInputFactory.newInstance();
- XMLStreamReader reader = factory.createXMLStreamReader(inputStream);
- BpmnModel bpmnModel = converter.convertToBpmnModel(reader);
- Process process = bpmnModel.getMainProcess();
- Collection<FlowElement> elements = process.getFlowElements();
- Iterator<FlowElement> iterator = elements.iterator();
- return iterator;
- }
B.这里调用上一个方法,一起完毕流程的启动及相关信息的设置:
- /**
- * @throws XMLStreamException
- * 启动流程
- *
- * @author:tuzongxun
- * @Title: startProcess
- * @param @return
- * @return Object
- * @date Mar 17, 2016 2:06:34 PM
- * @throws
- */
- @RequestMapping(value = "/startProcess.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
- @ResponseBody
- public Object startProcess(@RequestBody applyModel applyModel,
- HttpServletRequest req) throws XMLStreamException {
- Map<String, String> map = new HashMap<String, String>();
- boolean isLogin = this.isLogin(req);
- if (isLogin) {
- if (applyModel != null) {
- String processKey = applyModel.getKey();
- String processDefId = applyModel.getProDefId();
- // //////////////////////////
- Iterator<FlowElement> iterator = this.findFlow(processDefId);
- Map<String, Object> varables = new HashMap<String, Object>();
- int i = 1;
- while (iterator.hasNext()) {
- FlowElement flowElement = iterator.next();
- // 申请人
- if (flowElement.getClass().getSimpleName()
- .equals("UserTask")
- && i == 1) {
- UserTask userTask = (UserTask) flowElement;
- String assignee = userTask.getAssignee();
- int index1 = assignee.indexOf("{");
- int index2 = assignee.indexOf("}");
- varables.put(assignee.substring(index1 + 1, index2),
- applyModel.getAppPerson());
- varables.put("cause", applyModel.getCause());
- varables.put("content", applyModel.getContent());
- varables.put("taskType", applyModel.getName());
- i++;
- // 下一个处理人
- } else if (flowElement.getClass().getSimpleName()
- .equals("UserTask")
- && i == 2) {
- UserTask userTask = (UserTask) flowElement;
- String assignee = userTask.getAssignee();
- int index1 = assignee.indexOf("{");
- int index2 = assignee.indexOf("}");
- varables.put(assignee.substring(index1 + 1, index2),
- applyModel.getProPerson());
- break;
- }
- }
- // ///////////////////////////
- runtimeService.startProcessInstanceByKey(processKey, varables);
- map.put("userName",
- (String) req.getSession().getAttribute("userName"));
- map.put("isLogin", "yes");
- map.put("result", "success");
- } else {
- map.put("result", "fail");
- }
- } else {
- map.put("isLogin", "no");
- }
- return map;
- }
3.angular js前台代码。:
(1)app.js中配置路由:
- $stateProvider
- .state('startProcess', {
- url: "/startProcess",
- views: {
- 'view': {
- templateUrl: 'activi_views/startProcess.html',
- controller: 'startProcessCtr'
- }
- }
- });
(2)逻辑相关代码:
- angular.module('activitiApp')
- .controller('startProcessCtr', ['$rootScope','$scope','$http','$location', function($rootScope,$scope,$http,$location){
- $http.post("createFlush.do").success(function(result){
- if(result.isLogin==="yes"){
- $rootScope.userName=result.userName;
- $scope.process1={"proDefId":"","key":"","appPerson":"","cause":"","content":"","proPerson":"","name":""};
- if($rootScope.process==null||$rootScope.process.key==null){
- $location.path("/processList");
- }else{
- $scope.process1.proDefId=$rootScope.process.id;
- $scope.process1.key=$rootScope.process.key;
- $scope.process1.name=$rootScope.process.name;
- }
- }else{
- $location.path("/login");
- }
- });
- $scope.startProcess=function(process){
- console.log(process);
- $http.post("./startProcess.do",process).success(function(deployResult){
- $location.path("/taskList");
- });
- }
- }])
4.相应的填写相关信息的页面:
- <center>
- <div style="margin-top:20px;margin-left:200px;background-color:#9cc;height:500px;width:50%;font-size:22px;position:relative;float:left;">
- <p style="font-size:28px">新建申请</p>
- 流程定义id:<input type="text" ng-model="process1.proDefId" readonly="readonly" style="background-color:#9dc"/>
- </br>
- </br>
- 流程定义key:<input type="text" ng-model="process1.key" readonly="readonly" style="background-color:#9dc"/>
- </br>
- </br>
- 申请类型:<input type="text" ng-model="process1.name" readonly="readonly" style="background-color:#9dc"/>
- </br>
- </br>
- 申请人:<input type="text" ng-model="process1.appPerson" />
- </br>
- </br>
- 申请原因:<input type="text" ng-model="process1.cause"/>
- </br>
- </br>
- 申请内容:<input type="text" ng-model="process1.content"/>
- </br>
- </br>
- 受理人:<input type="text" ng-model="process1.proPerson"/>
- </br>
- </br>
- <input style="font-size:24px;cursor:pointer" type="button" value="提交申请" ng-click="startProcess(process1);">
- <input style="font-size:24px;cursor:pointer" type="button" value="返回">
- </div>
- </center>
5.成功启动一个流程实例后,会看到act_ru_execution、act_ru_identitylink、act_ru_task、act_ru_variable以及act_hi_actinst、act_hi_detail、act_hi_indentitylink、act_hi_procinst、act_hi_taskinst、act_hi_varinst表中都有了数据。除开variable和varinst中的数据条数是依据相应的流程变量多少来定的。其它都是添加了一条数据。
activiti自己定义流程之Spring整合activiti-modeler实例(六):启动流程的更多相关文章
- activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
注:(1)环境搭建:activiti自己定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自己定义流程之Spr ...
- activiti自己定义流程之Spring整合activiti-modeler实例(一):环境搭建
项目中须要整合activiti-modeler自己定义流程,找了非常多资料后,最终成功的跳转到activiti-modeler流程设计界面.下面是记录: 一.整合基础:eclipse4.4.1.tom ...
- activiti自己定义流程之Spring整合activiti-modeler实例(七):任务列表展示
1.通过上一节的操作,能够知道流程启动以后会同一时候生成一个流程实例和用户任务.这个用户任务保存在act_ru_task和act_hi_task表中,从表明能够看出ru是runtime,hi是hist ...
- activiti自定义流程之Spring整合activiti-modeler5.16实例(五):流程定义列表
注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自定义流程之Spring ...
- activiti自定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自定义流程之Spring ...
- activiti自定义流程之Spring整合activiti-modeler5.16实例(九):历史任务查询
注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自定义流程之Spring ...
- activiti自定义流程之Spring整合activiti-modeler5.16实例(八):完成个人任务
注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自定义流程之Spring ...
- activiti自定义流程之Spring整合activiti-modeler5.16实例(七):任务列表展示
注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自定义流程之Spring ...
- activiti自定义流程之Spring整合activiti-modeler5.16实例(六):启动流程
注:(1)环境搭建:activiti自定义流程之Spring整合activiti-modeler5.16实例(一):环境搭建 (2)创建流程模型:activiti自定义流程之Spring ...
随机推荐
- eclipse的Clean和Build All无效
[问题描述]在点击eclipse的Clean和Build All时,eclipse的Console中直接显示了一个个.so文件install成功,然后Build Finish,实际是根本没有编译,只是 ...
- linux 实现共享内存同步
本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝.它是IPC对象的一种. 为了在多个进程间交换信息,内核专门留出了 ...
- 浅谈控件(组件)制作方法一(附带一delphi导出数据到Excel的组件实例)(原创)
来自:http://blog.csdn.net/zhdwjie/article/details/1490741 -------------------------------------------- ...
- 解决IE6的PNG透明
http://www.jb51.net/article/35669.htm http://blog.csdn.net/mosliang/article/details/6760028
- 成长笔记--解决Eclipse 变量名的自动补全问题
大家使用eclipse敲代码的时候,是不是都被这样一个问题困扰着.就是键入一个变量名的时候,会自动提示补全:在你的变量名后面加上类型的名字!这个时候,你就必须键入Esc才不会自动补全你的变量,如果你键 ...
- workflow engine Ruote初体验之一(概念)
由于最近自己写点小东西,需要有工作流程管理方面的应用,所有的环境为Ruby on rails,所有在选择流程引擎的时候选择了ruote,但是对于ruote是完全陌生的,所以在这里记下点滴,如果理解的不 ...
- Jboss7类载入器
1. 类载入器理论知识介绍 类载入器基于Jboss Module,代替了层次类载入环境,避免了当类存在多个版本号时,导致类载入错误. 类载入是基于模块的.必须显示的定义模块依赖.部署也是模块化的,假设 ...
- linux 打开文件数too many open files解决方法
出现这句提示的原因是程序打开的文件/socket连接数量超过系统设定值.查看每个用户最大允许打开的文件数量ulimit -a 其中 open files (-n) 1024 表示每个用户最大允许打开的 ...
- 2017.2.21 activiti实战--第七章--Activiti与spring集成(一)配置文件
学习资料:<Activiti实战> 第七章 Activiti与容器集成 本章讲解activiti-spring可以做的事情,如何与现有系统集成,包含bean的注入.统一事务管理等. 7.1 ...
- dubbo服务接口开发者必备调试利器,你值得拥有
dubbo服务接口开发者必备调试利器,你值得拥有 学习了:https://my.oschina.net/vboxtop/blog/1524290 找到了:http://www.vbox.top/?fr ...