看这篇文章之前首先你要玩过 activiti,要不然可能会有点吃力哦。
activiti中有动态表单和外置表单的功能,那它到底是怎么实现的呢?我们是不是可以仿照这种类型类自己创建自己公司需要的表单框架呢?
一、内置表单:
从activiti的bpmn的属性页面中,可以看到各个任务都有一个Form属性,在form中你可以添加你需要的详细属性,有各个参数让你选择(ID,NAME,TYPE.....),填写完详细属性的参数,你会看到在form中已经添加上了你需要的属性,你可以认为这就是这个任务节点需要显示给用户页面。示意代码如下:
StartFromData formData = formService.getStartFormData(processDefinetionId);//拿取流程启动前的表单字段。
List<FormProperty> formProperties = formData.getFromProperties();//获取表单字段值
Map<String,String> fromValues = new HashMap<String,String>();
for(FormProperty formProperty:formProperties){
String value = request.getParameter(formProperty.getId());//拿取具体参数值
formValues.put(formProperty.getId,value); //将ID和value存入map中
}
formService.submitStartFormData(processDefinitionId,formValues);//启动流程,提交表单
//任务中显示前面传过来的表单值
TaskFormData taskFormData = formService.getTaskFormData(taskId);//根据任务ID拿取表单数据
//然后可以用这个taskFormData去前台渲染显示。
//提交任务
List<FormProperty> formProperties = taskFormData.getFromProperties();//获取表单字段值
Map<String,String> fromValues = new HashMap<String,String>();
for(FormProperty formProperty:formProperties){
if(formProperty.isWritable){ //排除当前任务表单中不可写的字段
String value = request.getParameter(formProperty.getId());//拿取具体参数值
formValues.put(formProperty.getId,value); //将ID和value存入map中
}
}
formService.submitTaskFormData(taskId,formValues); //提交用户任务表单并且完成任务。
注:内置表单除了官方指定的表单类型外,还可以自定义(具体不在这里讲解);
优点:简单,与activiti集成紧密,操作方便。
缺点:显示页面不能太复杂,要不然意味着每个任务你都要配置form属性,而且如果是自定义页面的话,你的页面属性值要与form中的属性id匹配,太麻烦;在acitiviti中业务、任务变量都存放在一起,没有较好的分离。需要人为重新分离;
二、外置表单
流程中一个或者多个用户任务对应的表单文件(.form)
bpmn文件中在节点属性页面中的Main config中的form key配置成你的.form文件路径。
//判断是不是有外置表单
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult();
boolean hasStartFormKey = processDefinition.hasStartFormKey();
//有外置表单情况下,拿取启动的表单数据
Object renderedStartForm = formService.getRenderedStartForm(processDefinitionId);//返回的纯文本的html代码。
//前台直接渲染显示
//对于外置表单,只是把表单内容都保存在单独的form文件中,所以只能通过读取所有的请求参数作为流程启动参数。
Map<String,String> formValues = new HashMap<String,String>();
Map<String,String> parameterMap = request.getParameterMap();
Set<Entry<String,String[]>> entrySet = parameterMap.entrySet();
for(Entry<String,String[]> entry:entrySet){
String key = entry.getKey();
formValues.put(key,entry.getValue()[0]);
}
//任务中拿取表单数据
TaskFormData taskFromData = formService.getRenderedTaskFrom(taskId);
//提交任务和内置表单一致。
优点:外置表单很好的解决了内置表单中 界面复杂的困难。与activiti集成。
缺点:每次提交任务时的参数都是全部参数,无法区分是表单有效数据或者无效数据(产生大量无效数据);
三、针对这两个表单,我们提出一个新的想法,能不能有效的运用这两个表单的优点,产生一个自己的表单框架,与activiti分离出来。
1、设计表格:基础属性、定义页面属性表、实例表。
2、给当前业务设计 所有的属性值放置到 基础属性表中。
3、动态页面设计,将业务用到的页面,全部定义好,然后用一套动态生成页面的规则。
4、每次页面展示的时候,从DB拿取当前用户任务节点对应的表格,显示页面
5、前台页面中的属性都是对应的定义页面的ID。
6、可以直接从DB端拿取前台提交的需要数据 属性。
优点:任意表单设计、没有冗余数据提交、业务数据与activiti分离,activiti值关注流程的相关数据。
缺点:每次动态生成页面都要从DB端拿取以后根据逻辑生成页面,可能会需要较长时间。
可能现在讲的有些不明确,先尝试着做一下看看,成功了详细记录下。如果有其他人有更好的方法,欢迎联系我,留言。谢谢