Activiti事业流引擎使用,基于职业流的平台管理种

日期:2019-09-15编辑作者:威尼斯城所有登入网址

原标题:基于专门的事业流的阳台管理种类规划

Activiti职业流引擎使用

威尼斯城所有登入网址 1

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

对此工作流引擎的解释请参见百度健全:行事流引擎

对于网络经济平台来讲,首要的工作愈发是关联资本专门的学业相关操作时都有必要有连锁的审批流程.同期在流水生产线的流转进度中必要和一一业务系统开展互动,完结真正的事情管理, 并记录那么些进度中全部人的操作以及每一步操作时所提到数额快速照相,以便于内外界审计和题材的追溯.

1.1 作者与职业流引擎

在首家企业管理办公室事的时候根本任务便是开拓OA系统,当然基本都以有职业流的支撑,然则当下应用的做事流引擎是商家部分牛人开拓的(据书上说是用一个开源的引擎修改的),名称为CoreFlow;作用相对Activiti来讲比较弱,可是能知足常常的选取,当然也许有为数十分多的主题素材由此后来大家只能修改引擎的代码打补丁。

明日是本身职业的第二家公司,因为要开辟ERP、OA等种类须要利用工作流,在类型调研阶段本人先物色资料选择选择哪个开源办事流引擎,最后明确了Activiti5并依赖商家的架构做了部分DEMO。

◆✦上边为三个卓绝的业务流程✦◆

1.2 Activiti与JBPM5?

对于Activiti、jBPM4、jBPM5我们应当怎样挑选,在InfoQ上有一篇文章写的很好,从大的局面临比各种引擎之间的异样,请仿效小说:纵观jBPM:从jBPM3到jBPM5以及Activiti5

(注: 为了印证方便, 已经简化和更改有关手续, 和点融实操分化)

1.3 Activiti资料

  • 官网:

  • 下载:

  • 本子:Activiti的本子是从5开始的,因为Activiti是使用jBPM4的源码;本子发表:五个月发表一回。

  • Eclipse Plugin: 

  • Activit中文群:5435716

威尼斯城所有登入网址 2

2.第一使用遇到标题访问

因为Activiti刚刚退出不久所以资料相比较空缺,中文资料更少的可怜,所以开头的时候四只雾水(尽管以前用过专门的职业流,可是以为距离非常多),何况官方的手册还不是很周到;所以自身把自家在读书应用的进度遭受的一对疑云都位列出来分享给大家;以下几点是作者遇见和想到的,假若你还会有何疑难可以在评价春天小编交换再补偿。

一. 借款人信用卡消息修改

2.1 安插流程图后汉语乱码

乱码是间接缠绕着国人的主题材料,此前种种本事、工具出现乱码的标题写过大多篇章,这里也不例外……,Activiti的乱码难点在流程图中。

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

威尼斯城所有登入网址 3

消除办法有三种:

该流程发起原因主即使由于借款人信用卡转移原因必要修改. 流程关键步骤为:

2.1.1 修改源代码情势

修改源码

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

在构造方法

public ProcessDiagramCanvas(int width, int height)

中有一行代码是设置字体的,默许是用 Arial 字体,那正是乱码产生的案由,把字改为本土的汉语字体就可以,比如:

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

理当如此假设你有安插文件读取工具那么能够安装在*.properties文件中,作者便是那般做的:

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

❶ 顾客联系顾客服务职员,提交报名, 包含借款音讯, 手持居民身份牌照片, 信用卡新闻等

2.1.2 使用压缩包方式计划

Activiti匡助安排*.bpmn20.xml、bar、zip格式的流水线定义。

行使Activit Deisigner工具设计流程图的时候会有四个品种的文本:

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

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

  • .png流程图图片

消除办法就是把xml文件和图表文件相同的时间计划,因为在单独布署xml文件的时候Activiti会自动生成一张流程图的图片文件,不过如此在选用的时候坐标和图表对应不起来……

据此把xml和图纸同期配备的时候Activiti自动关联xml和图表,当必要获得图片的时候一贯重返布署时压缩包里面包车型客车图纸文件,并非Activiti自动生成的图纸文件

❷ 申请提交系统后, 由风控实行审查批准

