设为首页 收藏本站
查看: 963|回复: 0

[经验分享] [SharePoint 工作流] 如何设计一个通用的多级多审核工作流程(三):工作流开发

[复制链接]

尚未签到

发表于 2015-9-26 10:03:49 | 显示全部楼层 |阅读模式
  在上2篇博客中,我们有了工作流定义的列表,也有了关联表单和启动表单,现在就是开始开发这个通用工作流的时刻了。
  工作流的基本构成就是:一个While循环控制工作流的运转,While里的Task Replicator用来创建审批任务,至于应该创建哪一级的审批人,我们使用一个Step变量来控制。当Step==0时,表示需要提交者修改内容后重新提交。
  首先,我们先来看看这个工作流的逻辑图:
DSC0000.jpg
  这是一个简单的逻辑图示,最终的工作流图会有所不同。从这个图中可以看出,我们是用代码在控制流程的流转。
  当Step为0时,表示需要提交者修改内容后,重新提交。
  当Step>0时,TaskReplicator(一个Replicator里放置一个TaskActivity)就创建这步的所有审批人,并且根据审批类型为投票还是并行来做结束判断。
  Code部分,根据Task的返回结果是通过还是拒绝,来决定Step++还是Step--。
  如果Step>总步骤数,那么流程结束。While退出。
  在这里,TaskReplicator的任务表单,我们都用同一个命名为Task1的User Control。而重新提交我们用命名为Task0的User Control。因为Task0会有稍许不同,Task0会直接提供修改原始List的表单,而不需要用户回到原始List中去做修改。
  有了这个逻辑关系图,我们来看看具体的工作流程图和一些关键代码:
DSC0001.jpg
  与逻辑图中稍许不同的就是,我们在Resubmit后加了一个Terminate Activity,这是为了让提交者可以终止掉这个流程。While循环后的Code Activity则是为了记录一些日志。
  有了上面的这个工作流程图,剩下的就需要一些变量来控制流程的流转了。比较重要的变量如下:
  

DSC0002.gif DSC0003.gif Code
public bool finished = false;     // While循环的结束条件
public bool task_passed = false;  // Task Replicator是否是“通过”
private int step = 1;             // 当前的步骤
private int step_total = 0;       // 总步骤
private string workflow_name = string.Empty;  // 工作流名称,用于去配置表中读取工作流定义
private int vote = 0;                         // 用于投票类型的审批,当前投票通过的百分比
public bool terminate = false;                // 用户是否终止提交工作流
  
  有了这些变量,我们就可以设置While的结束条件,If-Else的分支条件了。
  重新提交If-Else这个分支的提交为step==0。工作流终止If-Else的分支条件为terminate。
  
  接下来,我们来看看如何用代码控制流转了(这里面最重要的内容请看《[SharePoint 工作流] While里的Replicator ChildInitialized事件不执行的解决方法 》)
  1. 工作流的Activated事件:读取工作流的定义,设置TaskReplicator的InitChildData为第一步的所有审批人。

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

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

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

replicatorTask.InitialChildData = GetWorkflowStepSettings(workflowProperties.Web, workflow_name, step);
  
  workflow_name是从工作流的InitiationData中读取(这里用了一个反序列化来获得工作流启动时保存的对象数据)
  2. taskReplicator的Initialized事件:做一些初始化工作,在这里不对InitChildData做任何赋值。

task_passed = false;  // 设置为未通过状态
vote = 0;             // 设置投票通过比例为0
taskPropertiesList = new List<SPWorkflowTaskProperties>();   // 用于记录所有用户处理过的任务信息
  
  3. taskReplicator的ChildInitialized事件:创建该步骤对应的Task

Code
TaskActivity activity = e.Activity as TaskActivity;

activity.TaskProperties = new 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.DomainAccount;
activity.TaskProperties.Title = "请审批" + user + "的请假单";
activity.TaskProperties.TaskType = 1;
  
  4. taskReplicator的Until结束条件:判断投票结果是否通过。

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

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

            switch (status)
            {
                case "Approved":
                    count++;
                    break;

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

        task_passed = count == replicatorTask.InitialChildData.Count;
        break;

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

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

            return;
        }

        task_passed = vote >= vote_passed;
        break;
}

if (task_passed)
{
    step++;
}

e.Result = task_passed;
  
  5. taskReplicator的ChildCompleted事件:把用户处理过的任务信息保存下来,以便在Until事件中使用

Code
TaskActivity activity = e.Activity as TaskActivity;

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

WorkflowReviewerSettings item = e.InstanceData as WorkflowReviewerSettings;

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

taskPropertiesList.Add(activity.TaskProperties);
  
  6. CodeActivity1设置While循环结束的条件,并且对taskReplicator进行重新赋值

finished = step > step_total;

if (!finished && step > 0)
{
    replicatorTask.InitialChildData = GetWorkflowStepSettings(workflowProperties.Web, workflow_name, step);
}
  
  有了上面这些并不复杂的代码,我们就有了运转一个通用工作流的能力。工作流发布到SharePoint上就可以开始使用了。
  接下来,下一节来看看这个工作流的具体运转情况。

在BI,SharePoint,工作流领域,我们服务过众多的国际国内大企业:

1. 西门子中国:BI项目与SharePoint门户
2. Nokia:BI项目与SharePoint门户
3. 中国人寿:BI & 工作流
4. 与狼共舞:BI门户
5. 玫琳凯:BI项目
6. 美国微软:BI项目
等等   

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-118967-1-1.html 上篇帖子: SharePoint Central Administration Feature开发要点‏ 下篇帖子: sharepoint 匿名访问网站
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表