原标题:基于工作流的阳台管理体系规划

Activiti职业流引擎使用

betway88必威 1

1.轻便介职业流引擎与Activiti

对此职业流引擎的阐述请参照他事他说加以考察百度完善:办事流引擎

1.轻便介工作流引擎与Activiti

对此工作流引擎的分解请参见百度宏观:干活流引擎

对于互联网金融平台来讲,主要的政工愈发是涉及资本工作相关操作时都有不可或缺有有关的审查批准流程.同一时候在流程的漂泊进程中供给和各种业务类别开展相互,落成真正的事务管理,
并记录这么些进度中全数人的操作以及每一步操作时所关联多少快速照相,以便于内外界审计和主题素材的追溯.

1.1 我与做事流引擎

在首先家商店职业的时候根本职务就是开垦OA系统,当然基本都以有专门的学问流的支撑,然而当下选择的干活流引擎是同盟社部分牛人开荒的(据悉是用叁个开源的引擎修改的),名为CoreFlow;成效绝对Activiti来讲比较弱,但是能满意普通的运用,当然也可以有过多的主题素材因而后来大家只好修改引擎的代码打补丁。

于今是本人专门的学业的第二家商城,因为要开拓ERP、OA等系统必要选用职业流,在项目应用研讨阶段本人先物色资料选拔使用哪个开源干活流引擎,最终明确了Activiti5并依靠商家的架构做了部分DEMO。

1.1 作者与做事流引擎

在首先家商城专业的时候根本职务正是开拓OA系统,当然基本都以有专门的学问流的支撑,不过当下使用的行事流引擎是公司部分牛人开采的(听大人说是用贰个开源的引擎修改的),名字为CoreFlow;作用相对Activiti来讲相比较弱,但是能满意平时的选用,当然也许有不菲的主题素材由此后来我们只好修改引擎的代码打补丁。

于今是本人职业的第二家厂家,因为要开采ERP、OA等种类需求利用专门的工作流,在类型调研阶段自身先物色资料采取选取哪个开源做事流引擎,最后分明了Activiti5并依据厂家的框架结构做了有的DEMO。

◆✦下边为七个标准的业务流程✦◆

1.2 Activiti与JBPM5?

对此Activiti、jBPM4、jBPM5大家相应什么抉择,在InfoQ上有一篇小说写的很好,从大的框框相比各种引擎之间的差距,请参见小说:纵观jBPM:从jBPM3到jBPM5以及Activiti5

1.2 Activiti与JBPM5?

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

(注: 为了验证方便, 已经简化和退换有关手续, 和点融实操不雷同)

1.3 Activiti资料

  • 官网:

  • 下载:

  • 本子:Activiti的版本是从5开始的,因为Activiti是使用jBPM4的源码;本子颁布:八个月发表贰回。

  • Eclipse Plugin: 

  • Activit中文群:5435716

1.3 Activiti资料

  • 官网:

  • 下载:

  • 本子:Activiti的本子是从5开始的,因为Activiti是使用jBPM4的源码;本子发表:多个月宣布三次。

  • Eclipse Plugin: 

  • Activit中文群:236540304

betway88必威 2

2.初次使用境遇难点访谈

因为Activiti刚刚退出不久所以资料比较空缺,汉语资料更少的可怜,所以最早的时候叁只雾水(即便事先用过职业流,不过以为距离非常多),何况官方的手册还不是很圆满;所以小编把笔者在上学使用的长河遭遇的片段疑点都位列出来分享给大家;以下几点是本身碰到和想到的,假使您还会有啥样难题能够在评价杏月本人调换再补充。

2.初次使用蒙受标题搜聚

因为Activiti刚刚退出不久所以资料比较空缺,普通话资料更少的可怜,所以开首的时候三只雾水(尽管事先用过工作流,但是感到距离非常多),何况官方的手册还不是很周详;所以本人把本身在读书运用的长河遭逢的有些问号都位列出来分享给大家;以下几点是本身遇到和想到的,假设您还恐怕有啥样疑点能够在胡言乱语中和小编沟通再补充。

一. 借款人信用卡音信修改

