工作流-策略
工作流策略主要作用是流程节点的参与者的选取. (说白了就是流程策略执行完后选出来的流程节点的待处理人是张三/李四/王五….);
策略的使用
平台内置的工作流策略
在流程的流转过程中参与者的选择策略.平台内置常用的流程策略类分别是:
ConfirmByDepartLeaderListenerCreateImpl
- 说明: 组织树逐级选取人员每级处理人策略;获取上级部门的各种角色的人 如果部门没有对应的角色就直接顺这树往上爬.直到爬到机构树顶为止
- 参数: condition 可以是 sql语句 where 之后的部分.可以是以下字段 ORGID,USERID,USERNAME,DEPTID,DEPTCODE,ROLEID,ROLECODE,ROLENAME
{ "name": "每级的部门领导", "class": "com.kdayun.z1.core.workflow.listerner.usertask.ConfirmByDepartLeaderListenerCreateImpl", "params": [ { "name": "condition", "value": " ROLECODE = '002' " } ] }
CopyToListernerImpl
- 说明: 抄送策略 .抄送是指只允许看任务不允许操作提交审核任务
- 参数: condition 可以是 sql语句 where 之后的部分.可以是以下字段 ORGID,USERID,USERNAME,DEPTID,DEPTCODE,ROLEID,ROLECODE,ROLENAME
{ "name": "抄送给指定人", "class": "com.kdayun.z1.core.workflow.listerner.usertask.CopyToListernerImpl", "params": [ { "name": "condition", "value": " ROLECODE = '014' " } ] }
CurrentUserToAssigned 选择当前用户为参与者策略
- 说明: 选择当前用户为参与者策略
- 参数: (无)
{ "name": "选择当前用户为参与者策略", "class": "com.kdayun.z1.core.workflow.listerner.usertask.CurrentUserToAssigned", "params": [] }
DepartPersonListernerImpl
- 说明: 获取本部门的人员策略
- 参数: condition 可以是 sql语句 where 之后的部分.可以是以下字段 USERID,USERNAME,DEPTCODE,ROLEID,ROLECODE,ROLENAME
{ "name": "本部门资产管理员或部门领导", "class": "com.kdayun.z1.core.workflow.listerner.usertask.DepartPersonListernerImpl", "params": [ { "name": "condition", "value": "ROLECODE in('003','002')" } ] }
OrgPersonListenerImpl
- 说明: 取本机构的参与者策略
- 参数: condition 可以是 sql语句 where 之后的部分.可以是以下字段 USERID,USERNAME,DEPTID,DEPTCODE,ROLEID,ROLECODE,ROLENAME
{ "name": "本单位领导", "class": "com.kdayun.z1.core.workflow.listerner.usertask.OrgPersonListenerImpl", "params": [ { "name": "condition", "value": "ROLECODE='100'" } ] }
OrgUpPersonListenerImpl
- 说明: 当前机构的上级机构选取人员角色策略,如果上级无无法获取到指定条件的参与人员.会提示: 节点[xxxx]无法找到对应的流程参与者
- 参数: condition 可以是 sql语句 where 之后的部分.可以是以下字段 USERID,USERNAME,DEPTID,DEPTCODE,ROLEID,ROLECODE,ROLENAME
{ "name": "上级单位分管领导", "class": "com.kdayun.z1.core.workflow.listerner.usertask.OrgUpPersonListenerImpl", "params": [ { "name": "condition", "value": "ROLECODE='002'" } ] }
PersonListenerImpl
- 说明: 选取机构部门角色的参与者策略
- 参数: condition 可以是 sql语句 where 之后的部分.可以是以下字段 ORGID,USERID,USERNAME,DEPTID,DEPTCODE,ROLEID,ROLECODE,ROLENAME
{ "name": "上级单位分管领导", "class": "com.kdayun.z1.core.workflow.listerner.usertask.PersonListenerImpl", "params": [ { "name": "condition", "value": " ROLECODE='002'" } ] }
PersonRoleDeptListenerImpl
- 说明: 流程提交时候指定的人策略
- 参数: condition 可以格式:(‘fwUserId1’,’fwUserId2’…); fwUserId的格式是: ORGID+”“+DEPRID+”“+ROLEID+”_”+USERID
{ "name": "上级单位分管领导", "class": "com.kdayun.z1.core.workflow.listerner.usertask.PersonRoleDeptListenerImpl", "params": [ { "name": "condition", "value": "('6ABD3B0AC59244108AA6D43D8CC30BCC_0FEFB244297649449D17E5F11A3551E7_0A41F3CC41B74722AD85FE78D4243B21_282C2F9CEA854A32AE8C9D3FCA7FF80B','9C876276D8884BFF94DF343E2A4EED7D__E555C6219EAD42A69C7DD216528B3F28_33CE0962586841F9A477020CA6FCFFED')" } ] }
SelectPersonListenerImpl 筛选人员策略
- 说明: 筛选人员策略
- 参数: condition 可以是 sql语句 where 之后的部分.可以是以下字段 ORGID,USERID,USERNAME,DEPTID,DEPTCODE,ROLEID,ROLECODE,ROLENAME
{ "name": "上级单位分管领导", "class": "com.kdayun.z1.core.workflow.listerner.usertask.SelectPersonListenerImpl", "params": [ { "name": "condition", "value": " ROLECODE='002' " } ] }
SqlImpl
- 说明: 通过执行sql返回的参与者策略
- 参数: sql 货物fwUserid 的sql语句
SELECT CONCAT(A.ORGID , '_' ,IFNULL(B.DEPTID,'') , '_' , B.ROLEID , '_' , B.USERID) FROM CORE_USER A INNER JOIN CORE_USERDEPT B ON A.RWID = B.USERID INNER JOIN CORE_ROLE C ON C.RWID = B.ROLEID WHERE C.OBJCODE = '002' AND A.ORGID = #{orgid}
{
"name": "发起者策略",
"class": "com.kdayun.z1.core.workflow.listerner.usertask.SqlImpl",
"sql": " SELECT CONCAT(A.ORGID , '_' ,IFNULL(B.DEPTID,'') , '_' , B.ROLEID , '_' , B.USERID) FROM CORE_USER A INNER JOIN CORE_USERDEPT B ON A.RWID = B.USERID INNER JOIN CORE_ROLE C ON C.RWID = B.ROLEID WHERE C.OBJCODE = '002' AND A.ORGID = #{orgid}"
}
StartUserToAssigned
- 说明: 选择发起者为参与者策略 (选择当前登录用户作为参与者)
- 参数 : 无
{ "name": "发起者策略", "class": "com.kdayun.z1.core.workflow.listerner.usertask.StartUserToAssigned", "params": [] }
UserDefListenerImpl
- 说明: 用户自定义选人策略.通过cxt中key:users获取用户信息,类型为String[]. 本策略主要用于在提交流程时候选择下一个节点的参与者
策略内使用#{}变量来实现动态筛选
需要版本: 5.0.233 以上版本
如:
{
"name": "上级单位分管领导",
"class": "com.kdayun.z1.core.workflow.listerner.usertask.SelectPersonListenerImpl",
"params": [
{
"name": "condition",
"value": " ROLECODE='002' AND ORGID = #{orgid} and DEPTID =#{deptid}"
}
]
}
具体变量参考: 工作流-介绍-常用流程参数
自定义流程策略
- 自定义流程策略可以通过后台二开工程内继承 TaskListenerBase来实现流程策略的自定义
例子:
OrgPersonListenerImpl.java
package com.kdayun.z1.core.workflow.listerner.usertask;
import java.sql.SQLException;
import java.util.List;
import com.kdayun.workflow.engine.ActivitiException;
import com.kdayun.workflow.engine.delegate.DelegateTask;
import com.kdayun.z1.core.context.Context;
import com.kdayun.z1.core.security.service.CoreOrgService;
import com.kdayun.z1.core.workflow.listerner.TaskListenerBase;
import com.kdayun.z1.core.workflow.listerner.WfContext;
import com.kdayun.z1.core.workflow.util.WorkFlowConst;
/**
* 取本机构的参与者策略
*
* @author gk @date 2017-4-24 下午4:31:37
*/
public class OrgPersonListenerImpl extends TaskListenerBase {
public static final String DESC = "[普通任务]-取本机构的参与者策略";
public static final String HELP = "参数 condition 可以是 sql语句 where 之后的那部分.可以是以下字段 USERID,USERNAME,DEPTID,DEPTCODE,ROLEID,ROLECODE,ROLENAME 例如: deptid='A' and roleid='c'";
private static final long serialVersionUID = 1L;
private com.kdayun.workflow.engine.impl.el.FixedValue condition;
public com.kdayun.workflow.engine.impl.el.FixedValue getCondition() {
return condition;
}
public void setCondition(com.kdayun.workflow.engine.impl.el.FixedValue condition) {
this.condition = condition;
}
@Override
public void doTaskListener(DelegateTask delegateTask, WfContext<String, Object> cxt) {
CoreOrgService service = Context.getApplicationContext().getBean(com.kdayun.z1.core.security.service.impl.CoreOrgServiceImpl.class);
List<String> users = null;
try {
String orgid = (String) cxt.get(WorkFlowConst.KEY_CURRENT_ORG_ID);
String con = "and orgid='" + orgid + "' and " + condition.getExpressionText();
for (String key : cxt.keySet()) {
String varname = "#{" + key + "}";
if (con.contains(varname)) {
con = con.replaceAll("#\\{" + key + "\\}", (String) cxt.get(key));
}
}
users = service.getUsers(con);
if (users.size() > 1) {
delegateTask.addCandidateUsers(users);
} else if (users.size() == 1) {
delegateTask.setAssignee(users.get(0));
} else {
throw new ActivitiException("节点[" + delegateTask.getName() + "]无法找到对应的流程参与者");
}
} catch (SQLException e) {
throw new ActivitiException("节点[" + delegateTask.getName() + "]查询流程参与者错误:" + e.getMessage());
}
}
}
注意
fwUserid 是一个流程的唯一id
- 工作流的引擎对于用户ID的使用的是fwUserid 而不是userid. 格式: 机构ID_部门ID_角色ID_用户ID.
- 策略条件的字段名:
- ORGID 机构id
- USERID 用户id
- USERNAME 用户账号名
- USERCODE 用户编号
- DEPTID 部门id
- DEPTCODE 部门编号
- ROLEID 角色id
- ROLECODE 角色编号
- ROLENAME 角色名称
参考
作者:admin 创建时间:2022-12-05 17:01
最后编辑:admin 更新时间:2024-10-17 08:28
最后编辑:admin 更新时间:2024-10-17 08:28