一、说明
备注:由于存在问题,目前还未发布
1、上下查可以使用插件干预,故全流程跟踪和业务流程图也增加插件事件使其可以干预。
2、预计支持版本2024年06月份。
3、插件增加的节点会在表单名后面加星号。
4、特别注意1,会在整条链路的所有表单插件中触发OnShowTrackAllFlows事件,故一条链路只要一个表单中干预即可;如果一条链路有多个表单干预,要特别注意处理。
5、特别注意2,业务流程图,它是依据设计好的流程图,只能激活相应的节点,不存在增加删除的情况,并且激活要符合流程图关系。
二、插件事件 OnShowTrackAllFlows
1、OnShowTrackAllFlows,全流程跟踪显示之前干预事件,可以增加需要显示的节点,禁止删除里面的节点。
2、OnShowTrackAllFlows,业务流程图显示之前干预事件,可以在已有的业务流程图单据中激活相应的节点。
3、在表单插件中进行实现即可,不需要列表插件中干预,此事件中的view 为动态创建的BillView。
三、事件参数 ShowTrackAllFlowsEventArgs
1、List<BusinessFlowInstance> Instances 属性.,此实例数据是平台解析后的数据,
包括跨实例数据,删除了无需显示的分支路线,删除了阻断节点和它的路线后的数据。
2、FormOperation属性,触发此操作的来源,只有全流程跟踪操作和业务流程图操作,分别对应的操作名为“TrackAllFlows”和“Track”。
3、IsCancelNextForm属性,默认false, 设置为true, 会停止触发下面的表单OnShowTrackAllFlows事件。
四、简单示例
1、插件在节点B后面增加单据C节点,在A和B单据上做全流程跟踪效果
2、增加或激活的节点会在表单名后面增加星号,鼠标悬浮在节点上显示时。
五、代码示例
1、表单插件,节点B下面增加单单据C节点
特别注意1、增加的表名,一定得在定义表(t_bf_tableDefine)中有值
using System; using System.Collections.Generic; using System.Linq; using System.ComponentModel; using Kingdee.BOS.Util; using Kingdee.BOS.Core.Log; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Core.Bill; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.BusinessEntity.BusinessFlow; using Kingdee.BOS.Core.List.PlugIn.Args; using Kingdee.BOS.Core.Bill.PlugIn; namespace Kingdee.BOS.TestPlugIn22.FormPlugin { [HotUpdate] [Description("单据测试插件")] public class TestFormPlugIn : AbstractBillPlugIn { public override void OnShowTrackAllFlows(ShowTrackAllFlowsEventArgs e) { base.OnShowTrackAllFlows(e); //传入的流程实例数据不为空 if (e.Instances.IsEmpty() == false) { //得到所有单据B的节点 List<RouteTreeNode> allBillBNodes = new List<RouteTreeNode>(); foreach (var instItem in e.Instances) { var instAllNodes = this.GetAllNodes(instItem.FirstNode); foreach (var node in instAllNodes) { if (node.Id.Tbl.EqualsIgnoreCase("BillB_Entry")) { allBillBNodes .Add(node); } } } //所有单据A节点增加单据C孩子节点 long cNodePkValue =0; foreach (var node in allBillBNodes ) { cNodePkValue++; RouteTreeNode childNode = new RouteTreeNode(); //"BillC_Entry1" 一定得在 t_bf_tabldeDefine中的 FTableNumber中对应的值 childNode.Id = new Id("BillC_Entry1", cNodePkValue); childNode.ParentNode = node; node.ChildNodes.Add(childNode); } } } private List<RouteTreeNode> GetAllNodes(RouteTreeNode parentNote, int parentDepth = 0) { List<RouteTreeNode> allNode = new List<RouteTreeNode>(); allNode.Add(parentNote); foreach (var child in parentNote.ChildNodes) { int currDepth = parentDepth; RecursionLimitUtils.Run(ref currDepth, 200, "TestFormPlugIn->GetAllNodes"); //防止死循环 var childs = this.GetAllNodes(child, currDepth); allNode.AddRange(childs); } return allNode; } } }