2.1 安顿流程图后粤语乱码

乱码是一贯缠绕着国人的标题,此前各类手艺、工具出现乱码的题目写过不菲稿子,这里也不例外……,Activiti的乱码难点在流程图中。

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

betway88必威 3

化解办法有二种:

2.1 安插流程图后中文乱码

乱码是一向缠绕着国人的标题,以前各类技艺、工具现身乱码的难题写过无数稿子,这里也不例外……,Activiti的乱码难点在流程图中。

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

betway88必威 4

消除办法有二种:

该流程发起原因根本是出于借款人存折转移原因需求修改. 流程关键步骤为:

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

❶ 客户联系客商服务人士,提交申请, 包含借贷音讯, 手持身份ID照片,
银行卡消息等

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 使用压缩包格局布署

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.1 使用工具打包Bar文件

在“Package Explorer”视图中右键项目名称然后点击“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.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文件。

二. 提前还款流程

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

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

倡导流程的重大原因是客户愿意依照左券举办提前还款. 流程关键步骤为:

2.2.1 引擎提供的Form

概念表单的办法在各样Task标签中定义extensionElementsactiviti:formProperty就可以,到达那么些节点的时候能够因而API读取表单成分。

Activiti官方的例证使用的便是在工艺流程定义中设置每二个节点呈现怎么的表单哪些字段须要出示、哪些字段只读、哪些字段必填。

可是这种办法唯有适用于相比较轻便的流程,对于有个别复杂只怕页面供给专门的工作逻辑的决断的情事就不适用了。

对于数据的保留都以在斯特林发动机的表中,不便于和别的表的涉及、对全部系统的规划也不利于!

2.2.1 引擎提供的Form

概念表单的法门在种种Task标签中定义extensionElementsactiviti:formProperty就可以,达到那个节点的时候能够经过API读取表单成分。

Activiti官方的事例使用的正是在流程定义中装置每贰个节点展现怎么的表单哪些字段需求展现、哪些字段只读、哪些字段必填。

唯独这种办法独有适用于比较轻易的流程,对于有些复杂或许页面必要职业逻辑的论断的处境就不适用了。

对于数据的保存都以在电动机的表中,不实惠和别的表的关联、对任何系统的安排性也是有损!

❶ 借款人联系客服职员, 提交报名

2.2.2 自定义业务Form

这种艺术应该是豪门用的最多的了,因为相似的业务系统职业逻辑都会相比较复杂,何况数据库中有的是表都会有依赖关系,表单中有大多景色决断。

举个例子大家的系统适用jQuery
UI作为UI,有广大javascript代码,页面包车型大巴无数操作须求特殊管理(比方:多个选用的排斥、每一个节点根据项目和操作人展现分化的按键);基本每一种公司都有一套本身的UI风格,要维持多少个类其他操作习于旧贯一致只可以动用自定义表单本事满意。

2.2.2 自定义业务Form

这种方法应该是我们用的最多的了,因为相似的事务体系业务逻辑都会相比复杂,何况数据库中多数表都会有依附关系,表单中有众多情景决断。

举例大家的系统适用jQuery
UI作为UI,有成都百货上千javascript代码,页面包车型地铁洋洋操作要求非常管理(比方:多少个挑选的排挤、每种节点根据项目和操作人彰显分歧的开关);基本各类厂家都有一套自身的UI风格,要保证多少个连串的操作习贯一致只好使用自定义表单技术满意。

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

2.3 业务和流程的涉及格局

以此标题在群里面很两个人都问过,那也是笔者刚刚最早吸引的地点;

后来看了以下API发现RuntimeService有四个点子:

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.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更新到事情表中,那样无论从业务也许流程都得以查询到对方!

极度表达: 此方法运行时自动选用新型版本的流水生产线定义。

betway88必威,❹ 运转代扣还款金额, 结清借款

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.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.3.3 如何挑选

提出选取startProcessInstanceByKey,特殊境况要求利用过去的版本选取使用startProcessInstanceById

