据他们说职业流的平台管理种类规划

葡京网上娱乐 1

5.1 未签收(Task)

该类任务针对于把Task分配给一个角色时,举个例子部门经理,因为部门管理者剧中人物能够钦点多人所以供给先签收再办理,术语:抢占式

对应的API查询:

/**
 * 获取未签收的任务查询对象
 * @param userId    用户ID
 */
@Transactional(readOnly = true)
publicTaskQuery createUnsignedTaskQuery(String userId) {
    TaskQuery taskCandidateUserQuery = taskService.createTaskQuery().processDefinitionKey(getProcessDefKey())
            .taskCandidateUser(userId);
    returntaskCandidateUserQuery;
}

?

6.1 单唯贰个列表肩负申请

如此的利润是报名和流程办理分离开处理,列表显示未运转流程的请假记录(数据库PROCESS_INSTANCE_ID为空)。

报名分界面包车型地铁截图:

葡京网上娱乐 2

6.3.1 当前节点定位JS

Java代码请移步:

Javascript思路:先通过Ajax获取当前节点的坐标,在钦命地方增多浅深草绿边框,然后加载图片。

代码移步:

基础框架代码设计

2.1 铺排流程图后中文乱码

乱码是直接缠绕着国人的难题,在此以前各样本领、工具现身乱码的主题材料写过多数篇章,这里也不例外……,Activiti的乱码难题在流程图中。

流程图的乱码如下图所示:

葡京网上娱乐 3

淹无法有二种:

6.UI及截图

结合实际业务描述贰个业务从最初到结束的进度,对于吸引的校友看完听君一席谈胜读十年书了;这里运用请假作为例子。

2.5 流程图设计工具用什么

Activiti提供了五个流程设计工具,不过面向对象差别。

  • Activiti
    Modeler,面向业务职员,使用开源的BPMN设计工具Signavio,使用BPMN描述业务流程图

  • Eclipse
    Designer,面向开采职员,Eclipse的插件,可以让开拓职员定制各类节点的属性(ID、Name、Listener、Attr等)

◆✦下边为四个独立的业务流程✦◆

3.配置

4.2 业务对象和流程关联测量检验

代码请转移:

5.5 查询时和事情关联

提醒:此前在事情对象加多了PROCESS_INSTANCE_ID字段

思路:今后可以使用这些字段查询了,不管是Task还是ProcessInstance都能够获得流程实例ID,能够根据流程实例ID查询实体然后把流程对象设置到实体的叁本性质中由Action大概Controller输出到前台。

代码请参见:

下图为着力的架构划设想计

8.结束

从前就想写那篇小说,以后总算变成了,开支了多少个时辰,希望能省去你几天的时日。

请读者留神阅读Activiti的客户手册和Javadoc。

来自:

8.结束

事先就想写那篇文章,今后终于产生了,成本了多少个钟头,希望能省去你几天的时间。

请读者留心翻阅Activiti的顾客手册和Javadoc。

假使有怎样疑点依然对于成效的落到实处有越来越好的措施接待提议、共享。

2.4.1 建议管理格局

