[K2 Blackpearl] 会签功能
需求:在流程某个节点由用户手动选择参与会签的人员。
实现:之前流程中的会签功能只是一种假的会签,实际上是维护一个Process的DataField。这种方式下所有参与会签的人是串行的,其中一个人的审批时间会明显影响整个节点的审批时间。下面是我在查看K2流程节点代码后,想到的一个方法。
查看Activity代码
查看DestinationRule代码
检查DestinationRule_ExecuteCode代码
View Code
private void DestinationRule_ExecuteCode(object sender, EventArgs e) { if (K2.ActivityInstance.SlotInstance) { // // The activity is a slot instance activity // int slotCount = 0; string[] slotInstanceData = null; if (K2.Configuration.DynamicSlots) { // If it is dynamic slot, get the slot count from // the initialization data slotCount = K2.Configuration.SlotInstanceData.Length; slotInstanceData = K2.Configuration.SlotInstanceData; } else { // Get the slot count and prepare the initialization // data slotCount = K2.Configuration.Slots; slotInstanceData = new string[slotCount]; string initData = string.Empty; if (K2.Configuration.SlotInstanceData.Length > 0) { initData = K2.Configuration.SlotInstanceData[0]; } for (int i = 0; i < slotCount; i++) { slotInstanceData[i] = initData; } } // Set the slot count and initialization data K2.Slots = slotCount; K2.SlotInstanceData = K2.Configuration.SlotInstanceData; } else { K2.DynamicQueues = K2.Configuration.DynamicQueues; K2.ResolveQueuesToUsers = K2.Configuration.ResolveQueuesToUsers; int setCount = K2.Configuration.SetCount; for (int i = 0; i < setCount; i++) { if (GetRuleResult(i + 1)) { AddDestinations(i + 1); } } } }
代码中有两个分支,第一支是用于处理Slot实例的,另外一支就是处理节点审批人的。我需要的是改造第二个分支。
在xoml.cs中添加方法AddDestinationsFromString,用于动态添加Destination User。
ApproveList是一个Process级别的变量。代码比较简单。ApproveList的格式:domianuser1;domainuser2;....不需要域名。
private void AddDestinationsFromString() { if (K2.ProcessInstance.DataFields.Contains("ApproveList")) { object objData = K2.ProcessInstance.DataFields["ApproveList"].Value; string strApprove = objData == null ? string.Empty : objData.ToString(); string[] lstApprove = strApprove.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); Destination des = null; K2.Destinations.Clear(); for (int i = 0; i < lstApprove.Length; i++) { des = new Destination(DestinationType.User, lstApprove[i]); if (des != null) K2.Destinations.Add(des); } } }
修改DestinationRule_ExecuteCode中的代码。
K2.DynamicQueues = K2.Configuration.DynamicQueues; K2.ResolveQueuesToUsers = K2.Configuration.ResolveQueuesToUsers; int setCount = K2.Configuration.SetCount; AddDestinationsFromString(); //for (int i = 0; i < setCount; i++) //{ // if (GetRuleResult(i + 1)) // { // AddDestinations(i + 1); // } //}
当然,会签节点也需要进行其他设置。进入Activity General Properties界面,设置Slot的设置方式为:Create a slot for each destination,如果有需要还可以设置Default Client Event中的Config Outcomes的逻辑判断。
测试流程。
本文版权归菜鸟和博客园共有,欢迎转载,但请注明出处。