Activiti6-FormService(学习笔记)重要

设置流程定义文件:
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema"
expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> <process id="my-process">
<!--startEvent/userTask都可以配置的表单项-->
<!-- 1.activiti:formKey指定表单的key,也就是一个url,获取到这个值以后,
后端可以设置一些算法,和逻辑,解析出所定义的模板 -->
<startEvent id="start" activiti:formKey="/rest/process/form/start">
<!--扩展属性,设置表单内容-->
<extensionElements>
<activiti:formProperty id="message" name="信息" type="string" required="true"/>
</extensionElements>
</startEvent> <sequenceFlow id="flow1" sourceRef="start" targetRef="someTask" /> <userTask id="someTask" name="Activiti is awesome!"
activiti:formKey="/rest/process/form/userTask">
<extensionElements>
<activiti:formProperty id="yesORno" name="审批" type="string" required="true"/>
</extensionElements>
</userTask>
<sequenceFlow id="flow2" sourceRef="someTask" targetRef="end" /> <endEvent id="end" /> </process> </definitions>
编写测试类:
public class FormServiceTest {
private static final Logger LOGGER = LoggerFactory.getLogger(FormServiceTest.class);
@Rule
public ActivitiRule activitiRule = new ActivitiRule();
@Test
@Deployment(resources = {"my-process-form.bpmn20.xml"})//部署定义文件
public void testFormService(){
FormService formService = activitiRule.getFormService();
//获取流程定义文件
ProcessDefinition processDefinition = activitiRule.getRepositoryService().createProcessDefinitionQuery().singleResult();
//用formService获取前面在流程定义文件里的内容
//获取startFormKey
String startFormKey = formService.getStartFormKey(processDefinition.getId());
LOGGER.info("startFormKey = {}",startFormKey);
//获取表单内容(区分start还是task表单),要先获取FromData,然后从中解析出表单的数量跟列表
StartFormData startFormData = formService.getStartFormData(processDefinition.getId());
//通过startFormData获取表单集合、列表
List<FormProperty> formProperties = startFormData.getFormProperties();
for (FormProperty formProperty : formProperties) {
LOGGER.info("formProperty = {}",ToStringBuilder.reflectionToString(formProperty,ToStringStyle.JSON_STYLE));
}
//获取task内容.这里用到的getTaskFormData()需要获取TaskID但是只有流程启
// 动后运行到Task才会有TaskID,所以在这里需要启动流程
//假装一个表单提交需要用到的内容
Map<String,String> properties = Maps.newHashMap();
properties.put("message","my test message");
//用提交表单的方式 启动流程
ProcessInstance processInstance = formService.submitStartFormData(processDefinition.getId(), properties);
//Task就会生成了,接着获取Task
Task task = activitiRule.getTaskService().createTaskQuery().singleResult();
//接着就可以获取Task表单了
TaskFormData taskFormData = formService.getTaskFormData(task.getId());
List<FormProperty> taskFormDataFormProperties = taskFormData.getFormProperties();
for (FormProperty property : taskFormDataFormProperties) {
LOGGER.info("property = {}",ToStringBuilder.reflectionToString(property,ToStringStyle.JSON_STYLE));
}
//让表单继续执行
// 这里Task里的yesORno设的是必填属性,所以必须给予其值
HashMap<String,String> properties1 = Maps.newHashMap();
properties1.put("yesORno","yes");
formService.submitTaskFormData(task.getId(),properties1);
//查询一下表单是否还存在
Task task1 = activitiRule.getTaskService().createTaskQuery().taskId(task.getId()).singleResult();
LOGGER.info("task1 = {}",task1);
}
}
测试结果如下:
ProcessEngine default created
startFormKey = /rest/process/form/start
formProperty = {"id":"message","name":"\u4FE1\u606F","type":"org.activiti.engine.impl.form.StringFormType@352c308","isRequired":true,"isReadable":true,"isWritable":true,"value":null}
property = {"id":"yesORno","name":"\u5BA1\u6279","type":"org.activiti.engine.impl.form.StringFormType@352c308","isRequired":true,"isReadable":true,"isWritable":true,"value":null}
task1 = null
Activiti6-FormService(学习笔记)重要的更多相关文章
- webx学习笔记
Webx学习笔记周建旭 2014-08-01 Webx工作流程 图 3.2. Webx Framework如何响应请求 当Webx Framework接收到一个来自WEB的请求以后,实际上它主要做了两 ...
- activiti学习笔记一
activiti学习笔记 在讲activiti之前我们必须先了解一下什么是工作流,什么是工作流引擎. 在我们的日常工作中,我们会碰到很多流程化的东西,什么是流程化呢,其实通俗来讲就是有一系列固定的步骤 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
随机推荐
- springboot~如何去掌握它(新手可以看看)
springboot~如何去掌握它 主讲:仓储大叔 每讲40分钟 架构图 graph LR App-->A Web-->A A(zuul proxy)-->B(eureka serv ...
- 2.4配置的热更新「深入浅出ASP.NET Core系列」
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 大家知道通常我们修改网站的配置文件比如,webconfig的时候,网站需要重启才能读取到最新的修改,所谓热更新就是 ...
- [CSS] input样式定制
input样式 定制一个泥团input,想怎么捏就怎么捏 appearance: none 所有主流浏览器都不支持 appearance 属性. Firefox 支持替代的 -moz-appearan ...
- python类属性用法总结
属性的定义:python中的属性其实是普通方法的衍生. 操作类属性有三种方法: 1.使用@property装饰器操作类属性. 2.使用类或实例直接操作类属性(例如:obj.name,obj.age=1 ...
- 在项目管理中如何保持专注,分享一个轻量的时间管理工具【Flow Mac版 - 追踪你在Mac上的时间消耗】
在项目管理和团队作业中,经常面临的问题就是时间管理和优先级管理发生问题,项目被delay,团队工作延后,无法达到预期目标. 这个仿佛是每个人都会遇到的问题,特别是现在这么多的内容软件来分散我们的注意力 ...
- SQLServer 日期函数及日期转换数据类型
一.统计语句 1.--统计当前[>当天00点以后的数据] SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT( ...
- PYTHON定义函数制作简单登录程序(详细)
环境:python3.* 结构: dict_name = {} #定义一个字典,后面用到 def newuser(): #定义注册函数 prompt1='login desired:' while ...
- git排除插件(.ignore)配置
# Created by .ignore support plugin (hsz.mobi) ### Maven template target/ ### JetBrains template # C ...
- WebApi接收post方式传入的json数据
[RoutePrefix("Api")] public class UploadController:BaseApiController { [HttpPost] [Route(& ...
- Vue.js02:数据绑定v-model用法
<!-- v-model 实现数据的双向绑定 --> <!-- v-model 只能用在表单元素中 --> 示例: <!DOCTYPE html> <!-- ...