Activiti有一个IdentityService接口,通过那一个接口可以操控Activiti的ACT_ID_*表的多少,日常的做法是用职业系统的权限管理模块维护顾客数据,当进行CRUD操作的时候在原来职业逻辑前边增多同步到Activiti的代码;举例增多二个用户时同步Activiti
User的代码片段:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
/** * 保存用户信息 并且同步用户信息到activiti的identity.User,同时设置角色 * @param user * @param roleIds */public void saveUser(User user, List<Long> roleIds, boolean synToActiviti) { accountManager.saveEntity(user); String userId = user.getId().toString();   if (synToActiviti) {      List<org.activiti.engine.identity.User> activitiUsers = identityService.createUserQuery().userId(userId).list();       if (activitiUsers.size() == 1) {          //更新信息         org.activiti.engine.identity.User activitiUser = activitiUsers.get(0);          activitiUser.setFirstName(user.getName());           activitiUser.setLastName("");          activitiUser.setPassword(user.getPassword());            activitiUser.setEmail(user.getEmail());          identityService.saveUser(activitiUser);             // 删除用户的membership          List<Group> activitiGroups = identityService.createGroupQuery().groupMember(userId).list();            for (Group group : activitiGroups) {                identityService.deleteMembership(userId, group.getId());          }            // 添加membership          for (Long roleId : roleIds) {               Role role = roleManager.getEntity(roleId);                identityService.createMembership(userId, role.getEnName());           }        } else {         org.activiti.engine.identity.User newUser = identityService.newUser(userId);          newUser.setFirstName(user.getName());            newUser.setLastName("");           newUser.setPassword(user.getPassword());         newUser.setEmail(user.getEmail());           identityService.saveUser(newUser);          // 添加membership          for (Long roleId : roleIds) {               Role role = roleManager.getEntity(roleId);                identityService.createMembership(userId, role.getEnName());           }        }    } }

view
rawAccountServiceImpl.java hosted
with ❤ by GitHub

剔除操作也和那几个看似!

无论从事情体系保证客商依旧从Activiti维护,确定要规定一方,然后CRUD的时候一齐到对方,如若急需一齐多个子系统那么能够再调用WebService达成。

◆✦以下对第二、三点开展举行✦◆

2.第后生可畏使用遇到难题访谈

因为Activiti刚刚退出不久所以资料相比空缺,中文资料越来越少的可怜,所以初叶的时候一头雾水(尽管事先用过专门的学问流,可是认为间隔超多),并且官方的手册还不是很周详;所以自身把本人在求学使用的进程境遇的部分疑问都位列出来分享给我们;以下几点是自家遇见和想到的,要是您还应该有哪些难题能够在批评中和自己交流再补偿。

9.动态钦点任务办理人

7.开启Logger

  1. 添加log4j的jar
  2. 设置log4j.logger.java.sql=DEBUG

如上所说, 那样的叁个数码陈设必需能够满意:

2.3.3 怎么样抉择

提出接收startProcessInstanceByKey,特殊意况需求动用过去的版本选拔使用startProcessInstanceById

葡京网上娱乐,2.1.2.2 使用Ant脚本打包Zip文件

那也是大家接收的主意,你能够手动选项xml和png打包成zip格式的文本,也能够像大家同样接受ant
target的章程打包那四个公文。

123456789101112
<?xml version="1.0" encoding="UTF-8"?><project name="foo">     <property name="workflow.definition" value="foo-common-core/src/main/resources/diagrams" />    <property name="workflow.deployments" value="foo-common-core/src/main/resources/deployments" /> <target name="workflow.package.oa.leave">     <echo>打包流程定义及流程图::OA-请假</echo>        <zip destfile="${workflow.deployments}/oa/leave.zip" basedir="${workflow.definition}/oa/leave" update="true"            includes="*.xml,*.png" /> </target></project>

view
rawbuild.xml hosted
with ❤ by GitHub

那般当改进流程定义文件后如果运营ant命令就能够打包了:

ant workflow.package.oa.leave

今后配备bar或许zip文件查看流程图图片就不是乱码了,而是你的压缩包里面包车型大巴png文件。

9.1 手动设置职责办理人

?

1
<usertask
id
="hrAudit"
name
="人事审批"
activiti:assignee
="${hrUserId}"></usertask>

动态钦定任务办理人是群里面询问超级多的主题材料之生机勃勃,其实就是风流倜傥层窗户纸,只要在职分成功的时候传递activiti:assignee属性中的变量就可以。


Map<String, Object> variables = new HashMap<String,
Object>();

variables.put(“hrUserId”, hrUserId);

taskService.complete(taskId, variables);


xpj葡京真钱官网,贰个Request代表某一个人发起的乞求, Snapshot代表这几个流程的每一步操作.
Property则分别为Request的Snapshot的现实性的数额,
当其REQUEST_ID非空SNAPSHOT_ID为空时表示其为REQUEST的品质(SNAPSHOT同理),
即客户发起呼吁所带领的数据. 如: 客户消息改正:
PROPERTY则包含NAME(KEY)为USE中华V_ID(客户唯风流倜傥ID),
ATTACHMENT(顾客手持身份ID照片), EMAIL(修改项)等相应的值. 而对此SNAPSHOT,
则记录对应核实以致操作的音讯,
其相应的PROPERTY则保留了对有个别数据纠正前后的值.

1.2 Activiti与JBPM5?

新葡萄娱乐在线网站,对于Activiti、jBPM4、jBPM5大家应当怎么选择,在InfoQ上有黄金时代篇文章写的很好,从大的规模相比较各样引擎之间的差距,请参照他事他说加以考察文章:纵观jBPM:从jBPM3到jBPM5以及Activiti5

1.简单介专门的学问流引擎与Activiti

对此专门的学问流引擎的疏解请参见百度周详:行事流引擎

2.第生龙活虎使用蒙受标题搜罗

因为Activiti刚刚退出不久所以资料比较空缺,粤语资料越来越少的可怜,所以领头的时候一头雾水(就算事先用过工作流,不过感到间距非常多),何况官方的手册还不是很完美;所以本人把自己在上学应用的长河境遇的一些困惑都位列出来分享给我们;以下几点是自个儿蒙受和想到的,假设您还会有哪些疑点能够在言三语四卯月本身交换再补偿。

葡京网上娱乐 4

2.3 业务和流程的涉及方式

本条难点在群里面很三个人都问过,那也是自身刚刚初始吸引的地点;

新兴看了以下API开采RuntimeService有多少个法子:

5.5 查询时和事情涉嫌

提示:此前在业务对象增添了PROCESS_INSTANCE_ID字段

思路:以往得以选取这一个字段查询了,不管是Task依旧ProcessInstance都得以赢得流程实例ID,能够依附流程实例ID查询实体然后把流程对象设置到实体的叁个属性中由Action只怕Controller输出到前台。

代码请参见:

9.3 获取流程发起人

假使在开发银行流程的时候调用了下边包车型大巴代码:

?

1
identityService.setAuthenticatedUserId(currentUserId);

引擎会记录启使人迷恋,即在ACT_HI_PROINST表的START_USER_ID字段,可以经过下边包车型的士代码获取。

?

1
2
HistoricProcessInstance
hi = historyService.createHistoricProcessInstanceQuery().singleResult();
hi.getStartUserId();

葡京网上娱乐 5

6.1 单唯二个列表担任申请

如此那般的益处是报名和流程办理分离开管理,列表呈现未运营流程的请假记录(数据库PROCESS_INSTANCE_ID为空)。

报名界面包车型大巴截图:

葡京网上娱乐 6

1.1 笔者与做事流引擎

在首先家厂商做事的时候根本职分便是开拓OA系统,当然基本都以有职业流的支撑,但是当下应用的专门的学业流引擎是商号部分牛人开拓的(听他们说是用叁个开源的引擎校勘的),名叫CoreFlow;功效相对Activiti来讲相比较弱,可是能满意平时的运用,当然也会有无数的标题由今后来我们一定要改革引擎的代码打补丁。

今昔是自己职业的第二家商家,因为要开垦ERP、OA等系统需求使用职业流,在档期的顺序调查讨论阶段本人先找找资料选择使用哪个开源办事流引擎,最后分明了Activiti5并依照商家的框架结构做了部分DEMO。

10. 职责代办

洋法国人问“Owner”属性为啥是空的,几时用?要询问它的职能首先要通晓“代办”。

代办的概念能够用上面包车型客车一句话归纳:

你领导接到一个任务,让你代办,你办理完成后任务还是回归到你的领导,事情是你做的,功劳是你领导的,此乃代办也!

来看那些单元测量试验你就知道哪些是代办:ProcessTestDelegateTask

最好把activiti-study其意气风发类型下载下来导入到Eclipse中运作一下:

❷ 申请提交系统后, 由风控实行核查

6.2 流程状态

葡京网上娱乐 7

5.3 运行中(ProcessInstance)

粗略正是从未终结的流水生产线,全数到场过的人都应该能够见到这一个实例,可是Activiti的API未有能够通过顾客查询的法子,这么些只可以自己用hack的办法管理了,笔者眼前还尚无拍卖。

从表ACT_RU_EXECUTION中询问数据。

对应的API查询:

?

1
2
3
4
5
6
7
8
9
10
/**
 *
获取未经完成的流程实例查询对象
 *
@param userId    用户ID
 */
@Transactional(readOnly
=
true)
public
ProcessInstanceQuery createUnFinishedProcessInstanceQuery(String userId) {
    ProcessInstanceQuery
unfinishedQuery = runtimeService.createProcessInstanceQuery().processDefinitionKey(getProcessDefKey())
            .active();
    return
unfinishedQuery;
}

5.各个场地包车型客车天职查询以至和事情对象关系

咱俩当下分成4中状态:未签收、办理中、运维中、已到位。

询问到职务依然流程实例后要显示在页面,那时须要增多业务数据,最终结出正是专门的学业和流程的并集,请参见6.2

➤ 遵照职业必要提供ASync的processor管理基类, 因为实在运用中发掘,
一些事情的拍卖(如批量)须要大器晚成段时间的推行能力成就,
而异步管理基类则完结基础完毕, 并由相应子类去落实虚函数就能够.

6.UI及截图

结合实际业务描述一个专门的工作从早前到结束的进度,对于吸引的同班看完茅塞顿开了;这里运用请假作为例子。

2.1.2 使用压缩包形式陈设

Activiti扶植布署*.bpmn20.xml、bar、zip格式的流程定义。

利用Activit Deisigner工具设计流程图的时候会有八个类型的公文:

  • .activiti设计工具使用的文本

  • .bpmn20.xml设计工具自动依据.activiti文件生成的xml文件

  • .png流程图图片

解决办法就是把xml文件和图纸文件同不正常候配备,因为在单身安插xml文件的时候Activiti会自动生成一张流程图的图样文件,然则那样在利用的时候坐标和图纸对应不起来……

由此把xml和图纸相同的时候配备的时候Activiti自动关联xml和图纸,当须要得到图片的时候一贯回到安顿时压缩包里面包车型地铁图片文件,并不是Activiti自动生成的图纸文件

2.4 同步客商数量

其后生可畏标题也是比比较多的人询问过,Activiti扶助对职务分配到:钦命人、钦命组、两个结合,而这么些人和组的新闻都保存在ACT_ID..表中,有和好的客商和组(剧中人物)管理让洋英国人毛骨悚然了;原因是因为每种系统都会设有一个权力管理模块(维护:顾客、部门、角色、授权),不知情该怎么和Activiti同步。

❶ 客商联系客商服务人士,提交报名, 包括借款新闻, 手持身份证件照片,
银行卡新闻等

3.1 集成Spring

对于和Spring的集成Activiti做的准确性,轻便安顿部分Bean代理就能够兑现,可是有七个和事务相关的地点要晋升:

  • 配置processEngineConfiguration的时候属性transactionManager要选用和事情成效的同二个事务管理Bean,不然事务不联合。

  • 对此落实了org.activiti.engine.delegate包中的接口的类须求被职业调整的得以完毕类须求被Spring代理,况兼增加事务的Annotation也许在xml中布署,举个例子:

    /**
     * 创建缴费流程的时候自动创建实体
     *
     * @author HenryYan
     */
    @Service
    @Transactional
    publicclass CreatePaymentProcessListener implementsExecutionListener {
       ....
    }
    

?

5.各个景况的天职查询以致和作业对象关联

咱俩脚下分为4中状态:未签收、办理中、运营中、已成功。

查询到职分依然流程实例后要显示在页面,这时候供给增加业务数据,最终结果便是工作和流程的并集,请参照他事他说加以调查6.2

2.5.1 大家的点子

或许你会好奇,因为我们未有选取Activiti
Modeler,大家感觉用Viso已经能表明流程图的意味了,并且项目董事长也是技能出身,和开垦职员也便于沟通。

近些日子以此连串是首先个使用Activiti的,开首大家在需要基础切磋阶段接受Viso设计流程图,利用泳道流程图安插和顾客关系,鲜明后由担当流程的开辟人士用Eclipse
Designer设计赢得bpmn20.xml,最终布署。

❸ 运营部门进行改正操

7.开启Logger

  1. 添加log4j的jar
  2. 设置log4j.logger.java.sql=DEBUG

5.4 已完成(HistoricProcessInstance)

现已甘休的流程实例。

从表ACT_HI_PROCINST中询问数据。

?

1
2
3
4
5
6
7
8
9
10
/**
 *
获取已经完成的流程实例查询对象
 *
@param userId    用户ID
 */
@Transactional(readOnly
=
true)
public
HistoricProcessInstanceQuery createFinishedProcessInstanceQuery(String userId) {
    HistoricProcessInstanceQuery
finishedQuery = historyService.createHistoricProcessInstanceQuery()
            .processDefinitionKey(getProcessDefKey()).finished();
    return
finishedQuery;
}

3.配置

提倡流程的最主因是客户期望按照公约进行提前还款. 流程关键步骤为:

5.3 运行中(ProcessInstance)

简简单单正是未有终止的流水生产线,全数到场过的人都应有能够看看那么些实例,可是Activiti的API未有能够通过顾客查询的不二诀要,这几个只好和煦用hack的情势管理了,小编方今还从未管理。

从表ACT_RU_EXECUTION中查询数据。

对应的API查询:

/**
 * 获取未经完成的流程实例查询对象
 * @param userId    用户ID
 */
@Transactional(readOnly = true)
publicProcessInstanceQuery createUnFinishedProcessInstanceQuery(String userId) {
    ProcessInstanceQuery unfinishedQuery = runtimeService.createProcessInstanceQuery().processDefinitionKey(getProcessDefKey())
            .active();
    returnunfinishedQuery;
}

?

2.3.1 startProcessInstanceByKey

javadoc对其证实:

startProcessInstanceByKey(String processDefinitionKey, Map variables) 
          Starts a new process instance in the latest version of the process definition with the given key

其中businessKey正是工作ID,比方要提请请假,那么先填写登记新闻,然后(保存+运转流程),因为请假是单身设计的数据表,所以保存后获取实体ID就能够把它传给processInstanceBusinessKey办法运转流程。当供给基于businessKey查询流程的时候就足以经过API查询:

?

1
runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(processInstanceBusinessKey,
processDefinitionKey)

建议数据库冗余设计:在业务表设计的时候加多一列:PROCESS_INSTANCE_ID
varchar2(64)
,在工艺流程运转以往把流程ID更新到专门的学问表中,那样无论从事情依然流程都得以查询到对方!

特意表达: 此方法运行时自动接受新型版本的流程定义。

6.2 流程状态

葡京网上娱乐 8

❷ 运行生成提前还款表达书, 其富含详细金额多少

2.5.1 我们的不二等秘书籍

或是您会惊讶,因为我们未有利用Activiti
Modeler,我们认为用Viso已经能表达流程图的意趣了,而且项目老板也是技艺出身,和开辟职员也轻易交流。

脚下那个项目是首先个使用Activiti的,伊始大家在必要科研阶段选取Viso设计流程图,利用泳道流程图设计和顾客联系,鲜明后由肩负流程的开荒职员用Eclipse
Designer设计赢得bpmn20.xml,最终布署。

2.1.1 修正源代码情势

改良源码

org.activiti.engine.impl.bpmn.diagram.ProcessDiagramCanvas

在构造方法

public ProcessDiagramCanvas(int width, int height)

中有风度翩翩行代码是设置字体的,默许是用Arial字体,那就是乱码发生的由来,把字改为本土的汉语字体就可以,比如:

?

1
Font
font =
new
Font(
"WenQuanYi
Micro Hei"
,
Font.BOLD,
11);

自然假诺您有布置文件读取工具那么能够安装在*.properties文件中,笔者就是这么做的:

?

1
Font
font =
new
Font(PropertyFileUtil.get(
"activiti.diagram.canvas.font"),
Font.BOLD,
11);

5.12本子早先协理设置字体名称,在内燃机中加多如下设置,在生成图片时就能够使用微软雅黑安装图片中的文字。

?

1
<property
name
="activityFontName"
value
="微软雅黑"></property>

二. 提前还款流程

2.2.1 引擎提供的Form

概念表单的方式在各种Task标签中定义extensionElementsactiviti:formProperty即可,达到这些节点的时候可以通过API读取表单成分。

Activiti官方的事例使用的就是在流程定义中装置每三个节点显示怎么的表单哪些字段须求呈现、哪些字段只读、哪些字段必填。

然而这种艺术唯有适用于比较容易的流程,对于某个复杂大概页面供给职业逻辑的剖断的气象就不适用了。

对此数据的保留都以在外燃机的表中,不方便人民群众和别的表的涉嫌、对全数种类的兼备也不利于!

2.3 业务和流程的涉嫌形式

以此标题在群里面很几人都问过,那也是本人刚刚伊始吸引的地点;

后来看了以下API开采RuntimeService有多个点子:

9.动态钦点职责办理人

公共化职业流模块:

2.3.1 startProcessInstanceByKey

javadoc对其表明:

startProcessInstanceByKey(String processDefinitionKey, Map variabes) 
          Starts a new process instance in the latest version of the process definition with the given key

 

其中businessKey正是业务ID,比方要申请请假,那么先填写登记音信,然后(保存+运维流程),因为请假是独自设计的数据表,所以保存后收获实体ID就足以把它传给processInstanceBusinessKey主意运营流程。当必要依据businessKey查询流程的时候就足以经过API查询:

runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(processInstanceBusinessKey, processDefinitionKey);

 

议数据库冗余设计:在业务表设计的时候增多一列:PROCESS_INSTANCE_ID varchar2(64),在工艺流程运转今后把流程ID更新到事情表中,那样不管从作业依然流程都得以查询到对方!

特意表明: 此方法运行时自动接受新型版本的流水生产线定义。

2.4.1 提议管理方式

Activiti有一个IdentityService接口,通过那些接口可以操控Activiti的ACT_ID_*表的多寡,常常的做法是用工作系统的权能管理模块维护客户数量,当进行CRUD操作的时候在原本业务逻辑后边增多同步到Activiti的代码;譬如增加一个客商时同步Activiti
User的代码片段:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
/** * 保存用户信息 并且同步用户信息到activiti的identity.User,同时设置角色 * @param user * @param roleIds */public void saveUser(User user, List<Long> roleIds, boolean synToActiviti) { accountManager.saveEntity(user); String userId = user.getId().toString();   if (synToActiviti) {      List<org.activiti.engine.identity.User> activitiUsers = identityService.createUserQuery().userId(userId).list();       if (activitiUsers.size() == 1) {          //更新信息         org.activiti.engine.identity.User activitiUser = activitiUsers.get(0);          activitiUser.setFirstName(user.getName());           activitiUser.setLastName("");          activitiUser.setPassword(user.getPassword());            activitiUser.setEmail(user.getEmail());          identityService.saveUser(activitiUser);             // 删除用户的membership          List<Group> activitiGroups = identityService.createGroupQuery().groupMember(userId).list();            for (Group group : activitiGroups) {                identityService.deleteMembership(userId, group.getId());          }            // 添加membership          for (Long roleId : roleIds) {               Role role = roleManager.getEntity(roleId);                identityService.createMembership(userId, role.getEnName());           }        } else {         org.activiti.engine.identity.User newUser = identityService.newUser(userId);          newUser.setFirstName(user.getName());            newUser.setLastName("");           newUser.setPassword(user.getPassword());         newUser.setEmail(user.getEmail());           identityService.saveUser(newUser);          // 添加membership          for (Long roleId : roleIds) {               Role role = roleManager.getEntity(roleId);                identityService.createMembership(userId, role.getEnName());           }        }    } }

view
rawAccountServiceImpl.java hosted
with ❤ by GitHub

剔除操作也和那一个好似!

甭管从专业体系保险客户依旧从Activiti维护,料定要规定一方,然后CRUD的时候同盟到对方,假设急需一块多少个子系统那么能够再调用WebService实现。

3.1 集成Spring

对于和Spring的集成Activiti做的不易,简单安排部分Bean代理就能够兑现,可是有四个和职业相关的地点要升迁:

  • 配置processEngineConfiguration的时候属性transactionManager要运用和作业功效的同一个事务管理Bean,不然事务不联合。

  • 对于落到实处了org.activiti.engine.delegate包中的接口的类必要被专门的学问调整的落到实处类必要被Spring代理,并且拉长事务的Annotation或许在xml中配备,举例:

?

1
2
3
4
5
6
7
8
9
10
/**
 *
创建缴费流程的时候自动创建实体
 *
 *
@author HenryYan
 */
@Service
@Transactional
public
class

CreatePaymentProcessListener
implements
ExecutionListener {
   ....
}

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website