activiti 流程图跟踪y 启动流程 会操作哪个表

activiti(53)
流程定义部署之后,自然就是流程定义列表了,但和前一节一样的是,这里也是和之前单独的activiti没什么区别,因此也不多说。我们先看看列表页面以及对应的代码,然后在一步步说明点击启动按钮时如何调用自定义的form表单。
流程定义列表页面如下:
对应的html代码:
对应的angularjs代码:
[javascript]&&
在上边的代码中就有需要注意的地方了,从代码中可以看到,当我们点击页面的启动按钮时,会触发toProcess方法,而这个方法就使用到了dialog对话框,对话框中显示的内容便是之前自定义的表单,从后台数据库中请求过来。
那么读取的时候发送了getStartForm.do的请求,后台对应的代码如下:
要说明的是这里之所以能使用formService.getRenderedStartForm方法,便是因为在上一节部署的时候进行了设置,否则这个方法是无法正常使用的。
那么这个对话框弹出界面视图如下:
需要注意的是dialog的css样式在jquery-ui.css中,不要忘了导入进来,当然了,也可以按自己的喜好修改。
那么填写好相关的数据点击提交,同过上边的js可以知道就走到了后台getStartFormAndStartProcess这里,启动流程实例:
而这里最重要的是对前台数据的处理,如果大家使用了ueditor插件,会发现他传递到后台的数据是存放在request中的一个map中,而map的key都是data_1、data_2、data_3的形式。
这样问题就来了,到后边对任务进行操作的时候,这些数据还是这样从data_1开始,那么如果我们原样保存到数据库,以后查询时自然就会有问题了,所以这里就根据每个流程中流程节点行号的唯一性进行了重新组合,然后把这些数据保存为流程变量。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:165906次
积分:5992
积分:5992
排名:第2859名
原创:413篇
转载:158篇
评论:25条
文章:10篇
阅读:6971
(39)(48)(56)(57)(219)(102)(7)(1)(13)(22) 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
activiti5源码与流程活动自动与手工触发执行例子
下载积分:800
内容提示:activiti5源码与流程活动自动与手工触发执行例子
文档格式:DOCX|
浏览次数:9|
上传日期: 11:55:17|
文档星级:
该用户还上传了这些文档
activiti5源码与流程活动自动与手工触发执行例子
官方公共微信1、创建流程引擎对象
private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
2、发布一个流程
* 2、发布一个流程
public void
testDeployProcess() {
RepositoryService repositoryService = processEngine.getRepositoryService();
DeploymentBuilder builder = repositoryService.createDeployment();
// 加载发布资源
builder.name("UserTask共有任务流程测试") // 设置流程显示别名
.addClasspathResource("userPublicTask.bpmn") // 设置流程规则文件
.addClasspathResource("userPublicTask.png"); // 设置流程规则的图片
// 发布流程
builder.deploy();
3、启动流程、执行任务,并查看状态
* 3、启动流程、执行任务,并查看状态
public void testUserTask() {
//1.获取RuntimeService服务对象的实例
RuntimeService runtimeService = processEngine.getRuntimeService();
String processDefinitionKey = "userPublicTask";
//2.自动执行与Key相对应的流程的最高版本
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
String processInstanceId = processInstance.getId();
("processInstanceId:" + processInstance.getId());
//3.获取TaskService服务对象的实例
TaskService taskService = processEngine.getTaskService();
//4.私有任务执行
//4.1、获取私有任务
String assignee = "取号";
List&Task& tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
Assert.assertEquals(1, tasks.size());
Task task = tasks.get(0);
("taskName:" + task.getName());
Assert.assertEquals("取号",task.getName());
//4.2完成任务
plete(task.getId());
//4.3检查流程状态
ProcessInstance p1 = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
Assert.assertNotNull(p1);
("取号私有任务流程成功执行!");
//5、共有任务执行
//5.1、确认柜员1私有任务列表中没有相关任务
String assignee1 = "柜员1";
List&Task& tasks1 = taskService.createTaskQuery().taskAssignee(assignee1).list();
Assert.assertEquals(0, tasks1.size());
("柜员1的私有任务数量:" + tasks1.size());
//5.2、确认柜员2私有任务列表中没有相关任务
String assignee2 = "柜员2";
List&Task& tasks2 = taskService.createTaskQuery().taskAssignee(assignee2).list();
Assert.assertEquals(0, tasks2.size());
("柜员2的私有任务数量:" + tasks1.size());
//5.3、获取共有任务列表
//5.3.1、获取柜员1共有任务列表
String candidateUser1 = "柜员1";
List&Task& tasks3 = taskService.createTaskQuery().taskCandidateUser(candidateUser1).orderByTaskCreateTime().desc().list();
Task task3 = tasks3.get(0);
("柜员1的共有任务数量:" + tasks3.size() + " ID: " + task3.getId() + " Name: " + task3.getName());
//5.3.2、获取柜员2共有任务列表
String candidateUser2 = "柜员2";
List&Task& tasks4 = taskService.createTaskQuery().taskCandidateUser(candidateUser2).orderByTaskCreateTime().desc().list();
Task task4 = tasks4.get(0);
("柜员2的共有任务数量:" + tasks4.size() + " ID: " + task4.getId() + " Name: " + task4.getName());
//5.4、柜员2受理任务
taskService.claim(task4.getId(), "柜员2");
("柜员2受理任务!");
//5.5、查看柜员1和柜员2的私有与共有任务数量
String assignee3 = "柜员1";
List&Task& tasks5 = taskService.createTaskQuery().taskAssignee(assignee3).list();
("柜员1的私有任务数量:" + tasks5.size());
String assignee4 = "柜员2";
List&Task& tasks6 = taskService.createTaskQuery().taskAssignee(assignee4).list();
("柜员2的私有任务数量:" + tasks6.size());
String candidateUser3 = "柜员1";
List&Task& tasks7 = taskService.createTaskQuery().taskCandidateUser(candidateUser3).orderByTaskCreateTime().desc().list();
("柜员1的共有任务数量:" + tasks7.size());
String candidateUser4 = "柜员2";
List&Task& tasks8 = taskService.createTaskQuery().taskCandidateUser(candidateUser4).orderByTaskCreateTime().desc().list();
("柜员2的共有任务数量:" + tasks8.size());
//5.6、柜员2完成任务
plete(task4.getId());
//5.6检查结束状态
ProcessInstance p2 = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
Assert.assertNull(p2);
("UserTask共有任务流程成功执行!");
4、执行结果
[INFO][ 10:09:44,768][com.mcs.activiti.test.TestPublicUserTask]processInstanceId:115001[INFO][ 10:09:44,792][com.mcs.activiti.test.TestPublicUserTask]taskName:取号[INFO][ 10:09:45,003][com.mcs.activiti.test.TestPublicUserTask]取号私有任务流程成功执行![INFO][ 10:09:45,010][com.mcs.activiti.test.TestPublicUserTask]柜员1的私有任务数量:0[INFO][ 10:09:45,016][com.mcs.activiti.test.TestPublicUserTask]柜员2的私有任务数量:0[INFO][ 10:09:45,036][com.mcs.activiti.test.TestPublicUserTask]柜员1的共有任务数量:1 ID: 115007 Name: 取钱[INFO][ 10:09:45,041][com.mcs.activiti.test.TestPublicUserTask]柜员2的共有任务数量:1 ID: 115007 Name: 取钱[INFO][ 10:09:45,117][com.mcs.activiti.test.TestPublicUserTask]柜员2受理任务![INFO][ 10:09:45,126][com.mcs.activiti.test.TestPublicUserTask]柜员1的私有任务数量:0[INFO][ 10:09:45,138][com.mcs.activiti.test.TestPublicUserTask]柜员2的私有任务数量:1[INFO][ 10:09:45,159][com.mcs.activiti.test.TestPublicUserTask]柜员1的共有任务数量:0[INFO][ 10:09:45,162][com.mcs.activiti.test.TestPublicUserTask]柜员2的共有任务数量:0[INFO][ 10:09:45,256][com.mcs.activiti.test.TestPublicUserTask]UserTask共有任务流程成功执行!
5、共有流程定义&userPublicTask.bpmn
1 &?xml version="1.0" encoding="UTF-8"?&
2 &definitions xmlns="http://www.omg.org/spec/BPMN//MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN//DI" xmlns:omgdc="http://www.omg.org/spec/DD//DC" xmlns:omgdi="http://www.omg.org/spec/DD//DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"&
&process id="userPublicTask" name="共有任务" isExecutable="true"&
&startEvent id="startevent1" name="Start"&&/startEvent&
&userTask id="取号" name="取号" activiti:assignee="取号"&&/userTask&
&sequenceFlow id="flow1" sourceRef="startevent1" targetRef="取号"&&/sequenceFlow&
&userTask id="取钱" name="取钱" activiti:candidateUsers="柜员1,柜员2"&&/userTask&
&sequenceFlow id="flow3" sourceRef="取号" targetRef="取钱"&&/sequenceFlow&
&endEvent id="endevent2" name="End"&&/endEvent&
&sequenceFlow id="flow4" sourceRef="取钱" targetRef="endevent2"&&/sequenceFlow&
&/process&
&bpmndi:BPMNDiagram id="BPMNDiagram_userPublicTask"&
&bpmndi:BPMNPlane bpmnElement="userPublicTask" id="BPMNPlane_userPublicTask"&
&bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"&
&omgdc:Bounds height="35.0" width="35.0" x="335.0" y="40.0"&&/omgdc:Bounds&
&/bpmndi:BPMNShape&
&bpmndi:BPMNShape bpmnElement="取号" id="BPMNShape_取号"&
&omgdc:Bounds height="55.0" width="105.0" x="300.0" y="110.0"&&/omgdc:Bounds&
&/bpmndi:BPMNShape&
&bpmndi:BPMNShape bpmnElement="取钱" id="BPMNShape_取钱"&
&omgdc:Bounds height="55.0" width="105.0" x="300.0" y="210.0"&&/omgdc:Bounds&
&/bpmndi:BPMNShape&
&bpmndi:BPMNShape bpmnElement="endevent2" id="BPMNShape_endevent2"&
&omgdc:Bounds height="35.0" width="35.0" x="335.0" y="310.0"&&/omgdc:Bounds&
&/bpmndi:BPMNShape&
&bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"&
&omgdi:waypoint x="352.0" y="75.0"&&/omgdi:waypoint&
&omgdi:waypoint x="352.0" y="110.0"&&/omgdi:waypoint&
&/bpmndi:BPMNEdge&
&bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"&
&omgdi:waypoint x="352.0" y="165.0"&&/omgdi:waypoint&
&omgdi:waypoint x="352.0" y="210.0"&&/omgdi:waypoint&
&/bpmndi:BPMNEdge&
&bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"&
&omgdi:waypoint x="352.0" y="265.0"&&/omgdi:waypoint&
&omgdi:waypoint x="352.0" y="310.0"&&/omgdi:waypoint&
&/bpmndi:BPMNEdge&
&/bpmndi:BPMNPlane&
&/bpmndi:BPMNDiagram&
40 &/definitions&
阅读(...) 评论()Activiti 工作流表单设计及开发 - 开源中国社区
当前访客身份:游客 [
当前位置:
& && &&&Activiti 5对表单的支持目前还是比较弱的,表现在对表单的开发还需要写Freemark模板,并且它的模板还需要跟class文件一起打包发布。这使得流程的表单设计必须由开发人员来开发处理。因而,开发一套易用性强的流程表单功能就显得很有必要。
& && &&&用户一般都希望能有如Microsoft的Office套件中的InfoPath那样,可以自己进行设计,并且能与工作流程绑在一起进行流转处理。如下所示:
& && &&&表单中每个字段有固定的数据类型,并由不同的数据控件展示,如日期、数字、单选或多选、下拉、多行文本甚至富文本编辑器。在实现更强的功能上,我们还允许控件能实现脚本交互。
三、设计实现思路
在表单与流程的整合中,我们一般不建议把表单的所有数据都存储在流程中,仅需要把参与流程跳转的数据才存到流程变量中去。如请假出差的流程,如下所示:
& && &&&如申请出差金额则需要参与流程的处理中去,因而在进入这个判断节点之前,流程变量中需要存在这个变量,并且通过判断这个变量值来让流程自动跳转。
1.& && &&&流程实例与业务表单关联 基于以上设计的原则,流程中则不存储业务表单的数据,那么流程与业务表单又如何关联?在Activiti 5 则比Jbpm4考虑了这块,他在流程实例表及任务实例表相关运行表中增加了一个字段(BusinessKey),用来关联业务表单的数据,我们一般把这个字段称为业务主键。其关联关系如下所示:
& && && && && &&
& && &&&那么流程表单的数据如何存储及如何展示,从上图可以看到,我们对自定义的表单提供了生成物理表的方式,那么表单的存储则通过在线生成的页面获取物理表必需要的数据,然后保存至物理表中。这需要我们在设计表单时,生成一套表单数据规范,在审批时,能够进行页面表单的数据验证及存储。另外,还需要对在执行过程中的表单进行权限控制,如同一节点上审批相同的表单,不同角色的人员对表单的字段的读写权限是不一样的。
2.& && &&&在线表单设计功能要求 & &&&我们把以上的需求进行了用例描述,则得到如下示例
& && && && && &&
1.& && &&&设计表单模板
允许用户预先设置好一些带有漂亮格式的表单,如包括表头、表脚及样式。方便用户调整表单。
2.& && &&&设计表单布局
允许用户在线进行在线布局,目前一般来说都是基于表格的布局方式。
3.& && &&&设计表单字段控件、数据类型、数据验证
设计表单字段的输入控件类型及数据类型,用于保证用户输入的数据的正确性
4.& && &&&设置表单字段权限
用于控制表单的字段的读写权限,结合工作流的审批,可以更有效显示数据。
5.& && &&&支持表单动态脚本
允许对表单控件加上交互脚本,以实现如一些级联更新等的数据交互等。
6.& && &&&表单预览
可以在线实时显示表单的显示效果
7.& && &&&预设流程变量
把参与流程运算的表单字段标识为流程变量。
3.& && &&&在线流程表单设计逻辑结构分析 生成流程表单的流程如下所示:
说明: 表单设计可以先设计物理表再根据模板生成在线表单 也可以先设计表单的样式再生成物理表
& && &&&以上两种方式最终的目标均需要生成物理表,物理表的结构及数据展示控件等我们则需要用表来记录。因此,以下为他们大体上的数据结构模型:
& && &&&表单生成物理表后,表单页面需要跟物理表单的数据对应起来,在提交页面表单时,我们采用了Json的数据结构来提交,在后台获取可以有效转存为物理表的数据。如下格式: 表单数据分为3部分: 1.& && &&&主表数据。 2.& && &&&子表数据 3.& && &&&意见数据
数据格式如:
{&main&:{&tableId&:&tableId&,&fields&:{&itemSubject&:&出差深圳两天&,&total&:&230&,&creatorID&:&9&,&creator&:&张小军&,&descp&:&出差深圳两天&}},&sub&:[],&opinion&:[]}
& && &&&在线表单的控件展示,需要按字段及结构来解析最终显示及数据验证。
& && &&&流程启动后,需要把业务主键传至流程实例中去,幸好,activiti已经提供了比较完整的API接口,如下:
Java代码&&[url=][/url]
ProcessInstance processInstance=runtimeService.startProcessInstanceById(porcessDefId, businessKey, variables);&&
& && &&&以上方法会把业务表单中需要参与流程运行的字段放到variables作为流程变量。
4.& && &&&流程定义与业务表单绑定
& && &&&流程定义允许绑定多种业务表单,目前我们可以简单分为三种模式,在线表单、同系统的定制业务表单、第三方业务表单。
& && &&&在线表单可以用全局表单,则整个流程用同一个表单,如果每个流程节点的表单不一样,则可以通过设计表单。 表单数据结构如下所示:
& && &&&所以在启动流程时及在任务进行跳转时,均可以获取流程节点的表单设置,从而在启动流程或执行任务处理时能进行正确的表单展示。
& && &&&流程在完成整个审批后,还可以通过流程运行历史,能通过该以下该表可以查询当时每个节点审批时的表单情况。
& && && && && &&
在线访问演示系统:
电信: 网通: 账号:admin 密码:1
共有3个评论
<span class="a_vote_num" id="a_vote_num_
开源有源码吗?
--- 共有 1 条评论 ---
听在那的朋友和我说是合作之后的源码开放
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
一看都不是开源的,。。。。。 做广告的 吧
--- 共有 1 条评论 ---
我也是朋友 在这,然后我看了下。不错。听说是源码开放的
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
请问源码在哪儿呢?
--- 共有 1 条评论 ---
需要向他们购买
(1年前)&nbsp&
更多开发者职位上
有什么技术问题吗?
Activit...的其它问题
类似的话题

我要回帖

更多关于 activiti 流程图 的文章

 

随机推荐