一、工作流Activiti表说明
Activiti工作流总共包含23张数据表,所有的表名默认以“ ACT_”开头。并且表名的第二部分用两个字母表明表的用例,而这个用例也基本上跟Service API匹配
用来保存部署文件的大文本数据。
保存流程定义图片和xml、Serializable(序列化)的变量,即保存所有二进制数据,特别注意类路径部署时候,不要把svn等隐藏文件或者其他与流程无关的文件也一起部署到该表中,会造成一些错误(可能导致流程定义无法删除)。
属性数据表。存储这个流程引擎级别的数据。
历史活动信息。这里记录流程流转过的所有节点,与HI_TASKINST不同的是,taskinst只记录usertask内容。
附件信息
历史审批意见表
历史详情表:流程中产生的变量详细,包括控制流程流转的变量,业务表单中填写的流程需要用到的变量等。
任务参与者数据表。主要存储历史节点参与者的信息。
历史流程实例信息
历史任务流程实例信息
历史变量信息
用户组表,用来存储用户组信息。
用户扩展信息表。
用来保存用户的分组信息
用户信息表
部署信息表,用来存储部署时需要持久化保存下来的信息
流程设计模型表,创建流程的设计模型时,保存在该数据表中。
流程解析表,解析成功了,在该表保存一条记录。业务流程定义数据表
运行时事件
运行时流程执行实例,我的代办任务查询表
身份联系,主要存储当前节点参与者的信息,任务参与者数据表。
运行时定时任务数据表
运行时任务数据表
运行时流程变量数据表
二、activiti在线设计-Activiti6.0中如何设计和关联表单
activiti6的流程编辑器怎么整合进自己的项目中
建议你可以看一下咖啡兔的相关技术博文:
网页链接
,
activiti6和activiti5整合方式一致
1.为什么要整合
Activiti5.10版本把原本独立的ActivitiModeler模块整合到了ActivitiExplorer中,两者相结合使用起来很方便,通过Modeler设计的流程模型可以直接部署到引擎,也可以把已经部署的流程转换为Model从而在Modeler中编辑。
在实际应用中也有这样的需求,把Modeler整合到业务系统中可以供管理员使用,或者作为BPM平台的一部分存在,很遗憾官方没有给出如何整合Modeler的文档。
2.整合工作
2.1下载源码
首先需要从Github下载源码:
2.2**文件
**的所有文件均在activiti-webapp-explorer2目录中。
src/main/resources中的、、到项目源码的源码根目录,保证编译之后在classes根目录
src/main/webapp中的api、editor、explorer、libs到项目的webapp目录(与WEB-INF目录同级)
2.3添加依赖
?
123456789101112131415161718192021222324
<dependency>__<groupid></groupid>__<artifactid>activiti-explorer</artifactid>__<version>5.14</version>__<exclusions>____<exclusion>______<artifactid>vaadin</artifactid>______<groupid></groupid>____</exclusion>____<exclusion>______<artifactid>dcharts-widget</artifactid>______<groupid></groupid>____</exclusion>____<exclusion>______<artifactid>activiti-simple-workflow</artifactid>______<groupid></groupid>____</exclusion>__</exclusions></dependency><dependency>__<groupid></groupid>__<artifactid>activiti-modeler</artifactid>__<version>5.14</version></dependency>
2.4添加Java类
添加一个类保存到项目中,注册了一些REST路由。
?
1234567891011121314151617181920212223242526272829
package;
import;import;import;import;import;import;
publicclassExplorerRestApplicationextendsActivitiRestApplication{
publicExplorerRestApplication(){__super();_}_/**_*CreatesarootRestletthatwillreceiveallincomingcalls._*/_@Override_publicsynchronizedRestletcreateInboundRoot(){__Routerrouter=newRouter(getContext());__();__(router);__(router);__JsonpFilterjsonpFilter=newJsonpFilter(getContext());__(router);__returnjsonpFilter;_}
}
2.5配置
在文件中添加如下配置:
?
12345678910111213141516
<!--Restletadapter,usedtoexposemodelerfunctionalitythroughREST--><servlet>__<servlet-name>RestletServlet</servlet-name>__<servlet-class></servlet-class>__<init-param>____<!--Applicationclassname-->____<param-name></param-name>____<param-value></param-value>__</init-param></servlet>
<!--Catchallservicerequests--><servlet-mapping>__<servlet-name>RestletServlet</servlet-name>__<url-pattern>/service/*</url-pattern></servlet-mapping>
2.6控制器
使用SpringMVC做了一个简单的封装,也可以使用其他的MVC实现。
?
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
package;
import;import;
import;import;
import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;
/***流程模型控制器**@authorhenryyan*/@Controller@RequestMapping(value="/workflow/model")publicclassModelController{
protectedLoggerlogger=(getClass());
@Autowired_RepositoryServicerepositoryService;
/**_*模型列表_*/_@RequestMapping(value="list")_publicModelAndViewmodelList(){__ModelAndViewmav=newModelAndView("workflow/model-list");__List<model>list=().list();__("list",list);__returnmav;_}
/**_*创建模型_*/_@RequestMapping(value="create")_publicvoidcreate(@RequestParam("name")Stringname,@RequestParam("key")Stringkey,@RequestParam("description")Stringdescription,_____HttpServletRequestrequest,HttpServletResponseresponse){__try{___ObjectMapperobjectMapper=newObjectMapper();___ObjectNodeeditorNode=();___("id","canvas");___("resourceId","canvas");___ObjectNodestencilSetNode=();___("namespace","#");___("stencilset",stencilSetNode);___ModelmodelData=();
ObjectNodemodelObjectNode=();___(_NAME,name);___(_REVISION,1);___description=(description);___(_DESCRIPTION,description);___(());___(name);___((key));
(modelData);___((),().getBytes("utf-8"));
(()+"/service/editor?id="+());__}catch(Exceptione){___("创建模型失败:",e);__}_}
/**_*根据Model部署流程_*/_@RequestMapping(value="deploy/{modelId}")_publicStringdeploy(@PathVariable("modelId")StringmodelId,RedirectAttributesredirectAttributes){__try{___ModelmodelData=(modelId);___ObjectNodemodelNode=(ObjectNode)newObjectMapper().readTree((()));___byte[]bpmnBytes=null;
BpmnModelmodel=newBpmnJsonConverter().convertToBpmnModel(modelNode);___bpmnBytes=newBpmnXMLConverter().convertToXML(model);
StringprocessName=()+".";___Deploymentdeployment=().name(()).addString(processName,newString(bpmnBytes)).deploy();___("message","部署成功,部署ID="+());__}catch(Exceptione){___("根据模型部署流程失败:modelId={}",modelId,e);__}__return"redirect:/workflow/model/list";_}
/**_*导出model的xml文件_*/_@RequestMapping(value="export/{modelId}")_publicvoidexport(@PathVariable("modelId")StringmodelId,HttpServletResponseresponse){__try{___ModelmodelData=(modelId);___BpmnJsonConverterjsonConverter=newBpmnJsonConverter();___JsonNodeeditorNode=newObjectMapper().readTree((()));___BpmnModelbpmnModel=(editorNode);___BpmnXMLConverterxmlConverter=newBpmnXMLConverter();___byte[]bpmnBytes=(bpmnModel);
ByteArrayInputStreamin=newByteArrayInputStream(bpmnBytes);___(in,());___Stringfilename=().getId()+".";___("Content-Disposition","attachment;filename="+filename);___();__}catch(Exceptione){___("导出model的xml文件失败:modelId={}",modelId,e);__}_}
}</pre>
###2.7注意事项
如果使用Spring代理引擎,并且在项目中同时有文件(不管在main/resources还是test/resources目录),在里面的引擎中添加下面的配置参数,否则会导致打开Modeler的编辑页面时读取数据返回**204**状态码。
<preclass="brush:xml"><propertyname="processEngineName"value="test"></property></pre>
引擎默认名称为default,()查询时会先检索main/resources,然后再检索test/resources的和文件,所以当main/resources监测不到指定文件时就会导致该引擎被当做web应用的引擎对象,这样会导致有两个引擎,所以把引擎的名称改为非默认的“default”。
##3.中文乱码问题解决办法
在JVM参数中添加参数:
>-=UTF-8-=UTF-8
**参考**:[在ActivitiModeler中设计的流程包含奇数个中文时不能部署问题](
##4.效果截图
在最新的kft-activiti-demo版本(1.7.0)中已经集成了ActivitiModeler,可以在线访问,也可以下载源码学习如何配置。
登录[
</model>
Activiti6.0中如何设计和关联表单?新增了环节用户任务,这时紧跟着新增一个表单即可,以及脚本、样式、WebAPI;删除了环节用户任务,这时可以不用管,为顾及旧版本的流程定义,其对应的表单还需要保留,并不能删除;修改了环节用户任务,比如在A环节新增了两个字段,同时在B环节减少了两个字段,这时就要为A、B两个环节各自重新创建表单、重新创建脚本、样式、以及重新创建WebAPI,因为表单变了,那么业务也就变了,SQL(表)也都跟着变了。
《Activiti实战》epub下载在线阅读全文,求百度网盘云资源《Activiti实战》(闫洪磊)电子书网盘下载免费在线阅读
链接:
提取码:xdni
书名:Activiti实战
豆瓣评分:7.2
作者:闫洪磊
出版社:_倒ひ党霭嫔
出版年:2015-1-1
页数:508
内容简介:
《Activiti实战》立足于实践,不仅让读者知其然,全面掌握Activiti架构、功能、用法、技巧和最佳实践,广度足够;而且让读者知其所以然,深入理解Activiti的源代码实现、设计模式和PVM,深度也足够。
《Activiti实战》一共四个部分:准备篇(1~2章)介绍了Activiti的概念、特点、应用、体系结构,以及开发环境的搭建和配置;基础篇(3~4章)首先讲解了ActivitiModeler、ActivitiDesigner两种流程设计工具的详细使用,然后详细讲解了BPMN2.0规范;实战篇(5~14章)系统讲解了Activiti的用法、技巧和最佳实践,包含流程定义、流程实例、任务、子流程、多实例、事件以及监听器等;高级篇(15~21)通过集成WebService、规则引擎、JPA、ESB等各种服务和中间件来阐述了Activiti不仅仅是引擎,实际上是一个BPM平台,最后还通过源代码对它的设计模式及PVM进行了分析。
作者简介:
闫洪磊(咖啡兔)资深软件开发工程师和架构师,为Activiti贡献了大量代码,为Activiti在中国的推广与普及做了大量的工作,在社群中有很高的威望和知名度,被称为中国Activiti领域的第一人。多年来一直从事OA、ERP等系统的开发与架构设计工作,持续关注并深入研究工作流引擎,目前就职于小马购车,担任架构师一职,并负责公司内部工作流平台的建设工作。
三、工作流activiti 怎么实现会签
Activiti中提供了多实例任务(for-each)将多实例应到到UserTask中可以实现会签功能。一.多实例用户任务的XML表示:Xml代码assigneeList${nrOfCompletedInstances/nrOfInstances>=0.6}assigneeList${nrOfCompletedInstances/nrOfInstances>=0.6}在每个多实例创建后都会有3个变量nrOfInstances实例总数nrOfActiveInstances当前还没有完成的实例nrOfCompleteInstances已经完成的实例个数multiInstanceLoopCharacteristics是用了指定用户任务为多实例任务,isSequential指定多实例是按照并行或者串行的方式进行,如果使用串行方式nrOfActiveInstances变量始终是1.loopDataInputRef指定一个流程变量的引用,该变量是一个List,可以在发起或这执行任务之前作为流程变量放到引擎中,该list中的每一个元素将创建一个任务。元素的值通过inputDataItem元素的指定的变量来获取如在这个实例中assigneeList=Arrays.asList("liyagn","cooperay","other");这会创建3个用户任务,每个用户任务中都有一个assignee的变量,来分别得到list中的值。completionCondition结束任务的条件,该示例中是任务完成60%结束二.给用户任务指定代理人xml表示:Xml代码liyangliyang上面的描述将该用户任务分配给用户liyang可以通过taskService.createTaskQuery.taskAssignee("liyang").list();来获取该任务三.通过上面两部将用户任务做成了多任务,也可以将任务分配给指定的代理人,现在只用将上面两个步骤进行结合在第一步中我们知道变量assignee是会签人员的标识,只需要将指定代理人的地方用表达式来指定assignee变量就行了完整XML:Xml代码${assignee}assigneeList${nrOfCompletedInstances/nrOfInstances>=0.6}${assignee}assigneeList${nrOfCompletedInstances/nrOfInstances>=0.6}完工。
OK,本文到此结束,希望对大家有所帮助。