1.概述
在使用Activiti时,对于表单的应用应该是大家讨论的最多的话题之一了。Activiti自带了两种模式的表单:内置表单和外置表单。
内置表单在流程定义文件的XML中用activiti:formProperty
属性来定义;外置表单则使用activiti:formkey="form/test.form"
来定义,test.form
是一份单独的表单文件。
在流程发起时从request获取提交的表单数据,然后构建为map再通过formService.submitStartFormData(defId, map)
提交表单数据到Activiti中保存。
在实际的使用过程中,这两种模式的表单都不能很好的满足企业级表单应用的需求,例如:
- 表单只支持键值对的格式;
- 不支持在线可视化进行表单设计;
- 表单数据不能进行查询和统计分析;
- 表单数据和流程数据无法分库存储。
2.在线表单设计器
使用在线表单设计器设计时,流程与表单按照以下方式进行整合。
2.1流程绑定表单
在进行流程配置时,通过在流程定义的XML中添加如下Element
将表单与流程进行绑定。
<ext:globalForm>
<ext:form formValue="bxbd" name="报销表单"
parentFlowKey="local_" type="inner"/>
</ext:globalForm>
2.2表单数据的保存
在发起流程和审批待办任务时,通过表单Key可以从数据库中获取表单的html
内容从而展示为表单页面。在用户填写了表单数据以后,执行启动流程、审批任务的操作时,将表单数据以json
格式提交到后台,后台将数据保存到数据库中,同时将这份数据的主键作为businessKey
与该流程实例关联起来。
通过流程启动事件的监听器来处理表单数据的保存及businessKey
的关联。
@Service
@Transactional
public class BpmStartEventListener implements ApplicationListener<BpmStartEvent>, Ordered {
@Resource
BpmDefinitionAccessor bpmDefinitionAccessor;
@Resource
BpmProcessInstanceManager bpmProcessInstanceManager;
@Resource
BpmExeStackManager bpmExeStackManager;
@Resource(name="defaultBpmFormService")
BpmFormService bpmFormService;
@Override
public void onApplicationEvent(BpmStartEvent ev) {
BpmStartModel model = (BpmStartModel) ev.getSource();
//设置上下文。
setBuinessKey(model);
if (AopType.PREVIOUS.