前言
本工作流引擎采用Activiti业务流程管理(BPM)开源项目, Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术实现。Activiti是一个独立运作和经营的开源项目,并将独立于 Alfresco开源ECM系统运行。 Activiti将是一种轻量级,可嵌入的BPM引擎,而且还设计适用于可扩展的云架构。 Activiti将提供宽松的Apache许可2.0,以便这个项目可以广泛被使用,同时促进Activiti BPM引擎和BPMN 2.0的匹配,该项目现正由OMG通过标准审定。 加入Alfresco Activiti项目的是VMware的SpringSource分支,Alfresco的计划把该项目提交给Apache基础架构,希望吸引更多方面的 BPM专家和促进BPM的创新.
流程设计器在开源的Activiti Modeler的基础上改进出来的.支持的浏览器有火狐,Chrome,qq浏览器,360 浏览器 . 注意不支持IE浏览器.
流程元素
开始/结束
一个工作流必须存在开始和结束两节点,才能算一个完整的流程.
用户任务(userTask)
用户任务(UserTask)即用户操作的任务(可以是审核) 通过参与人策略设置来新增相应的策略,其中策略类型有特定人、策略模板、自定义、会签
选择好相应的策略类型,并选择相应的的处理策略才能完成对用户任务设置
连线
假如我们对流程有规定,如果事件不重要,流程直接由部门经理审批结束;如果事件重要,部门经理审批之后,还有有总经理进行审批之后才可以结束。那么我们就可以这样这设置我们的连线,首先得选中我们要设置的连线:连线的表达式是采用JUEL表达式.用于判断条件是否成立.
例如:
${cxt.get(‘confirm’)==0 or cxt.get(‘confirm’)==4 }
当审核状态 confirm等于0或4时返回true 如果在直线上设置该表达式.只有返回true时工作流就会顺着该线条执行
排他网关
多个连线分支的情况,我们可以使用排他网管来解决。只要流程进入排他网关只有一条路可以走出来,否则会报错
通过设置连线的各个条件达到对应的节点.
并行网关
如果一个流程需要同时分裂出多条流程时候可以是用平行网关, 工作流进入平行网关后可以分裂出多条执行流
全局参数
cxt 流程全局上下文参数
流程的所有变量和函数都是通过以下方式访问:
cxt.get("start_userid")
cxt.get("start_deptid")
cxt.get("start_rolecode")
常用的参数标识
start_userid 流程的发起者
start_roleid 流程的发起者角色id
start_deptid 流程的发起者部门id
start_orgid 流程的发起者的发机构id
start_orgcode 流程的发起者的发机构预算代码
start_deptcode 流程的发起者的部门编号
start_rolecode 流程的发起者的角色编号
start_usercode 流程的发起者的用户账户
userid 当前使用人id
roleid 当前角色id
deptid 当前部门id
orgid 当前机构id
orgcode 当前机构编号
deptcode 当前部门编号
rolecode 当前角色编号
usercode 当前用户编号
审批结果 confirm的审批常量取值:
0 : 退回
1 : 提交/送审
2 : 不同意
3 : 同意
4 : 取回
5 : 完成
6 : 开始
7 : 部分同意
8 : 待处理
9 : 原路退回
注意: 以上的的审批常量对应平台的相应的流程操作.如果业务需要传递业务状态必须最好是大于 20 以上(0~20)平台预留审批常量
常用函数
/**
* 是否存在上级部门的某个条件的人
*
* @param deptid 部门rwid
* @param condition
* 上级领导和机构管理员例如 "rolecode in('001','002')";
* @return
* @throws SQLException
*/
boolean hasUpUserByContidion(String deptId, String condition);
例子:
cxt.hasUpUserByContidion(cxt.get("deptId"),"rolecode in('001','002')")
获取部门cxt.get(“deptId”) 的上级部门是否存在 001,002 角色
/**
* 是否存在上级角色
*
* @param deptid 部门rwid
* @param condition 上级领导和机构管理员例如 ;
* @return 存在返回 true 否则 false
* @throws SQLException
*/
boolean hasUpRole(String deptId, String rolecode);
例子:
cxt.hasUpRole(cxt.get("deptId"),"001")
获取部门deptId的上级部门是否存在 001角色
/**
* 当前部门是否存在上级角色
*
* @param deptid 部门rwid
* @param condition 上级领导和机构管理员例如 ;
* @return 存在返回 true 否则 false
* @throws SQLException
*/
boolean hasUpRoleCurrDept(String rolecode);
例子:
cxt.hasUpRole("001")
当前部门是否存在上级角色
/**
* 本部门是否存在某角色
*
* @param deptid 部门rwid
* @param rolecode 角色编号
* @return 存在返回 true 否则 false
* @throws SQLException
*/
boolean hasRoleInDept(String deptId, String rolecode);
例子:
cxt.hasRoleInDept(cxt.get("deptId"),"001")
获取deptId部门的是否存在 001角色
/**
* 当前部门是否存在某角色
*
* @param deptId 部门rwid
* @param rolecode 角色编号
* @return 存在返回 true 否则 false
* @throws SQLException
*/
boolean hasRoleCurrDept(String rolecode);
例子:
cxt.hasRoleCurrDept("001")
获取当前部门的是否存在 001角色
/**
* 机构内是否存在某某角色
*
* @param orgId 机构rwid
* @param roleCode 角色编号
* @return 存在返回 true 否则 false
* @throws SQLException
*/
boolean hasRoleInOrg(String orgId, String roleCode);
例子:
cxt.hasRoleInOrg("001")
获取orgId机构的是否存在 001角色
/**
* 当前机构内是否存在某角色
*
* @param roleCode 角色编号
* @return 存在返回 true 否则 false
* @throws SQLException
*/
boolean hasRoleInCurrOrg(String roleCode);
例子:
cxt.hasRoleInCurrOrg("001")
当前机构内是否存在001角色
/**
* 是否存在本部门的某条件的人
*
* @param deptid 部门rwid
* @param condition sql条件字符串
* @return 存在返回 true 否则 false
* @throws SQLException
*/
boolean hasUserByCondition(String deptId, String condition);
例子:
cxt.hasRoleCurrDept("001")
当前机构内是否存在001角色
/**
* 通过sql语句返回的第一个列的值
*
* @param sql sql语句
* @return 非零返回true 否则 返回false
*/
boolean sql(String sql);
例子:
cxt.sql("SELECT * FROM CORE_USER WHERE RWID=#{userid}")
通过sql语句返回的第一个列的值
注意:不管你有多少列返回,只取第一列
/**
* 通过sql语句,达到更新数据库 一直会返回true
*
* @param sql sql语句
* @return 成功执行true 否则抛出错误
*/
boolean sqlNoResult(String sql);
例子:
cxt.sqlNoResult("UPDATE BS_AST_CHUZMX SET CHUZZT=0 WHERE RWID=#{chuzmxid}")
通过sql语句执行更新数据库
/**
* 执行命令行 注意linux与window的命令行区别,其中一些命令对/ 与 \的区别 都有限制
*
* @param cmd 命令字符串
* @param charSet 字符集 "GBK" ,"UTF-8"
* @param timeOut 超时时间 秒
* @return 成功返回true
* @throws Exception return 执行成功返回true 否则有问题会抛出异常
*/
cxt.exeCmd(String cmd, String charSet, Integer timeOut) throws Exception
例子:
cxt.exeCmd("copy d:\\1\\*.* d:\\1\\123","GBK",30)
执行cmd命令 30秒没执行完算失败.
/**
* 执行命令行 注意linux与window的命令行区别,其中一些命令对/ 与 \的区别 都有限制
*
* @param cmd 命令字符串
* @param path 在命令行的path变量内增加路径
* @param dir 命令的目录
* @param charSet 字符集 "GBK" ,"UTF-8"
* @param timeOut 超时时间 秒
* @return 成功返回true
* @throws Exception return 执行成功返回true 否则有问题会抛出异常
*/
cxt.exeCmd(String cmd, String path, String dir, String charSet, Integer timeOut) throws Exception
例子:
cxt.exeCmd("copy d:\\1\\*.* d:\\1\\123","d:/","e:/","GBK",30)
执行cmd命令 30秒没执行完算失败.
/**
* 执行命令行 注意linux与window的命令行区别,其中一些命令对/ 与 \的区别 都有限制
* @param cmd 命令字符串
* @return 成功返回true
* @throws Exception return 执行成功返回true 否则有问题会抛出异常
*/
cxt.exeCmd(String cmd) throws Exception
例子:
``` java
cxt.exeCmd("copy d:\1\*.* d:\1\123")
执行cmd命令.编码GBK 30秒没执行完算失败.
/**
* 得到一个全球唯一ID
*
* @return 得到一个全球唯一ID字符串
*/
cxt.getUUID()
/**
* 根据特定条件抄送
* @param condition 抄送的用户选择条件
*/
cxt.copyTo( String condition)
/**
* 得到bean对象
* @param condition bean名称
*/
cxt.getBean(String beanName)
最后编辑:admin 更新时间:2024-10-17 08:28