在凉台的实际运维中, 有多样八种的事情必要管理, 包蕴借款人, 出借人,
资金等等, 同一时候还提到到各类区别的业务部门,
何况流程的萍踪浪迹操作职员和机关也趁机集团专门的学业的前进而各异的调度.
设计三个基础的流水生产线框架和兑现基础代码, 产生轻易的开拓形式是该类别的非常重要.
因此整个系统的设计涉及到以下入眼多少个地点:

2.4 同步客商数据

这么些主题材料也是比较多的人明白过,Activiti支持对职分分配到:钦点人、钦命组、两个结合,而这几个人和组的音讯都保存在ACT_ID..表中,有温馨的客商和组(剧中人物)管理让不菲人仓惶了;原因是因为各个系统都会存在多个权力管理模块(维护:客户、部门、剧中人物、授权),不精晓该怎么和Activiti同步。

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实现。

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达成。

对于二个看似涉及到审查批准以及实践实际作业的系列, 基于轻松的意况调控的安顿,
可能机关开拓类职业流引擎轮子的做法都以不合适.
所以贰个开源並且被大面积运用的劳作流引擎是一个不利並且必需的选择. Activiti
工作流引擎由于其轻量级, 易用性等优点方今在产业界被广大使用.
其职业流的状态机和外界系统的总是只须要通过贰个ID进行关联就可以,
即activiti的business key. (如下图)

2.5 流程图设计工具用什么

Activiti提供了五个流程设计工具,可是面向对象分歧。

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

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

2.5 流程图设计工具用怎么着

Activiti提供了多少个流程设计工具,可是面向对象区别。

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

  • Eclipse
    Designer,面向开采职员,Eclipse的插件,能够让开拓职员定制每一个节点的性质(ID、Name、Listener、Attr等)

betway88必威 5

2.5.1 我们的点子

兴许你会古怪,因为大家并未有选取Activiti
Modeler,大家以为用Viso已经能表达流程图的情致了,而且项目主任也是技术出身,和开垦职员也轻巧调换。

最近以此项目是第三个利用Activiti的,初叶我们在要求应用研商阶段采纳Viso设计流程图,利用泳道流程图设计和客商交流,分明后由肩负流程的开垦职员用Eclipse
Designer设计赢得bpmn20.xml,最终布置。

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了。

2.6 Eclipse Designer存在的主题材料

其一插件有贰个很反感的Bug平昔未修复,安装了插件后Eclipse的复制和粘帖快速键会被转移为(Ctrl+Insert、Shift+Insert);Bug描述请见:

  • Activit
    Forums中报告的Bug

  • Jira的登记

于是最后大家不得不单独开一个安装了Eclipse
Designer的Eclipse特地用来统一计划流程图,那样就不影响健康使用Eclipse
JAVAEE了。

鉴于那样多少个运转管理种类涉及到各样不一致的作业数据.
如借款人音讯有关涉嫌借款ID, 银行卡新闻等; 如出借人消息则涉及客商ID,
电话号码等; 而对此资本有关如提前还款则涉嫌到提前还款日期, 还款金额等.
所以一套支撑不一致实务的流水生产线数据表结构也是不行重要.

3.配置

3.配置

☞ 基础框架代码的设计

3.1 集成Spring

对此和Spring的集成Activiti做的精确,轻易安插部分Bean代理就可以达成,但是有五个和业务相关的地方要提示:

  • 配置processEngineConfiguration的时候属性transactionManager要运用和业务功效的同贰个事务管理Bean,不然事务差别台。

  • 对于落到实处了org.activiti.engine.delegate包中的接口的类须求被事业调节的落实类须求被Spring代理,何况拉长事务的Annotation可能在xml中安排,举例:

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

?

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 {
   ....
}

八个好的准备不是一步到位的准备,
而是贰个渐进的经过以及不断重构的进度.
但是那八个主要的一点正是在一发端能够依据近些日子的须求以及所能预言的急需开展统一筹算,
况兼在那些基础框架代码上支付要特别便于和简洁.

4.选择单元测验

单元测验均运用Spring的AbstractTransactionalJUnit4SpringContextTests作为SuperClass,况兼在测量试验类增多:

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

?

