➤ 近日, 别的贰个类别其使用到的风貌和这一个种类有类似之处,
其单独于该业务处理平台. 在这里种境况下, 将该工作流相关的模块进行公共化,
以JAENVISION包的花样提供, 使得另外三个连串的用度能够短时间内达到同等的效果与利益

5.5 查询时和事务关联

提醒:在此以前在事情对象增添了PROCESS_INSTANCE_ID字段

思路:现在得以使用这些字段查询了,不管是Task依旧ProcessInstance都足以获得流程实例ID,能够依靠流程实例ID查询实体然后把流程对象设置到实体的叁天性能中由Action或许Controller输出到前台。

代码请参见:

美高梅国际平台 1

5.4 已完成(HistoricProcessInstance)

早就竣事的流水生产线实例。

从表ACT_HI_PROCINST中查询数据。

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

 

?

❺ 生成还款结清评释

2.2.2 自定义业务Form

这种艺术应该是我们用的最多的了,因为常常的专门的学问种类职业逻辑都会相比复杂,何况数据库中广大表都会有依据关系,表单中有为数不菲气象剖断。

比如大家的系统适用jQuery
UI作为UI,有相当多javascript代码,页面包车型客车广大操作要求极度管理(举例:多少个选用的排斥、每个节点依照项目和操作人显示分裂的按键);基本每种集团都有一套本身的UI风格,要维持八个类别的操作习于旧贯一致只可以采纳自定义表单工夫满意。

美高梅国际平台 2回去博客园,查看越来越多

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完毕。

◆✦上面为八个卓越的业务流程✦◆

1.2 Activiti与JBPM5?

对此Activiti、jBPM4、jBPM5大家应有怎样抉择,在InfoQ上有一篇文章写的很好,从大的框框相比较各类引擎之间的差别,请参见文章:纵观jBPM:从jBPM3到jBPM5以及Activiti5

借鉴Activiti的源代码

6.3.1 当前节点定位JS

Java代码请移步:

Javascript思路:先经过Ajax获取当前节点的坐标,在钦赐地点加多郎窑红边框,然后加载图片。

代码移步:

故而, 基于具体的政工进行数据表的安插性是不正好的, 且无法扩张.
常见的陈设为依赖Key-Value的计划,
而key则是逐个不一致工作种类关系到的metadata. 如USEHaval_ID(用户ID),
LOAN_ID(借款ID)等等. 设计概述如下:

6.1 单唯一个列表担任申请

这么的补益是申请和流程办理分离开管理,列表突显未运转流程的请假记录(数据库PROCESS_INSTANCE_ID为空)。

申请分界面包车型大巴截图:

美高梅国际平台 3

  1. 兑现贰个创立Request的页面,
    用于录入专业数据

  2. 福寿齐天八个Request详细页面, 用于体现详细的情况,
    包蕴操作历史, 和作业操作开关

4.1 验证流程图设计是不是准确

代码请转移:

哪个种类完成更加好?

1.3 Activiti资料

  • 官网:

  • 下载:

  • 本子:Activiti的版本是从5开始的,因为Activiti是使用jBPM4的源码;本子公布:四个月发布二次。

  • Eclipse Plugin: 

  • Activit中文群:5435716

Activiti的数据库版本的机动进级. 当我们晋级activiti的本牛时,
其实大家只必要更新JATucson的版本号, 而不用关爱起底层数据库是不是必要进级,
activiti在其表中会记录数据库scheme的版本号,
运行时会自行剖断并基于须求自动更新数据库. 那也是十一分值得借鉴的地点,
特别是当以此模块被两个类别所使用时。

5.1 未签收(Task)

该类任务针对于把Task分配给三个剧中人物时,举例部门官员,因为机关领导剧中人物能够钦点多人所以必要先签收再办理,术语:抢占式

对应的API查询:

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

?

不断的重构包涵:

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文件。

