前言

本工作流引擎采用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  创建时间:2022-12-05 17:01
最后编辑:admin  更新时间:2024-04-26 09:11