2.1.2.1 使用工具打包Bar文件

右键项目名称然后点击“Create deployment artifacts”,会在src目录中开创deployment文件夹,里面包含*威尼斯城所有登入网址 ,.bar文件.

❸ 运转部门实行修改操

2.1.2.2 使用Ant脚本打包Zip文件

那也是大家利用的章程,你能够手动选项xml和png打包成zip格式的公文,也能够像我们一样接纳ant target的艺术打包那多个公文。

<?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>

如此当修改流程定义文件后要是运维ant命令就足以打包了:

ant workflow.package.oa.leave

未来铺排bar只怕zip文件查看流程图图片就不是乱码了,而是你的压缩包里面包车型客车png文件。

二. 提前还款流程

2.2 使用引擎提供的Form依旧自定义业务Form

倡议流程的最首要缘由是客商期望根据公约进行提前还款. 流程关键步骤为:

2.2.1 引擎提供的Form

概念表单的不二秘籍在每一种Task标签中定义extensionElementsactiviti:formProperty就可以,达到这一个节点的时候能够透过API读取表单成分。

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

不过这种形式独有适用于相比简单的流水生产线,对于某个复杂大概页面必要专门的职业逻辑的论断的景况就不适用了。

对此数据的保留都以在内燃机的表中,不方便人民群众和别的表的关系、对全数种类的设计也可能有损!

❶ 借款人联系客服职员, 提交申请

2.2.2 自定义业务Form

这种方法应该是我们用的最多的了,因为相似的职业种类业务逻辑都会比较复杂,何况数据库福建中国广播企业余大学表都会有依附关系,表单中有好些个场馆判别。

比如说大家的种类适用jQuery UI作为UI,有许多javascript代码,页面的广大操作须求极度管理(例如:八个接纳的排斥、每一个节点依据项目和操作人展现分歧的开关);基本各样集团都有一套自身的UI风格,要维持多少个系统的操作习贯一致只好使用自定义表单本领满意。

❷ 运转生成提前还款表明书, 其包含详细金额多少

2.3 业务和流程的涉嫌情势

其一题材在群里面很几个人都问过,那也是本身刚刚发轫吸引的地点;

新兴看了以下API发现RuntimeService有两个章程:

❸ 借款人确认, 通过客服服务人口上传签名照片

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.3.2 startProcessInstanceById

javadoc对其表明:

startProcessInstanceById(String processDefinitionId, String businessKey, Map variables) 
          Starts a new process instance in the exactly specified version of the process definition with the given id.

 

processDefinitionId:那几个参数的值能够因而repositoryService.createProcessDefinitionQuery()方式查询,对应数据库:ACT_RE_PROCDEF;每一回安排贰次流程定义就能增添一条数据,同名的本子号增添。

专程表明: 此能够钦定不一致版本的流水线定义,让客商多一层选取。

❺ 生成还款结清表明

2.3.3 怎样选拔

提出使用startProcessInstanceByKey,特殊意况要求动用过去的本子选用采用startProcessInstanceById

在凉台的莫过于运维中, 有精彩纷呈的业务须要管理, 包罗借款人, 出借人, 资金等等, 同不经常候还波及到各种分化的业务部门, 並且流程的漂流操作人士和机构也趁机集团业务的上扬而分化的调度. 设计贰个基础的流水生产线框架和达成基础代码, 造成轻松的支付方式是该系统的首要性. 由此整个类别的规划涉及到以下入眼多少个方面:

2.4 同步客商数量

其一主题材料也是比较多的人询问过,Activiti援救对职分分配到:内定人、内定组、两个结合,而那个人和组的消息都保存在ACT_ID..表中,有和好的客商和组(剧中人物)管理让洋法国人仓惶了;原因是因为各类系统都会存在叁个权力管理模块(维护:客商、部门、剧中人物、授权),不知情该怎么和Activiti同步。

☞ 采取适宜的干活流引擎

2.4.1 提议处理格局

Activiti有一个IdentityService接口,通过那些接口能够操控Activiti的ACT_ID_*表的多寡,一般的做法是用专门的职业系统的权位管理模块维护客商数据,当进行CRUD操作的时候在本来专业逻辑后边加多同步到Activiti的代码;比方加多二个客商时同步Activiti User的代码片段:

