sharepoint:[SharePoint 工作流] 如何设计一个通用的多级多审核工作流程( 3):工作流开发

  在上2篇博客中我们有了工作流定义列表也有了关联表单和启动表单现在就是开始开发这个通用工作流时刻了

  工作流基本构成就是:个While循环控制工作流运转While里Task Replicator用来创建审批任务至于应该创建哪审批人我们使用个Step变量来控制当Step0时表示需要提交者修改内容后重新提交

  首先我们先来看看这个工作流逻辑图:

[SharePo<img src='/icons/1735int.gif' /> 工作流] 如何设计<img src='/icons/1735yi.gif' />个通用<img src='/icons/1735de.gif' />多级多审核工作流程( 3):工作流开发

  图片看不清楚?请点击这里查看原图(大图)

  这是个简单逻辑图示最终工作流图会有所区别从这个图中可以看出我们是用代码在控制流程流转

  当Step为0时表示需要提交者修改内容后重新提交

  当Step>0时TaskReplicator(个Replicator里放置个TaskActivity)就创建这步所有审批人并且根据审批类型为投票还是并行来做结束判断

  Code部分根据Task返回结果是通过还是拒绝来决定Step还是Step--

  如果Step>总步骤数那么流程结束While退出

  在这里TaskReplicator任务表单我们都用同个命名为Task1User Control而重新提交我们用命名为Task0User ControlTask0会有稍许区别Task0会直接提供修改原始List表单而不需要用户回到原始List中去做修改

  有了这个逻辑关系图我们来看看具体工作流程图和些关键代码:

[SharePo<img src='/icons/1735int.gif' /> 工作流] 如何设计<img src='/icons/1735yi.gif' />个通用<img src='/icons/1735de.gif' />多级多审核工作流程( 3):工作流开发

  图片看不清楚?请点击这里查看原图(大图)

  和逻辑图中稍许区别就是我们在Resubmit后加了个Terminate Activity这是为了让提交者可以终止掉这个流程While循环后Code Activity则是为了记录些日志

  有了上面这个工作流程图剩下就需要些变量来控制流程流转了比较重要变量如下:

public bool finished = false;     // While循环结束条件
public bool task_passed = false;  // Task Replicator是否是“通过”
private step = 1;             // 当前步骤
private step_total = 0;       // 总步骤
private workflow_name = .Empty;  // 工作流名称用于去配置表中读取工作流定义
private vote = 0;                         // 用于投票类型审批当前投票通过百分比
public bool terminate = false;                // 用户是否终止提交工作流


  有了这些变量我们就可以设置While结束条件If-Else分支条件了

  重新提交If-Else这个分支提交为step0工作流终止If-Else分支条件为terminate

  接下来我们来看看如何用代码控制流转了(这里面最重要内容请看[SharePo 工作流] While里Replicator ChildInitialized事件不执行解决思路方法 )

  1. 工作流Activated事件:读取工作流定义设置TaskReplicatorInitChildData为第所有审批人

InitData data = WorkflowDataSerializer.DeserializeFromXmlString<InitData>(workflowProperties.InitiationData);

workflow_name = data.WorkflowName;
SPListItem workflow = GetWorkflow(workflowProperties.Web, workflow_name);

step_total = .Parse(workflow["步骤数"].);
SubmitterComments = data.SubmitterComments;
user = data.InitUser;
days = data.ApproveDays;

replicatorTask.InitialChildData = GetWorkflowStepSettings(workflowProperties.Web, workflow_name, step);


  workflow_name是从工作流InitiationData中读取(这里用了个反序列化来获得工作流启动时保存对象数据)

  2. taskReplicatorInitialized事件:做化工作在这里不对InitChildData做任何赋值

task_passed = false;  // 设置为未通过状态
vote = 0;             // 设置投票通过比例为0
taskPropertiesList = List<SPWorkflowTaskProperties>;   // 用于记录所有用户处理过任务信息


  3. taskReplicatorChildInitialized事件:创建该步骤对应Task

TaskActivity activity = e.Activity as TaskActivity;

activity.TaskProperties = SPWorkflowTaskProperties;

activity.TaskProperties.DueDate = DateTime.Now.AddDays(days);
activity.TaskProperties.ExtendedProperties["SubmitterComments"] = SubmitterComments;
activity.TaskProperties.ExtendedProperties["ReviewComments"] = ReviewComments;

WorkflowReviewerSettings item = e.InstanceData as WorkflowReviewerSettings;

activity.TaskProperties.AssignedTo = item.DoAccount;
activity.TaskProperties.Title = "请审批" + user + "请假单";
activity.TaskProperties.TaskType = 1;


  4. taskReplicatorUntil结束条件:判断投票结果是否通过

SPListItem spitem = GetWorkflowStep(workflowProperties.Web, workflow_name, step);
type = spitem["审批类型"].;

switch (type)
{
    "并行":
        count = 0;
        foreach (SPWorkflowTaskProperties taskProp in this.taskPropertiesList)
        {
            status = taskProp.ExtendedProperties["TaskStatus"] as ;

            switch (status)
            {
                "Approved":
                    count;
                    ;

                "Rejected":
                    e.Result = true;
                    step--;
                    ;
            }
        }

        task_passed = count replicatorTask.InitialChildData.Count;
        ;

    "投票":
        vote_passed = .Parse(spitem["投票通过比例"].);

        (taskPropertiesList.Count replicatorTask.InitialChildData.Count && vote < vote_passed)
        {
            e.Result = true;
            step--;

            ;
        }

        task_passed = vote >= vote_passed;
        ;
}

(task_passed)
{
    step;
}

e.Result = task_passed;


  5. taskReplicatorChildCompleted事件:把用户处理过任务信息保存下来以便在Until事件中使用

TaskActivity activity = e.Activity as TaskActivity;

ReviewComments PersonSayComment(activity.TaskProperties);
SubmitterComments = activity.TaskProperties.ExtendedProperties["SubmitterComments"] as ;

WorkflowReviewerSettings item = e.InstanceData as WorkflowReviewerSettings;

status = activity.TaskProperties.ExtendedProperties["TaskStatus"] as ;
(!.IsNullOrEmpty(status) && status "Approved") vote item.VoteRatio;

taskPropertiesList.Add(activity.TaskProperties);


  6. CodeActivity1设置While循环结束条件并且对taskReplicator进行重新赋值

finished = step > step_total;

(!finished && step > 0)
{
    replicatorTask.InitialChildData = GetWorkflowStepSettings(workflowProperties.Web, workflow_name, step);
}


  有了上面这些并不复杂代码我们就有了运转个通用工作流能力工作流发布到SharePo上就可以开始使用了

  接下来节来看看这个工作流具体运转情况

  系列文章:

  [SharePo 工作流] 如何设计个通用多级多审核工作流程():工作流定义

  [SharePo 工作流] 如何设计个通用多级多审核工作流程( 2):关联设置和启动设置

Tags:  sharepointserver sharepoint教程 sharepoint2007 sharepoint

延伸阅读

最新评论

发表评论