---恢复内容开始---

以前的工作都是电商网站形式的,从未接触过工作流相关工作,新公司是传统制造业行业,我进的这个组又是做工作流这块相关工作的,所以避免不了和工作流打交道。

这边工作流主要用K2来做,我呢也是初次使用K2工作流引擎,今天就简单记录下创建K2工作流的过程,以后再慢慢补充更深一点的内容。

准备工作:

1.K2客户端要安装好,我这边是公司直接给的K2安装包,外面下载不到,据说这玩意收费的。

2.我这个K2客户端只能在VS2010上创建项目,所以还要配合K2装一个VS2010

3.以上两项准备工作就绪后,基本就要开工了,接下来要做的流程图大概长成这样,上张图看下

大致介绍下,该流程有2个节点Supplier和QS两个审批节点,有3个操作、同意、拒绝、关闭,这个流程也相对简单一点

1.需要用VS2010新建工作流项目,打开VS2010

文件》新建》项目:如下所示:

K2客户端安装后,左侧已安装的项目就会有K2的模板,创建项目的时候要选择“K2 Workflow Project”项目,然后输入项目名称、位置、解决方案名称,点击确定即可。

默认是有一个开始节点的,这个节点没有任何操作。

接下来我们做一个,发起申请,供应商收到通知上传,质量部门审批(同意、拒绝、关闭)

1.新增节点》打开工具箱》Event Wizards》选择“Default Server Event(Code)”》拖拽到设计面板,默认就剩生成左侧框内节点。默认会带一个事件。那么接下来,我们再把另外几个节点拖拽出来,最后在去关联。

2.所有节点以及拖拽完成,如下所示,拖拽过程中对每个节点进行了重命名,直接在每个节点上右键》Properties》

3.这一步就是使用线把这几个流程节点给关联起来。工具箱》Line Wizards》选择:Default Line  线即可。这一步主要用于关联开始节点和Supplier两个节点,这两个节点之间没有任何审批操作。

选择这个线之后,鼠标指针放到起始节点,划线到Supplier节点即可

发起流程的时候其实是有代码来通知K2,流程已经发起,下一步通知Supplier节点进行审批,代码大致粘贴下。流程创建好之后,回返回一个ProcInstID ,K2自动生成的,后续和K2的交互就要依赖这个ID。

 QSSampleReportWorkflow workflow = new QSSampleReportWorkflow(
                          item.ID,
                          string.Empty,
                          User.Identity.Name,
                          hdEmployeeName.Value,
                          "供应商样品报告"
                          );
                        item.ProcInstID = workflow.StartNewProcessInstance();

所有参数及方法都在QSSampleReportWorkflow这个类里边,

public sealed class QSSampleReportWorkflow
    {
        string processFullName = @"Com.WorkFlows\QSSampleReport";//审批流文件名
        string originator;//发起人帐号
        string nickName;//昵称
        string viewURL;
        string ApprovalURL;
        string WebServiceURL;

        System.Collections.Hashtable hsDataFields = new System.Collections.Hashtable();
        string title;
        string folioName;
        public QSSampleReportWorkflow(int formID, string appliNo, string userAccount, string userName, string projecteName)
        {
            originator = userAccount;//账号
            nickName = userName;
            string rootURL = ConfigurationManager.AppSettings["SiteRoot"];//当前Web站点地址
            WebServiceURL = string.Format("{0}/Suppliers/QSSampleReport.asmx", rootURL);//WebService地址
            ApprovalURL = string.Format("{0}/Suppliers/SupplierApplyView.aspx", rootURL);//申请页
            viewURL = string.Format("{0}/Suppliers/SupplierApplyView.aspx?RequestID={1}&PDK={2}", rootURL, formID, EncryptHelper.GetPDK(formID.ToString()));//查看页
            title = string.Format("QSSampleReport_{0}_{1}", projecteName, formID);
            folioName = string.Format("QSSampleReport_{0}", formID);
            hsDataFields.Add("RequestID", formID);
            hsDataFields.Add("WebServiceURL", WebServiceURL);
            hsDataFields.Add("ApproveURL", ApprovalURL);
            hsDataFields.Add("Title", title);
            hsDataFields.Add("FullName", nickName);
            //hsDataFields.Add("EnableToCheckFinal", false);
        }

        public QSSampleReportWorkflow()
        {
        }
        public int StartNewProcessInstance()
        {
            return Com.Kion.CommonProjects.WorkflowHelper.K2Helper
                  .StartNewProcessInstanceAndLogOnWorkflowPlatform(processFullName, hsDataFields, folioName, originator, viewURL, "");
        }
        /// <summary>
        /// 审批
        /// </summary>
        /// <param name="sn">审批时自动生产成的参数</param>
        /// <param name="approvalResult">审批结果</param>
        /// <param name="nodeName">审批节点名称</param>
        /// <param name="approver">审批人</param>
        /// <param name="remark">批备注</param>
        public void Approval(string sn, ApplyState approvalResult, string nodeName, string approver, string remark)
        {
            try
            {
                K2Helper.ApprovalProcessInstanceAndLogOnWorkflowPlatform(sn, approvalResult.ToString().Trim()
                    , nodeName, false
                    , approver
                    , remark);
            }
            catch (Exception ex)
            {

            }

        }
    }