/**
 * 保存用户信息 并且同步用户信息到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());
            }
        }
    }

}

 

删除操作也和这一个近乎!

无论从专门的工作系统爱戴客商如故从Activiti维护,确定要分明一方,然后CRUD的时候一齐到对方,倘使需求联合八个子系统那么能够再调用WebService完毕。

对于贰个像样涉及到审查批准以及实践实际作业的种类, 基于简单的意况调节的筹算, 只怕电动开荒类专门的学业流引擎轮子的做法都是不合适. 所以三个开源何况被相近运用的劳作流引擎是三个不利并且必须的选用. Activiti 职业流引擎由于其轻量级, 易用性等优点这几天在产业界被普及使用. 其专门的学问流的状态机和外界系统的总是只供给经过一个ID举办关联就可以, 即activiti的business key. (如下图)

2.5 流程图设计工具用什么样

Activiti提供了多个流程设计工具,不过面向对象分裂。

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

  • Eclipse Designer,面向开拓人士,Eclipse的插件,能够让开拓人士定制每一种节点的质量(ID、Name、Listener、Attr等)

威尼斯城所有登入网址 4

2.5.1 大家的情势

大概你会欣喜,因为大家从未行使Activiti Modeler,我们以为用Viso已经能发挥流程图的乐趣了,而且项目老董也是技巧出身,和开垦职员也易于调换。

眼前以此类型是率先个应用Activiti的,开首我们在必要科学研商阶段采用Viso设计流程图,利用泳道流程图规划和客商关系,鲜明后由肩负流程的开采人士用Eclipse Designer设计赢得bpmn20.xml,最终安顿。

☞设计通用的底层数据来支撑不一样的事体

2.6 Eclipse Designer存在的难题

以此插件有三个很看不惯的Bug平素未修复,安装了插件后Eclipse的复制和粘帖快速键会被改动为(Ctrl+Insert、Shift+Insert);Bug描述请见:

  • Activit Forums中告知的Bug

  • Jira的登记

就此最后我们只好单独开三个装置了Eclipse Designer的Eclipse专门用来陈设流程图,那样就不影响健康使用Eclipse JAVAEE了。

出于那样贰个营业管理种类关系到各样区别的事体数据. 如借款人新闻相关关系借款ID, 银行卡新闻等; 如出借人新闻则关乎客商ID, 电话号码等; 而对于资金有关如提前还款则提到到提前还款日期, 还款金额等. 所以一套支撑分化实际工作的流程数据表结构也是充足主要.

3.配置

☞ 基础框架代码的筹算

3.1 集成Spring

对于和Spring的集成Activiti做的准确性,简单布置部分Bean代理就可以兑现,不过有七个和事情相关的地点要提拔:

  • 配置processEngineConfiguration的时候属性transactionManager要选拔和事情职能的同贰个事务管理Bean,不然事务不一同。

  • 对此达成了org.activiti.engine.delegate包中的接口的类必要被专门的学业调控的完成类供给被Spring代理,而且增进事务的Annotation也许在xml中安排,举个例子:

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

?

二个好的规划不是一步到位的规划, 而是几个渐进的经过以及不断重构的进度. 但是极其重要的一点就是在一开头能够依据当下的要求以及所能预言的须要开展规划, 並且在这几个基础框架代码上支付要尤其方便人民群众和简洁.

4.施用单元测量试验

单元测验均采取Spring的AbstractTransactionalJUnit4SpringContextTests作为SuperClass,並且在测验类增添:

@ContextConfiguration(locations = { "/applicationContext-test.xml"})
@RunWith(SpringJUnit4ClassRunner.class)

?

虽说Activiti也提供了测量试验的有个别超类,不过感到倒霉用,所以自身包裹了有个别主意。

代码请转移:

◆✦以下对第二、三点张开辟展✦◆

4.1 验证流程图设计是还是不是科学

代码请转移:

威尼斯城所有登入网址 5

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

代码请转移:

数据库设计

5.各个意况的职分查询以及和事务对象关系

我们这两天分成4中状态:未签收、办理中、运转中、已做到。

查询到职责仍旧流程实例后要显得在页面,那年须求加上业务数据,最后结果就是事情和流程的并集,请参照他事他说加以考察6.2

如上所说, 那样的四个数码安插必须能够满足:

5.1 未签收(Task)

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

对应的API查询:

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

?

  1. 能够满意差异的业务域的要求, 如出借, 借款, 资金相关的现实专门的学业数据

  2. 可知记录每一步的操作审查批准或业务施行结果, 同一时间记录相关的数额快速照相

5.2 办理中(Task)

该类任务数据类源有二种:

  • 签收后的,5.第11中学签收后就应为办理中状态

  • 节点钦定的是有血有肉到壹个人,并非剧中人物

对应的API查询:

/**
 * 获取正在处理的任务查询对象
 * @param userId    用户ID
 */