虽说Activiti也提供了测量试验的一对超类,然则感到不佳用,所以自个儿包装了有的办法。

代码请转移:

4.运用单元测验

单元测量检验均选取Spring的AbstractTransactionalJUnit4SpringContextTests作为SuperClass,何况在测量试验类增加:

?

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

虽说Activiti也提供了测量试验的有些超类,不过感到倒霉用,所以自个儿包裹了一部分方法。

代码请转移:

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

4.1 验证流程图设计是还是不是正确

代码请转移:

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

代码请转移:

betway88必威 6

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

代码请转移:

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

代码请转移:

数据库设计

5.各样情况的天职查询以及和事务对象关联

作者们日前分成4中状态:未签收、办理中、运维中、已成功。

询问到任务照旧流程实例后要来得在页面,那一年要求增多业务数据,最后结出就是工作和流程的并集,请参见6.2

5.各样状态的任务查询以及和业务对象关联

大家前段时间分成4中状态:未签收、办理中、运营中、已产生。

询问到任务如故流程实例后要显得在页面,那个时候须要丰硕业务数据,最终结出正是业务和流程的并集,请参见6.2

如上所说, 那样的二个数据布置必得可以满意:

5.1 未签收(Task)

此类职分针对于把Task分配给一个剧中人物时,比方部门长官,因为机构首席实行官剧中人物可以钦点几人所以要求先签收再办理,术语:抢占式

对应的API查询:

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

?

5.1 未签收(Task)

该类职责针对于把Task分配给八个剧中人物时,举例部门经理,因为单位官员剧中人物能够内定三个人所以须要先签收再办理,术语:抢占式

对应的API查询:

?

1
2
3
4
5
6
7
8
9
10
/**
 *
获取未签收的任务查询对象
 *
@param userId    用户ID
 */
@Transactional(readOnly
=
true)
public
TaskQuery createUnsignedTaskQuery(String userId) {
    TaskQuery
taskCandidateUserQuery = taskService.createTaskQuery().processDefinitionKey(getProcessDefKey())
            .taskCandidateUser(userId);
    return
taskCandidateUserQuery;
}
  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;
}

?

5.2 办理中(Task)

此类职务数据类源有二种:

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

  • 节点内定的是切实可行到壹位,并不是剧中人物

对应的API查询:

?

1
2
3
4
5
6
7
8
9
/**
 *
获取正在处理的任务查询对象
 *
@param userId    用户ID
 */
@Transactional(readOnly
=
true)
public
TaskQuery createTodoTaskQuery(String userId) {
    TaskQuery
taskAssigneeQuery = taskService.createTaskQuery().processDefinitionKey(getProcessDefKey()).taskAssignee(userId);
    return
taskAssigneeQuery;
}

据此, 基于具体的事务扩充数据表的设计是不相宜的, 且不能够增添.
常见的宏图为依附Key-Value的宏图,
而key则是逐个不一样职业系统涉及到的metadata. 如USESportage_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;
}

?

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

betway88必威 7

5.4 已完成(HistoricProcessInstance)

已经截止的流程实例。

从表ACT_HI_PROCINST中询问数据。

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

 

?

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

一个Request代表某一位发起的央浼, Snapshot代表那一个流程的每一步操作.
Property则分级为Request的Snapshot的求实的多少,
当其REQUEST_ID非空SNAPSHOT_ID为空时表示其为REQUEST的习性(SNAPSHOT同理),
即顾客发起呼吁所引导的数据. 如: 客户音讯修改:
PROPERTY则包含NAME(KEY)为USEEnclave_ID(客户独一ID),
ATTACHMENT(客商手持身份ID照片), EMAIL(修改项)等一见倾心的值. 而对此SNAPSHOT,
则记录对应核实以及操作的音信,
其相应的PROPERTY则保留了对有个别数据修改前后的值.

5.5 查询时和工作涉及

升迁:以前在事情对象增加了PROCESS_INSTANCE_ID字段

思路:今后得以采纳这几个字段查询了,不管是Task照旧ProcessInstance都足以赢得流程实例ID,能够依附流程实例ID查询实体然后把流程对象设置到实体的三个属性中由Action大概Controller输出到前台。

