工作流-策略

工作流策略主要作用是流程节点的参与者的选取. (说白了就是流程策略执行完后选出来的流程节点的待处理人是张三/李四/王五….);

策略的使用


平台内置的工作流策略

在流程的流转过程中参与者的选择策略.平台内置常用的流程策略类分别是:

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