流程插件开发系列3:自定义参与人插件
金蝶云社区-猪飞
猪飞
2人赞赏了该文章 5,426次浏览 未经作者许可,禁止转载编辑于2017年06月21日 16:43:51

流程插件开发汇总:
流程插件开发系列1:审批动作服务插件
https://vip.kingdee.com/article/29378
流程插件开发系列2:自定义流转条件插件
https://vip.kingdee.com/article/29581
流程插件开发系列3:自定义参与人插件
https://vip.kingdee.com/article/29643

背景:
现有流程参与人支持用户、角色、员工、岗位、部门、汇报关系、变量或他们的组合。如有其他特殊需求,希望通过自定义参与人插件实现,比如通过业务员中的销售员作为参与人。
很高兴告诉各位伙伴们,后续版本(预计在7.0),能很方便地开发自定义参与人插件,并在节点上进行配置。

1. 用户如何配置自定义参与人
本例以配置“销售员”作为参与人,用户就可以在基础资料类型中选择“销售员”(可选的基础资料类型由插件指定)。常量方式则选择具体的某个销售员;变量方式则选择单据上的销售员字段。作为参数传入参与人插件中解析出具体用户:



2. 开发者如何实现自定义参与人插件
2.1. 参与人插件基类
Kingdee.BOS.Workflow.App.Core.Participant.MemberWrapper.CustomizeMemberPlugIn
引用组件Kingdee.BOS.Workflow.App.Core.dll,开发者编写的参与人解析类需要继承该基类。
2.2. 属性ParticipantFormIds
属性说明:用户在流程节点上配置自定义参与人时,可选的基础资料FormId集合
C#定义
public abstract List<string> ParticipantFormIds { get; }
备注:插件中覆写此属性,返回允许用户选择的基础资料类型集合。
2.3. 方法GetCustomUser
方法说明:解析参与人的核心方法,把用户配置的参与人基础资料解析成具体用户ID。
C#定义
public abstract List<long> GetCustomUser(Context ctx, List<IMember> members)
备注:插件中覆写此方法,自行实现参与人解析,并返回解析出的用户ID。

[tr][td=176]插件基类
[td=447]CustomizeMemberPlugIn
[tr][td=176]所在组件
[td=447]Kingdee.BOS.Workflow.App.Core.dll
[tr][td=176]参与人解析方法
[td=447]List GetCustomUser(Context ctx, List members)
[tr][td=2,1,623] 方法参数说明:
[tr][td=176]ctx[td=447]BOS环境上下文
[tr][td=176] members[td=447]已经解析好的基础资料常量集合,插件以此解析参与人用户。比如用户在销售员参与人中,配置了常量方式选择具体的某个销售员,以及变量方式选择单据上的销售员字段。流程引擎会将这些配置全部解析为具体的销售员常量,传入本参数。
[tr][td=176]方法返回值
[td=447]插件根据参数members解析出参与人用户ID集合,返回流程引擎,系统将对这些用户分配待办任务。

2.4. 示例插件代码
以下示例插件,举例说明如何根据“销售员”解析出参与人用户,示例未经测试仅供参考思路。到K/3 Cloud安装目录的WebSite\Bin子目录,引用如下基本组件(其他组件按需引用):
Kingdee.BOS.dll
Kingdee.BOS.App.dll
Kingdee.BOS.Core.dll
Kingdee.BOS.DataEntity.dll
Kingdee.BOS.Workflow.App.Core.dll
Kingdee.BOS.Workflow.Models.dll

