[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的逻辑判断。

测试流程。

posted @ 2012-10-17 17:14  一只小小菜鸟  阅读(1266)  评论(1编辑  收藏  举报