一个Request代表某一人发起的乞请, Snapshot代表这么些流程的每一步操作.
Property则分别为Request的Snapshot的有血有肉的数据,
当其REQUEST_ID非空SNAPSHOT_ID为空时表示其为REQUEST的性子(SNAPSHOT同理),
即客商发起呼吁所指引的数据. 如: 顾客音讯修改:
PROPERTY则囊括NAME(KEY)为USE汉兰达_ID(客商独一ID),
ATTACHMENT(客户手持身份ID照片), EMAIL(修改项)等一面如旧的值. 而对此SNAPSHOT,
则记录对应考察以至操作的新闻,
其对应的PROPERTY则保留了对某些数据修改前后的值.

7.开启Logger

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

二. 提前还款流程

6.UI及截图

结合实际业务描述贰个政工从上马到截止的长河,对于吸引的同学看完听君一席谈胜读十年书了;这里运用请假作为例子。

二个好的安插性不是一步到位的安插,
而是叁个循规蹈矩的进程以至持续重构的进程.
可是那些重大的一些正是在一始发能够基于最近的急需以至所能预感的须求进行统一准备,
並且在这里个基础框架代码上支出要特别低价和简洁.

5.种种状态的天职查询以至和工作对象关联

我们当下分为4中状态:未签收、办理中、运营中、已变成。

询问到职责照旧流程实例后要呈现在页面,那年需求加上业务数据,最后结果正是事情和流程的并集,请参谋6.2

形成历程

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

代码请转移:

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

2.第一使用碰着标题搜集

因为Activiti刚刚退出不久所以资料相比空缺,中文资料越来越少的可怜,所以起头的时候贰头雾水(固然之前用过职业流,不过感到间隔相当多),况且官方的手册还不是很完善;所以作者把自家在上学应用的进度遇到的一对疑忌都位列出来分享给我们;以下几点是自身遇上和想到的,倘让你还大概有怎么着疑难能够在评价花潮笔者交流再补充。

为了缓慢解决#1的主题材料,
则要求定义出流程–步骤—业务(央浼类型)—管理人/组 的配备 关系,
并在工艺流程流转时自动安装, 并不是在流水生产线描述文件 (bpmn)里 钦定

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

美高梅国际平台 4

3.配置

❹ 运维代扣还款金额, 结清借款

2.1.2.1 使用工具打包Bar文件

右键项目名称然后点击“Create deployment
artifacts”,会在src目录中开创deployment文件夹,里面包蕴*.bar文件.

在平台的实际运行中, 有多样二种的业务须求管理, 包涵借款人, 出借人,
资金等等, 同临时间还涉嫌到各样不相同的业务部门,
何况流程的萍踪浪迹操作人士和机关也趁机公司工作的向上而各异的调治.
设计二个基础的流程框架和兑现基础代码, 产生轻易的开辟形式是该种类的第一.
由此全体系统的统一筹算涉及到以下器重多少个地点:

2.6 Eclipse Designer存在的主题材料

这几个插件有一个很讨厌的Bug平昔未修复,安装了插件后Eclipse的复制和粘帖飞快键会被撤换为(Ctrl+Insert、Shift+Insert);Bug描述请见:

  • Activit
    Forums中报告的Bug

  • Jira的登记

由此最后我们不得不单独开叁个安装了Eclipse
Designer的Eclipse特意用来规划流程图,那样就不影响不荒谬使用Eclipse
JAVAEE了。

➤RequestQuery扶助统一的查询入口对业务流程数据举办查询

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.1 布置流程图后汉语乱码

乱码是直接缠绕着国人的主题素材,在此以前各种技巧、工具出现乱码的标题写过无数篇章,这里也不例外……,Activiti的乱码问题在流程图中。

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

美高梅国际平台 5

解决办法有三种:

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

4.使用单元测量检验

单元测验均运用Spring的AbstractTransactionalJUnit4SpringContextTests作为SuperClass,况且在测验类增加:

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

?

