自定义执行人函数
实现目标
不局限于vbase提供的执行人函数以及简单的机构岗位选择流程活动环节执行人,提供自定义执行人函数扩展点EP实现每个用户流程运行时不同的选执行人需求。
EP总体概述
后台构件方法扩展点EP_WorkFlowCustomExecutorFunction(流程自定义函数):任务提交选择下一步审批人员时会调用这个EP,然后运行其中的配置,这个EP的就是为了获取下一步执行人实体。
方法输入实体的作用:
CustomParam(自定义参数):第一,接收搭配的窗体传过来的值;第二,作为活动集参数传递的值来源
VariableEntity(流程变量数据):运行时获取所有的流程变量值,用户可通过规则只获取需要使用的那条数据
Selectmode(执行人模式):流程选择下一步执行人的时候有两种显示模式,一种是列表(list),一种是树(tree),根据不同的模式用不同的方式查询显示人员,
此处用来作为判断条件执行不同的API查询人员
(注:以下实体在执行人选择界面,如果切换审批人列表页签到审批人树页签,会增加一条id不同但数据相同的记录)
Task(流程任务信息):上一个活动节点的所有任务信息
Activity(活动定义信息):本步活动定义信息
Execution(活动实例信息):活动实例详细信息,包括来源活动、目标活动
ProcessDefinition(流程定义信息):任务提交就能获取流程定义的数据(如果上一步是开始节点,点击流程启动获取数据)
ProcessInstance(流程实例信息):开始节点完成后才能生成数据
如果要搭配窗体使用,窗体与EP_WorkFlowCustomExecutorFunction的数据传递是通过EP_GetCustomExecutorFuncSettingConfig(获取自定义执行人函数中配置窗体数据)、
EP_SetCustomExecutorFuncSettingConfig(还原自定义执行人函数中配置窗体数据)两个扩展点的方法输出实体CustomParam,窗体传给它什么值,EP_WorkFlowCustomExecutorFunction就接收什么值。
(注:如果value值为空,那么过滤掉,如果value值有而key值为空,也会传到构件方法输入,带窗体必须实现这两个EP)。
另一个方法输入CustomExecutionUnitSettingShow在获取EP中用来保存输入的值,在还原EP中用来实现再次打开执行人函数设置人员的时候还原数据。
场景
配合窗体的使用,获取登录用户的直接上级或直属上级进行审批。
步骤
第一步,在需要实现自定义执行人函数的构件下增加引用(vbase_workflow_api以及vbase_organization),其中流程管理API构件实现自定义函数扩展点,组织机构实现人员的查询。
然后,新建一个普通窗体,这个窗体用来维护机构人员关系,定义哪个机构下的人员由谁审批,只用来新增修改保存数据,其它不做操作。例如:这里新建一个审批人员列表
(也可以做成树表的上下级形式,数据也可以通过查询获取,看业务需求),保存机构直接上级和直属上级的关系。
之后通过流程变量获取当前登录用户所在机构id,然后查询出这张表匹配的机构id的那一条记录。
此处自定义机构的审批人员以及vbase的机构人员为:
第二步,再新建一个普通窗体,这个窗体是绑定在自定义执行人函数用来选择直接上级还是直属上级进行下一步活动的审批,这里是定义期的选择人员,不返回实际人员实体。
例如:这里新建一个自定义选择人界面,绑定实体VariableEntity,如果输入direct就返回直接上级的id及姓名,如果输入belong就返回直属上级的id及姓名。
实现:在这个界面上要实现两个EP,将界面上的流程变量值通过方法输出传回给流程自定义执行人函数EP。
EP_GetCustomExecutorFuncSettingConfig(获取自定义执行人函数中配置窗体数据):获取界面上的值传给方法输出
(显示设置的提示信息规则是为了查看数据是否传值成功,实际业务可不管)。
其中,新增实体记录规则配置内容为,将控件的值传给CustomParam实体,流程自定义函数的同名方法输入会接收到这条数据:
将实体的值序列化赋值给CustomExecutionUnitSettingShow,所以给界面实体/控件/变量赋值规则配置内容为:
EP_SetCustomExecutorFuncSettingConfig(还原自定义执行人函数中配置窗体数据):再次进入执行人选择界面的时候,会加载之前填写的数据,先判断CustomExecutionUnitSettingShow是否为空。
如果不为空的话,将这个还原成实体VariableEntity,执行函数/表达式配置内容为:
第三步,在构件方法那里实现自定义执行人函数EP,注意这里是运行期,在这里实现选择实际执行人的逻辑。
在这里获取运行时的流程变量(注意:获取的是全部的流程变量,值是长文本类型),取出你需要的那一条数据.
此处用一个规则GetConditionColumnValue(根据条件查询指定数据源中某个字段的值)获取流程变量org的值
这里新建一个方法变量来接收登录用户的机构id,给这个变量赋值(流程变量org的绑定见第四步)。
先判断从窗体传过来的方法输入实体CustomParam的value是direct还是belong,(如果不是输入符合条件的值就中断操作)
然后将CustomParam实体的值清除,从数据库里获取相应的人员实体赋值给它。
这里以belong为例(二级名称字段代表直属上级)。
然后再判断是树还是列表显示形式,如果是列表显示,就执行方法OrgQuerryUser(用户单表数据查询)
其中userIds的值来源为刚刚获取的方法输入属性值BR_IN_PARENT.[customParam].[propertyValue]:
Else是树的显示形式的话,执行方法OrgChainQueryGeneralRela(组织机构通用关联查询)
其中userFields为必传参数,includeUserId的值来源为刚刚获取的方法输入属性值BR_IN_PARENT.[customParam].[propertyValue]:
整个EP的目的就是为了输出执行人实体ExecutionUnitEntity,执行API筛选满足条件的人员实体后将它作为返回值的来源。
第四步,进入vbase流程管理->基础设置->执行人自定义函数管理菜单,将刚刚配置好的EP在这里注册。
新建一个流程,人工执行人选择类型为自定义执行人函数,选择刚刚新建的那个loginUserLeaderApprove函数,输入direct选择直接上级审批
(注意:如果传给customParam实体的值不存在点击确认无反应)。
获取流程变量机构id,记得要关联字段。
现在用监督部门的周杰登录启动流程test,它的下一步执行人应该是尹天雪。