4.发起流程之后会到Supplier这个节点,这个节点要干的事情有以下几项,  1.获取节点审批人,需要在Supplier这个节点加载时初始化时写一一段与WebService交互的代码,先把WebServices引入

Process Referencess》Add》Web》如下图所示添加引用

2.获取Supplier这个节点审批人,那么就要加入以下代码,操作如下

在代码区域,DestinationRule_ExecuteCode方法中最后一个else里边写入以下代码,保存即可,

GetDynamicApprovers方法WebService那边返回一个字符串数组存的都是账号
K2.Destinations.Clear();
                Suppliers.QSSampleReport wsHelper = new Suppliers.QSSampleReport();
                wsHelper.Url = K2.ProcessInstance.DataFields["WebServiceURL"].Value.ToString();
                int requestID = int.Parse(K2.ProcessInstance.DataFields["RequestID"].Value.ToString());
                //获取Supplier节点审批人
                string[] approverList = wsHelper.GetDynamicApprovers(requestID, K2.ActivityInstance.Activity.Name);

                foreach (string approver in approverList)
                {
                    K2.Destinations.Add(DestinationType.User, approver);
                }
2.给默认的Server Event添加事件代码,这里主要用来发送邮件,具体操作如下图所示

在Main方法中添加以下代码:

 string approverList = string.Empty;
            ; i < K2.ActivityInstanceDestination.Destinations.Count; i++)
            {
                approverList += K2.ActivityInstanceDestination.Destinations[i].Name.Split(] + ";";
            }
            Suppliers.QSSampleReport wsHelper = new Suppliers.QSSampleReport();
            wsHelper.Url = K2.ProcessInstance.DataFields["WebServiceURL"].Value.ToString();//WebService地址
            int requestID = int.Parse(K2.ProcessInstance.DataFields["RequestID"].Value.ToString());//申请ID
            wsHelper.SendEmailToApprover(approverList, K2.SerialNumber, K2.ActivityInstanceDestination.ActivityInstance.Activity.Name, requestID);
3.设置QS节点,和上边Supplier节点设置一样,需要在初始化时拷贝获取审批人代码,ServerEvent节点拷贝发送邮件代码。和Supplier区别在于,这个节点有审批人会介入,需要配置两个操作,批准、拒绝添加动作(审批通过、拒绝等),执行这个节点的操作(这个节点直接审批通过即可),添加一个Default client Event,具体如下图所示

然后会弹出配置框,按照指示操作即可

大致配置了4个参数,要和WebServices那边对应起来,配置好之后还是回到刚才界面选择配置参数,如下所示,SN是自动生成的参数,选择WebServiceUlr之后点击Next然后在Back返回这个参数自动就带上了,

这个参数是K2自动生成的一个流程ID,跟业务表单对应的,传到业务站点之后可以根据这个流程ID获取对应业务数据,前提是我们之前存了这个流程ID

这一步配置后直接Next即可,然后配置,两个操作,就是 审批和拒绝两个操作。具体如下

两个操作配置好之后,直接Next到User界面,添加用户,这个用户目前是写死的,具体什么意义我还不清楚,不写又不行,具体如下图所示

配置完之后,直接Next,直至Finish即可。这时候会出来两条线,一个是Approve,另一个则是Decline,然后将这两条线指向对应节点,如下图所示

在Approva节点和Close节点的ServerEvent里加入以下代码通知程序审批流结束,有点区别是这个方法同意传true,关闭就传false
wsHelper.EndApproval(requestID, true);//发起流程操作
Suppliers.QSSampleReport wsHelper = new Suppliers.QSSampleReport();//创建WebService对象
            wsHelper.Url = K2.ProcessInstance.DataFields["WebServiceURL"].Value.ToString();//获取WebServiceURL
            int requestID = int.Parse(K2.ProcessInstance.DataFields["RequestID"].Value.ToString());//获取业务表单Id
            wsHelper.EndApproval(requestID, true);//发起流程操作

在WebService提供端,EndApproval方法里要写入业务代码,流程结束后,业务数据的操作,邮件通知,流程关闭等

WebService端代码我就不贴了,有些东西是公司的,web端就是处理业务数据,根据自己业务场景写即可。

---恢复内容结束---

