一、定义
工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。解决的主要问题是:为了实现某个业务目标,利用计算机在多个参与者之间按某种预定规则自动传递文档、信息或者任务。
二、作用
1、企业太大时,做一件事情需要多个部门、多个人一起去合作完成,随着人员的流动,可能没有人能了解所有的流程细节,这时使用工作流来自动化的连接不同的部门和人员,简单的东西可以自动由程序来完成,每个具体的人只需要关注自己的一个工作就可以了。(流程能固化和自动化,流程是企业积累的重要资产,之前是积累到具体的人,而不是企业)
2、确定每个人的权限和责任,保证事事有人做,人人有事做(管理上更高效,减少扯皮的事情,企业最大的消耗是所谓的沟通和开会)
3、监控过程(每次修改,每个人的产出,所有的数据,流程都有记录),可以控制人员、设备、数据等方面的风险
4、减少沟通、开会成本。减少部门间,个人间扯皮的成本
三、Business Process Modeling Notation,
1、业务流程建模与标注,包括这些图元如何组合成一个业务流程图(Business Process Diagram),是iso标准。BPMN的主要目标就是要提供被所有业务用户理解的一套标记语言,包括业务分析者、软件开发者以及业务管理者与监察者。BPMN还将支持生成可执行的BPEL4WS语言。所以,BPMN在业务流程设计与流程实现之间搭建了一条标准化的桥梁。
BPMN定义了业务流程图,其基于流程图技术,同时为创建业务流程操作的图形化模型进行了裁减。业务流程的模型就是图形化对象的网图,包括活动(也可以说工作)和定义操作顺序的流控制。
2、底层数据格式是xml。定义了一些标签的标准含义和图形表示。一方面通过图形方便所有人理解流程,另一方面限制实现方必须按着流程的要求来实现。
3、Pool:参与方,比如亚马逊公司,内部包括lane。
Lane:pool的细化,比如亚马逊内部的部门,可以嵌套
Event:用一个圆圈表示,它是流程运行过程中发生的事情。事件的发生会影响到流程的流转.事件包含Start\Intermediate\End三种类型
Activities 活动,圆角矩形,分为task, sub-process
userTask:人工操作 serviceTask:程序自动操作 mannultask:线下操作,比如发快递;callactivity,调用别的子流程
Gateway,网关,菱形,用来表示流程的分支和聚合
前后顺序,带箭头的实线。
4、排他网关(中间是×):只会走一个出的方向(xor)
并行网关(中间是+)进入时等待所有的都到达,出去时多个分支同时走(and)
包容网关(中间是圈) 允许多个分支
与uml的区别
uml:oop,面向设计和实现
bpmn:面向流程,是更高层面的操作,重点是不同部门,不同人之间的交互
与程序流程图的区别
流程图:面向指令或控制语句的粒度,属于程序逻辑实现的层面
工作流:面向一个任务,可能对应了软件里的一个系统。一般情况下,一个人就可以搞定的任务,都属于一个工作流节点,必须要换人操作时(比如需要经理的权限,需要跨部门,需要交叉复核),就必须要切分成多个工作流节点
四、Camunda
1、Camunda BPM 是一个灵活的工作流和过程自动化框架,它的核心是一个在Java虚拟机内部运行的原生BPMN2.0流程引擎,因此它可以嵌入到任何Java应用程序或运行时容器中。
2、提供的功能
流程实现和执行组件:camunda engine(负责执行BPMN 2.0流程)、REST API
流程设计组件:camunda modeler
流程操作组件(engine级别的管理后台):camunda engine、camunda cockpit
任务管理组件:camunda tasklist
前端组件:formsdk.js
五、基本概念
ProcessEngine:整个流程引擎
Multi-Tenancy:多个子公司之间的数据隔离
静态部分:
Process Definitions 流程定义,对应一个BPMN xml,内部映射为一个图结构
Keys and Versionskey是id,相同key多次提交是不同version
Suspend Process Definitions 暂时挂起,不允许执行
Process Instances 一次执行,有中断状态时,会存库,用户操作后状态往后走
Activity 一个活动(process的下一级),包括task和subprocess
Task 需要用户或系统操作的任务
runtime动态部分:
Variables 输入输出的数据
Executions执行的路径(可能是并行的流程中的一个,也可能是子流程),可以表达一个变量的范围
token state :整个执行的过程是token传递的过程
job具体调度的内容,execution的下一层,实际做的事情由jobHandler确定
核心服务
RepositoryService 存储流程定义
RuntimeService 管理运行实例,用事件来trigger流程往后走
TaskService人员需要处理的任务
IdentityService 身份验证
FormService 前端接口
HistoryService 历史数据的统处理
ManagementService 数据库操作
FilterService 筛选
ExternalTaskService 外部任务
六、开发环境
jdk + maven + tomcat + camunda + camunda modeler + eclipse
camunda引擎使用和工作流开发方式
整个环境是 java web 程序
camunda内嵌入web 容器中
预先发布restapi、admin、cockpit、tasklist等web app
每个新的流程定义一个app,并发布,内部可以实现与tasklist的交互,比如每一个usertask的form界面
mvn clean tomcat7:redeploy或mvn clean tomcat7:deploy
七、工作流程
可视化编辑bpmn(业务人员和技术人员合作)
扩展bpmn,包括添加逻辑变量、设置类型、添加表单、代码逻辑等
编写后端代码(java)并做相应配置
前端编写js和html,来处理逻辑
部署到tomcat和camunda中进行调度
根据runtime的调度来修改bug,返回到第三步,一直迭代到没有bug
八、坑
别人给过来的bpmn有各种问题,需要仔细检查,有可能有严重的逻辑错误
java代码中修改 process id,不然发布不成功
设置和修改id ,isExecutable设为true
所有分支设置default
所有非默认分支都需要添加条件
简单验证可以添加多个formfield,后面可以直接在变量里引用
内嵌中文的form 存储时存成utf-8, <html lang="zh-cmn-Hans">
js脚本中添加 debugger; 可以添加断点来调试(chrome)
INOUT映射:外部的variable与delegate内部的变量之间的名字映射
九、引擎内部实现
org.camunda.bpm.engine.impl.persistence.entity对应各个表的数据结构
org.camunda.bpm.engine.impl.db.sql.DbSqlSession 用于真正的进行sql操作
使用mybatis进行持久化
1、表模式缩写:
PROC:process
INST:instance
DEF:definition
RU:runtime
RE:repository
HI:history
GE:general
2、核心表概览:
ACT_ID_GROUP 组
ACT_ID_USER 账号
ACT_ID_MEMBERSHIP 归属关系
ACT_RU_AUTHORIZATION 资源、服务与账户、组之间的对应关系
ACT_GE_PROPERTY 系统运行时属性
ACT_GE_BYTEARRAY 字节数据
ACT_RE_DEPLOYMENT发布
ACT_RU_EXECUTION执行路径
ACT_RU_JOBruntime一个调度的单位
ACT_RU_JOBDEF 作业定义
ACT_RE_PROCDEF 流程定义,区分版本
ACT_RU_TASK一个工作流中的任务
ACT_RU_VARIABLE workflow中跨越节点的数据
ACT_RU_METER_LOG作业调度中的详细日志
ACT_HI_PROCINST 流程实例
ACT_HI_ACTINST活动实例
ACT_HI_TASKINST任务实例
ACT_HI_VARINST 变量实例
ACT_HI_DETAIL 变量的详细信息,比如a proc下,有个a1 act,之下有个a11 task,之下有个a111变量,这个变量和ACT_GE_BYTEARRAY的对应关系,类型等信息
ACT_HI_COMMENT 对某个task的评论
ACT_HI_OP_LOG 详细操作日志,比如某个人接了某个任务
3、前端
基于 "angular","jquery",实现了"camunda-commons-ui","camunda-bpm-sdk-js","angular-data-depend",方便进行模块化的ui开发。
camunda-bpm-sdk中提供CamSDK CamSDK.Client taskService(list, form)等封装
十、admin默认账号 demo/demo
act_ru_authorization
`REV_` 一直是1
`TYPE_` allow deny global(允许所有人) 这时user_id是*
`GROUP_ID_` 、`USER_ID_` 一般只会设置一个
`RESOURCE_TYPE_` 流程定义、流程实例、任务、组相关、账户授权 等各种类型
`RESOURCE_ID_` 具体的内容
`PERMS_` 权限,读。写。更新 创建等