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

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

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

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

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

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

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

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

在这里,TaskReplicator的任务表单,我们都用同一个命名为Task1的User Control。而重新提交我们用命名为Task0的User Control。因为Task0会有稍许不同,Task0会直接提供修改原始List的表单,而不需要用户回到原始List中去做修改。

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

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

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

Codepublicboolfinished=false;//While循环的结束条件publicbooltask_passed=false;//Task Replicator是否是“通过”privateintstep=1;//当前的步骤privateintstep_total=0;//总步骤privatestringworkflow_name=string.Empty;//工作流名称,用于去配置表中读取工作流定义privateintvote=0;//用于投票类型的审批,当前投票通过的百分比publicboolterminate=false;//用户是否终止提交工作流

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

重新提交If-Else这个分支的提交为step==0。工作流终止If-Else的分支条件为terminate。

1. 工作流的Activated事件:读取工作流的定义,设置TaskReplicator的InitChildData为第一步的所有审批人。

CodeInitData data=WorkflowDataSerializer.DeserializeFromXmlString(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;//设置投票通过比例为0taskPropertiesList=newList();//用于记录所有用户处理过的任务信息

3. taskReplicator的ChildInitialized事件:创建该步骤对应的Task

CodeTaskActivity activity=e.ActivityasTaskActivity;

activity.TaskProperties=newSPWorkflowTaskProperties();

activity.TaskProperties.DueDate=DateTime.Now.AddDays(days);

activity.TaskProperties.ExtendedProperties["SubmitterComments"]=SubmitterComments;

activity.TaskProperties.ExtendedProperties["ReviewComments"]=ReviewComments;

WorkflowReviewerSettings item=e.InstanceDataasWorkflowReviewerSettings;

activity.TaskProperties.AssignedTo=item.DomainAccount;

activity.TaskProperties.Title="请审批"+user+"的请假单";

activity.TaskProperties.TaskType=1;

4. taskReplicator的Until结束条件:判断投票结果是否通过。

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

{case"并行":intcount=0;foreach(SPWorkflowTaskProperties taskPropinthis.taskPropertiesList)

{stringstatus=taskProp.ExtendedProperties["TaskStatus"]asstring;switch(status)

{case"Approved":

count++;break;case"Rejected":

e.Result=true;

step--;return;

}

}

task_passed=count==replicatorTask.InitialChildData.Count;break;case"投票":intvote_passed=int.Parse(spitem["投票通过比例"].ToString());if(taskPropertiesList.Count==replicatorTask.InitialChildData.Count&&vote

{

e.Result=true;

step--;return;

}

task_passed=vote>=vote_passed;break;

}if(task_passed)

{

step++;

}

e.Result=task_passed;

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

CodeTaskActivity activity=e.ActivityasTaskActivity;

ReviewComments+=PersonSayComment(activity.TaskProperties);

SubmitterComments=activity.TaskProperties.ExtendedProperties["SubmitterComments"]asstring;

WorkflowReviewerSettings item=e.InstanceDataasWorkflowReviewerSettings;stringstatus=activity.TaskProperties.ExtendedProperties["TaskStatus"]asstring;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项目

等等

java多级审批流程_[SharePoint 工作流] 如何设计一个通用的多级多审核工作流程(三):工作流开发...相关推荐

  1. 添加流程_艾多美手机商城苹果ios系统的主屏幕添加流程

    嗨,大家好,我是你们的老朋友莎莎老师,最近有很多朋友都在问莎莎老师,苹果手机的APP商城什么时候可以下载安装,因为目前苹果版的艾多美手机商城只有网页版,还没有出苹果ios系统版本的APP软件程序,所以 ...

  2. python可以做表格文档吗_生活中的python-利用python-docx自动生成表格简化工作流程...

    因为工作原因,需要经常往两个word模板里填写内容并生成新的word文件,模板大致如下图: 老的工作流程: 打开两个表,在表中对应位置填写个人信息,保存.这样一来,当需要填写的信息比较多的时候,工作就 ...

  3. nginx服务器硬件配置要求_聚英国际|Filecoin网络对服务器硬件要求及工作流程分析...

    IPFS&Filecoin--2020年最受瞩目的明星级项目.Filecoin作为一个去中心化存储项目,落地实体才能让生态发展得越长远,随着生态的扩大,真正应用上的存储需求被提出,Fileco ...

  4. java图书馆登陆代码_图书馆系统(登录设计)

    基于MVC设计----图书馆系统(登录设计) 这一学期学习了JavaWeb开发, 课程结束时老师给的任务是做一个课程设计,博主使用MVC(jsp.servlets.javabean)开发了一个简单的图 ...

  5. 华为端到端项目管理流程_华为这段话是我见过对端到端流程本质最精辟的阐述...

    关注供应链成长随笔,置顶公众号 自己搭台阶,一步步成为供应链专家 ━ ━ ━ ━ ━ ━ 很长一段时间里,经常在供应链的相关文章里看到端到端流程的片段: "世界一流企业实施端到端流程后,大幅 ...

  6. 单片机拟真电路图软件_基于MSP430单片机设计的高效数控直流电源及其测试方法与流程...

    本发明涉及直流电源 技术领域: ,具体涉及一种基于MSP430单片机设计的高效数控直流电源及其测试方法. 背景技术: :电压电流源是很多电子仪器设备研制的关键设计之一,电源在工作时产生的变动或误差,将 ...

  7. keyshot手机渲染教程_渲染基础教程,六个步骤教你KeyShot工作流程

    渲染基础教程,六个步骤教你KeyShot工作流程 想要产品效果好,渲染步骤是必须的,而且你需要注意好材质和贴图,尤其是在KeyShot渲染设置当中,你一定要设置正确.不少小伙伴对于KeyShot渲染神 ...

  8. 小程序工程化实践(上篇)-- 手把手教你撸一个小程序 webpack 插件,一个例子带你熟悉 webpack 工作流程...

    本文基于 webpack 4 和 babel 7,Mac OS,VS Code 小程序开发现状: 小程序开发者工具不好用,官方对 npm 的支持有限,缺少对 webpack, babel 等前端常用工 ...

  9. java日志怎么实现_JAVA项目中怎么实现一个通用日志记录功能

    JAVA项目中怎么实现一个通用日志记录功能 发布时间:2020-11-21 17:04:50 来源:亿速云 阅读:53 作者:Leah 今天就跟大家聊聊有关JAVA项目中怎么实现一个通用日志记录功能, ...

最新文章

  1. Spring Batch 介绍
  2. socket的拉屎模型
  3. Python爬虫数据分析三剑客:Numpy、pandas、Matplotlib
  4. glide缩略图存储 android,Glide 显示视频缩略图及遇到的坑
  5. Spring Beans 初始化流程分析
  6. dbscan聚类算法matlab_密度聚类DBSCAN、HDBSCAN(转)
  7. java线程6种状态转换,Java线程的生命周期和各种状态转换详解
  8. 极光实时监听怎么调用_源码分析 Sentinel 实时数据采集实现原理(图文并茂)
  9. java 调用 rsync_运行rsync时,QProcess不显示任何输出
  10. mybatis中使用in查询时的注意事项
  11. Vue实现按钮和文本框的切换
  12. html5华迪,比亚迪永通华迪4S店:元新能源最低售8.19万
  13. FLASH寿命测试!
  14. Ubuntu 安装绿联CM448无线网卡驱动
  15. USB转串口驱动(支持各平台)
  16. mcc460_最新MCC和MNC国家代码运营商对应表
  17. 基于springboot+vue的水果销售系统附代码
  18. BZOJ4768: 2555加强版之wxh loves substring
  19. S7comm协议学习笔记
  20. 计算机应用技术生产实践报告,计算机应用技术毕业实习报告.docx

热门文章

  1. 机器学习面试150题(2020):不只是考SVM xgboost 特征工程
  2. 牛客练习赛43 Tachibana Kanade Loves Review C(最小生成树Kruskal)
  3. Mysql 列修改语句alter/changer/modify
  4. 如何从头训练一个一键抠图模型
  5. 遇见流氓软件怎么才能卸载,文件夹删不掉显示被占用(小鸟,海螺,原始传奇等),到底应该怎么办?
  6. android小视频应用程序,要的短视频app下载-要的短视频app安卓版下载v1.0.2 - 非凡软件站...
  7. teamviewer12 linux安装,Ubuntu中下载安装TeamViewer 12
  8. apriltag linux 编译,无法为python包“apriltag”、“apriltags”和“aruco”构建轮子
  9. 5月书讯(下)| 5天小长假,一起读新书
  10. JAVA停车场管理系统(ArrayList、栈操作)