K2工作流引擎Demo的更多相关文章

  1. K2 BPM_北汽新能源业务流程管理信息系统建设思考_全球领先的工作流引擎

    本文由CIO发展中心根据北汽新能源流程与IT总监刘伟霞在“亦庄CIO数字化转型探索——CIO发展中心亦庄分舵2019夏季论坛”活动中演讲整理. 在“亦庄CIO数字化转型探索——CIO发展中心亦庄分舵2 ...

  2. java工作流引擎Jflow父子流程demo

    关键字 驰骋工作流引擎 流程快速开发平台 workflow ccflow jflow  .net开源工作流 定义 一个流程A的一个节点,因工作的需要调起另外的流程B,A就叫父流程,B就叫子流程.如果流 ...

  3. .Net 三款工作流引擎比较:WWF、netBPM 和 ccflow

    下面将对目前比较主流的三款工作流进行介绍和比较,然后通过三款流程引擎分别设计一个较典型的流程来给大家分别演示这三款创建流程的过程.这三款工作流程引擎分别是 Windows Workflow Found ...

  4. 工作流引擎Activiti使用总结

    http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html 1.简单介工作流引擎与Activiti 对于工作流引擎的 ...

  5. Activiti工作流引擎使用

    http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html 1.简单介工作流引擎与Activiti 对于工作流引擎的 ...

  6. 驰骋工作流引擎-流程数据md5加密

    关键字:工作流程数据加密  md5  数据保密流程数据防篡改软加密设置方式: 对工作流引擎的数据加密研究, 流程数据的加密方案与实现过程.输入图片说明需求背景1, 流程数据加密是为了防止流程数据被篡改 ...

  7. java工作流引擎证照库类型的流程设计 实现方案与演示案例

    关键词:.Net开源工作流    工作流引擎   工作流引擎常用信息存储  流程前置导航 证照库的概念&应用场景: 我们在梳理流程的时候,会发现有一些流程的发起是基于一个实体信息的. 比如:纳 ...

  8. zeebe 为微服务架构的工作流引擎

    zeebe 是灵活.轻量的基于微服务架构的工作流引擎 包含以下特性: 可视化的额工作流 审计日志以及历史 水平缩放 持久化&&容错 消息驱动 操作容易 语言无关 工作流基于标准bpmn ...

  9. 三款工作流引擎比较:WWF、netBPM 和 ccflow

    下面将对目前比较主流的三款工作流进行介绍和比较,然后通过三款流程引擎分别设计一个较典型的流程来给大家分别演示这三款创建流程的过程.这三款工作流程引擎分别是 Windows Workflow Found ...

随机推荐

  1. uboot初体验-----趣谈nand设备发起的浅显理解

    1 选择Uboot版本号 2 移植uboot至console正常work 3 制造uImage和使用uboot指南 4 写NFC驱动器 5 uboot从nand启动引导系统 1 选择Uboot版本号 ...

  2. 项目管理 BUG管理 —— 禅

    眼下市场管理BUG该平台是非常,例如 QC(Quality Center) 国际顶级.功能强大但收费. Bugzilla 开源免费.功能还不错.但界面丑陋,配置繁琐. EasyBUG 在线式.无需配置 ...

  3. WPF的Timer控件的使用

    原文:WPF的Timer控件的使用 通过System.Threaing.Timer控件来实现“初始加载页面时为DataGrid的模版列赋初始值” System.Threaing.Timer的用法: 步 ...

  4. Swift 的 Currying 特性 | SwiftCafe 咖啡时间

    Currying 也是 Swift 的众多先进特性之一,用一句话说就是将接受多个参数的函数,转变成每次之接受一个参数的调用序列. 上面一句话说得可能大家感觉不是那么清楚,那么没关系,咱们举一个例子来说 ...

  5. 阿里云访问控制(RAM)授权子账户管理磁盘快照

    阿里云 RAM 控制台没有提供管理磁盘快照的系统策略,需要自己添加自定义授权策略. 操作步骤: 进入 RAM 控制台 -> 策略管理,点击"新建授权策略" 选中"空 ...

  6. WPF最大化避免覆盖任务栏

    原文:WPF最大化避免覆盖任务栏 WPF当窗体WindowStyle=”None”时,最大化会覆盖掉任务栏.如何解决这个问题呢? 我在Google里面搜到一篇文章,要用到Win32 API,通过让WP ...

  7. 从PRISM开始学WPF(番外)共享上下文 RegionContext?

    原文:从PRISM开始学WPF(番外)共享上下文 RegionContext? RegionContext共享上下文 There are a lot of scenarios where you mi ...

  8. thinkphp5 的一些笔记

    Model里面的一些属性添加 protected $resultSetType = 'collection'; protected $autoWriteTimestamp = 'timestamp'; ...

  9. WPF,通过修改dataGrid的cell的style,改变选中行失去焦点时的颜色 4.0可用

    <Style TargetType="{x:Type DataGridCell}"> <Style.Triggers> <Trigger Proper ...

  10. Win8 Metro(C#)数字图像处理--2.50图像运动模糊

    原文:Win8 Metro(C#)数字图像处理--2.50图像运动模糊  [函数名称] 图像运动模糊算法    MotionblurProcess(WriteableBitmap src,int  ...