using Kingdee.BOS;using Kingdee.BOS.App.Data;using Kingdee.BOS.Workflow.App.Core.Participant.MemberWrapper;using Kingdee.BOS.Workflow.Models.Member;using Kingdee.BOS.WorkflowMember;using System;using System.Collections.Generic;using System.ComponentModel;using System.Linq;using System.Text; namespace Demo.Workflow.ParticipantPlugIn.CustomParticipant{ [Description("自定义销售员类型参与人")] public class DemoCustomizeMemberPlugIn : CustomizeMemberPlugIn { ///

/// 用户在流程节点上设置自定义参与人时,可选的基础资料FormId /// public override List<string> ParticipantFormIds { get { // TODO 按需求设置可选的基础资料FormID,比如允许用户选择销售员类型的基础资料 return new List<string>() { "BD_Saler" }; } } /// /// 把参与人基础资料解析成具体用户ID /// /// BOS上下文 /// 已经解析好的基础资料常量 /// 作为参与人的具体用户ID public override List<long> GetCustomUser(Context ctx, List<IMember> members) { // 获取销售员”ID List<int> salerList = members .Where(i => string.Equals((i as CustomPartiMember).ParticipantFormId, "BD_Saler", StringComparison.OrdinalIgnoreCase)) .Select(i => int.Parse(i.Id)).ToList(); // TODO 按需求解析参与人,示例解析出销售员对应的用户作为参与人: List<long> result = new List<long>(); if (salerList.Count > 0) { string sql = @"SELECT U.FUSERID,U.FNAME,STAFF.FPOSTID FROM T_BD_OPERATORENTRY OPERA INNER JOIN T_BD_STAFF STAFF ON OPERA.FSTAFFID =Staff.Fstaffid AND STAFF.FDOCUMENTSTATUS = 'C' AND STAFF.FFORBIDSTATUS = 'A' INNER JOIN V_BD_CONTACTOBJECT CONTACT ON STAFF.FPERSONID = CONTACT.FID AND CONTACT.FDOCUMENTSTATUS= 'C' AND CONTACT.FFORBIDSTATUS = 'A' INNER JOIN T_SEC_USER U ON U.FLINKOBJECT = CONTACT.FID AND U.FFORBIDSTATUS = 'A' WHERE OPERA.FISUSE ='1' AND OPERA.FENTRYID IN (SELECT FID FROM TABLE(fn_StrSplit(@OperatorIds,',',1)))"; SqlParam[] parameters = new SqlParam[] { new SqlParam("@OperatorIds", KDDbType.udt_inttable, salerList.ToArray()) }; var userObjs = DBUtils.ExecuteDynamicObject(ctx, sql,paramList: parameters); result.AddRange(userObjs.Select(i => Convert.ToInt64(i["FUSERID"]))); } return result; } }}

3. 开发者如何注册自定义参与人插件
开发好自定义参与人插件后,需要注册到系统中。用户才能在节点参与人配置界面,看到并使用新的参与人类型。
例如注册“销售员”参与人插件:
该自定义参与人插件的主键假定为CustomParti;参与人类型名称为“销售员”,分组为“自定义”;
配置该参与人时所使用的面板为FPanelCustomParti;
自定义参与人控制器FHANDLERCLASS字段的值是固定的:Kingdee.BOS.Workflow.PlugIns.ParticipantMember.CustomPartiHandler,Kingdee.BOS.Workflow.PlugIns;
自定义参与人解析器插件FWRAPPERCLASS字段,格式是命名空间+类名, +组件名称,比如:
Demo.Workflow.ParticipantPlugIn.CustomParticipant.DemoCustomizeMemberPlugIn,Demo.Workflow.ParticipantPlugIn
则在BOS设计器中导入如下KSQL:

DELETE T_WF_ParticipantType WHERE FID='CustomParti';INSERT INTO T_WF_ParticipantType(FID,FNAME,FGROUP,FTREENODEKEY,FHANDLERCLASS,FORDER,FWRAPPERCLASS,FSUPPORTSCENE)VALUES ('CustomParti',N'销售员',N'自定义','FPanelCustomParti','Kingdee.BOS.Workflow.PlugIns.ParticipantMember.CustomPartiHandler,Kingdee.BOS.Workflow.PlugIns',200,'Demo.Workflow.ParticipantPlugIn.CustomParticipant.DemoCustomizeMemberPlugIn,Demo.Workflow.ParticipantPlugIn',251);DELETE T_WF_ParticipantType_L WHERE FID='CustomParti' AND FLOCALEID = 2052;INSERT INTO T_WF_ParticipantType_L(FPKID,FID,FLOCALEID,FNAME,FGROUP)VALUES (100001,'CustomParti',2052,N'销售员',N'自定义');
全文完。