代码请参见:

5.5 查询时和作业涉及

晋升:在此以前在业务对象加多了PROCESS_INSTANCE_ID字段

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

代码请参见:

基本功框架代码设计

6.UI及截图

结合实际业务描述二个事情从开头到截至的进度,对于吸引的同班看完出现转机了;这里运用请假作为例子。

6.UI及截图

结合实际业务描述三个事情从开端到甘休的进度,对于吸引的同学看完出现转机了;这里运用请假作为例子。

初阶的情况和必要富含:

6.1 单独一个列表负担申请

如此的收益是申请和流程办理分离开管理,列表展现未运营流程的请假记录(数据库PROCESS_INSTANCE_ID为空)。

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

betway88必威 8

6.1 单唯三个列表担负申请

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

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

betway88必威 9

  1. 一对通用的activiti流程,
    如一步操作即创造后只须求一步成功操作, 两步流程 –
    创立后一步审查一步操作等, 分化的作业会使用同样的流程.

  2. 在activiti流程一样的气象下,
    差别的事体的步子其管理人/组则分化

  3. 差异业务流程的实在代码开荒相应简洁,
    和劳作流引擎解耦, 即实际的开 发职员在不打听专门的学问流引擎具体做事原理的处境下得以展开高效的耗费, 并
    只需求关心具体 的专业必要

6.2 流程状态

betway88必威 10

6.2 流程状态

betway88必威 11

为了缓和#1的难点,
则须要定义出流程–步骤—业务(乞求类型)—管理人/组 的配置 关系,
并在流程流转时自动安装, 实际不是在工艺流程描述文件 (bpmn)里 钦点

6.3 流程跟踪

图片格局呈现当前节点:

betway88必威 12

列表格局显得流程流转进程:

betway88必威 13

6.3 流程追踪

图片格局展示当前节点:

betway88必威 14

列表格局体现流程流转进度:

betway88必威 15

为了消除 #2 的主题材料,
则供给用服务开展打包, 抽象出一些接口以及基类的实 现, 并
应用有的常见的设计方式(工厂情势)和java的性状(反射).

6.3.1 当前节点定位JS

Java代码请移步:

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

代码移步:

6.3.1 当前节点定位JS

Java代码请移步:

Javascript思路:先经过Ajax获取当前节点的坐标,在钦定地方加多鲜绿边框,然后加载图片。

代码移步:

下图为主导的架构划虚构计

7.开启Logger

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

7.开启Logger

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

betway88必威 16

8.结束

前边就想写那篇小说,今后好不轻易完毕了,费用了多少个时辰,希望能节约你几天的日子。

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

来自:

8.结束

前边就想写那篇文章,未来终究实现了,费用了几个时辰,希望能节约你几天的时间。

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

若果有啥样难题依旧对于作用的达成有更加好的措施应接提议、分享。

听新闻说那样的框架变成基础代码后,
最后对于三个兑现具体育赛职业的开垦职员来讲, 其达成四个业务流程代码主要归纳:

9.动态钦命职责办理人

  1. 兑现多少个创立Request的页面,
    用于录入工作数据

  2. 福寿无疆四个Request详细页面, 用于显示实际情况,
    包罗操作历史, 和作业操作开关

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


3.
落成该工作涉及的具体步骤的操作processor类(如审查批准或和任何系统接入,
实现实际的业务),

9.2 自动安装职务办理人

上面包车型客车代码是应用initiator成效,设置一个名号(不是变量而是变量名)到运营事件上,並且在开发银行流程时调用一些下边包车型地铁办法:

?

1
identityService.setAuthenticatedUserId(currentUserId);

个中currentUserId表示方今顾客,也正是开行流程的人,配置如下所示:

?

1
2
<startevent
id
="startevent1"
name
="Start"
activiti:initiator
="applyUserId"></startevent>
<usertask
id
="reportBack"
name
="销假"
activiti:assignee
="${applyUserId}"></usertask>

如此流程运转以后就算职分流转至”销假”节点则会自动把职务分配给运转流程的人。

  1. 将流程涉及的processor和相应的业务类型,
    流程名, 流程步骤进行挂号绑定