@Transactional(readOnly = true)
publicTaskQuery createTodoTaskQuery(String userId) {
    TaskQuery taskAssigneeQuery = taskService.createTaskQuery().processDefinitionKey(getProcessDefKey()).taskAssignee(userId);
    returntaskAssigneeQuery;
}

?

据此, 基于实际的作业实行数据表的规划是不稳妥的, 且无法扩充. 常见的统一计划为基于Key-Value的统一准备, 而key则是逐个差异专门的职业系统涉及到的metadata. 如USE奇骏_ID(用户ID), LOAN_ID(借款ID)等等. 设计概述如下:

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;
}

?

威尼斯城所有登入网址 6

5.4 已完成(HistoricProcessInstance)

已经终止的流水生产线实例。

从表ACT_HI_PROCINST中查询数据。

/**
 * 获取已经完成的流程实例查询对象
 * @param userId    用户ID
 */
@Transactional(readOnly = true)
publicHistoricProcessInstanceQuery createFinishedProcessInstanceQuery(String userId) {
    HistoricProcessInstanceQuery finishedQuery = historyService.createHistoricProcessInstanceQuery()
            .processDefinitionKey(getProcessDefKey()).finished();
    returnfinishedQuery;
}

 

?

二个Request代表某一位发起的呼吁, Snapshot代表这一个流程的每一步操作. Property则分别为Request的Snapshot的现实的数目, 当其REQUEST_ID非空SNAPSHOT_ID为空时表示其为REQUEST的品质(SNAPSHOT同理), 即客商发起呼吁所指点的数据. 如: 顾客音信修改: PROPERTY则囊括NAME(KEY)为USEEscort_ID(客商独一ID), ATTACHMENT(顾客手持身份ID照片), EMAIL(修改项)等一面如旧的值. 而对于SNAPSHOT, 则记录对应调查以及操作的消息, 其对应的PROPERTY则保留了对有个别数据修改前后的值.

5.5 查询时和事务关联

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

思路:以后得以采取这几个字段查询了,不管是Task依然ProcessInstance都足以获取流程实例ID,能够依靠流程实例ID查询实体然后把流程对象设置到实体的几特品质中由Action恐怕Controller输出到前台。

代码请参见:

本文由威尼斯在线平台发布于威尼斯城所有登入网址,转载请注明出处:Activiti事业流引擎使用,基于职业流的平台管理种

关键词:

威尼斯城所有登入网址:药品真假一比就知,3

原标题:阿里健康发布“超级药房1.0” 2000名执业药师在线免费咨询 原标题:阿里健康发布超级药房1.0 药品真伪一比...

详细>>

没有深入合作,网易严选悄悄入驻拼多多

原标题:网易严选回应入驻拼多多:只是试水,没有深入合作 原标题:网易严选悄悄入驻拼多多,只是为了试水?...

详细>>

红杉中国领投,女装订阅平台Abox壹盒宣布今日起

原标题:女装订阅购衣平台Abox壹盒获A轮融资,红杉中国领投、XVC、DCM、险峰长青、初心资本跟投 投资界9月12日消息...

详细>>

小Miko技创办人雷军京东董事长刘强东王兴上榜,

原标题:除了马化腾(英文名:Pony)、李彦宏(英文名:Robin)以外,那伍人富豪也是礼仪之邦互连网界的大佬 7月...

详细>>