就算Activiti也提供了测量试验的有的超类,但是感到倒霉用,所以本人包装了部分情势。

代码请转移:

网编:

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

出于那样三个营业管理种类关系到各样分化的专业数据.
如借款人音信相关关系借款ID, 信用卡消息等; 如出借人新闻则关乎客商ID,
电话号码等; 而对于资金财产相关如提前还款则提到到提前还款日期, 还款金额等.
所以一套支撑区别实际事务的流水生产线数据表结构也是可怜重要.

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更新到事情表中,那样无论从作业依旧流程都能够查询到对方!

专程说明: 此方法运营时自动选用新型版本的流水生产线定义。

➤ 数据库设计 和RequestService对底层数据操作的卷入

Activiti专门的事业流引擎使用

➤ WorkflowService对专门的工作流引擎的包装

2.5 流程图设计工具用如何

Activiti提供了七个流程设计工具,可是面向对象差异。

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

  • Eclipse
    Designer,面向开垦人士,Eclipse的插件,能够让开采人员定制种种节点的性质(ID、Name、Listener、Attr等)

一. 借款人银行卡新闻修改

2.1.2 使用压缩包格局地署

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

运用Activit Deisigner工具设计流程图的时候会有多个门类的文书:

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

  • .bpmn20.xml统一企图工具自动依据.activiti文件生成的xml文件

  • .png流程图图片

消除办法正是把xml文件和图表文件同不常间布署,因为在单独安插xml文件的时候Activiti会自动生成一张流程图的图样文件,然则如此在利用的时候坐标和图表对应不起来……

故此把xml和图纸同临时间配备的时候Activiti自动关联xml和图表,当须要获得图片的时候一向回到安排时压缩包里面包车型大巴图样文件,并非Activiti自动生成的图片文件

数据库设计

2.5.1 大家的格局

只怕你会惊叹,因为大家从不选择Activiti
Modeler,大家以为用Viso已经能公布流程图的野趣了,并且项目总经理也是技能出身,和开拓职员也易于调换。

时下那么些连串是率先个应用Activiti的,最早我们在须要调查商量阶段采纳Viso设计流程图,利用泳道流程图统一准备和客商关系,分明后由担当流程的开垦人士用Eclipse
Designer设计赢得bpmn20.xml,最终安顿。

☞ 基础框架代码的设计

6.3 流程追踪

图表情势展示当前节点:

美高梅国际平台 6

列表情势体现流程流转进度:

美高梅国际平台 7

此地举多少个例证

2.4 同步顾客数据

那一个主题素材也是非常多的人领会过,Activiti支持对职务分配到:钦赐人、钦定组、两个结合,而那一个人和组的音讯都保存在ACT_ID..表中,有和好的客户和组(剧中人物)管理让洋瑞士人心慌了;原因是因为每一个系统都会设有二个权力管理模块(维护:用户、部门、剧中人物、授权),不明了该怎么和Activiti同步。

❸ 运行机构扩充改变操

2.3.3 怎么样抉择

建议选拔startProcessInstanceByKey,特殊景况必要运用过去的版本选取使用startProcessInstanceById

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

1.1 我与做事流引擎

在首先家商城专业的时候根本任务就是开垦OA系统,当然基本都以有职业流的帮忙,不过当下利用的干活流引擎是信用合作社部分牛人开拓的(据他们说是用一个开源的斯特林发动机械修理改的),名称为CoreFlow;功效相对Activiti来讲比较弱,不过能满意普通的行使,当然也是有过多的主题材料因而后来我们只好修改引擎的代码打补丁。

到现在是自己专门的职业的第二家百货店,因为要开荒ERP、OA等系统要求选取职业流,在档期的顺序应用研商阶段自身先物色资料选用使用哪个开源办事流引擎,最后分明了Activiti5并依赖商家的架构做了部分DEMO。

  1. 将流程涉及的processor和对应的事务品种,
    流程名, 流程步骤进行登记绑定

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

?

发表评论

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

相关文章