9.3 获取流程发起人

借使在起步流程的时候调用了上面包车型大巴代码:

?

1
identityService.setAuthenticatedUserId(currentUserId);

引擎会记录启使人陶醉,即在ACT_HI_PROINST表的START_USER_ID字段,可以透过下边包车型客车代码获取。

?

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

产生历程

10. 职责代办

多三个人问“Owner”属性为啥是空的,什么日期用?要询问它的功用首先要掌握“代办”。

代办的概念能够用下边包车型大巴一句话归纳:

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

总的来看那几个单元测量检验你就掌握什么是代办:ProcessTestDelegateTask

最好把activiti-study本条项目下载下来导入到Eclipse中运营一下:

原创文章,转发请证明:转载自:干活流引擎Activiti使用计算

正如下面曾聊到, 对于三个种类规划, 不恐怕一步到位,
在先前时代时要掀起最亟需消除的标题, 例如在这么些连串开头阶段,
最基本的希图包涵:

➤ 数据库设计 和RequestService对底层数据操作的包裹

➤ WorkflowService对职业流引擎的卷入

➤可配置化的基于业务连串(Request Type)
和配置(process_cfg)在运维时动态设置流程相应的处理人/组

穿梭的重构包蕴:

➤将各类管理类(业务管理类, 流程管理人/组分配处理类, 公告管理类)
通过RegisterService的群集登记管理,
而且协理选择对于特定的流程完成特定的拍卖类来代替暗中认可的拍卖类

➤RequestQuery协助统一的询问入口对业务流程数据进行查询

➤ 依照职业须求提供ASync的processor管理基类, 因为实在利用中窥见,
一些业务的拍卖(如批量)须要一段时间的实行工夫完结,
而异步管理基类则成功基础达成, 并由相应子类去得以实现虚函数就可以.

公共化职业流模块:

➤ 近来, 其余一个品类其应用到的现象和那几个种类有类似之处,
其独立于该业务管理平台. 在这种情景下, 将该职业流相关的模块进行公共化,
以JA本田CR-V包的花样提供, 使得别的贰个系统的费用能够短时间内完成平等的功力

借鉴Activiti的源代码

在设计和完成该系列时会有

这么也许那样的嫌疑也许斗争,

哪种实现越来越好?

外人的系统是怎么样贯彻的?

此处举多少个例子

Property表里是或不是供给须求用差异的字段(LONG_VALUE,
TEXT_VALUE, DOUBLE_VALUE等)存差别品种的值;照旧直接都存成字符串,
在代码中再依附供给转成Long, Double等?当然三种达成都以一蹴而就的,
并且各有优短处,
并且个人感到存在分歧的字段上亮点越来越大片段(首要反映在询问功效),
可是怎么进一步的让协和信服?
在看activiti的文档时发现外界的事体数据以Map的主意存在activiti的数据库中,
那么activiti的设计者一样会超过一样的难点.
通过查看源代码以及其数据库设计, 开采其将数据存入差异的字段.
不过在自家的规划中, 作者并不曾完全照搬Activiti的处理格局, 举个例子:
笔者一贯不为布尔类型加单独的字段,
而是以0可能1的方法存入LONG_VALUE里。

Activiti中提供便利的查询类, 如: ProcessInstanceQuery, TaskQuery.
其同期协理根据Process和Task相应的属性数据进行查询,
和Request/Snapshot以及property有极大的相似之处,
借鉴并根据实况达成本身的RequestQuery类, 匡助各样复杂查询, 如:
依照钦赐的property的name和value查询, 扶助or的查询等。

Activiti的数据库版本的活动晋级. 当大家进级activiti的本鸡时,
其实我们只供给更新JA翼虎的版本号, 而不用关爱起底层数据库是或不是需求晋级,
activiti在其表中会记录数据库scheme的版本号,
运行时会活动剖断并基于须求自动更新数据库. 那也是充足值得借鉴的地点,
特别是当这么些模块被八个种类所采纳时。

betway88必威 17归来今日头条,查看越来越多

主要编辑:

发表评论

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

相关文章