`

WorkFlow

    博客分类:
  • NET
 
阅读更多
最近正在学习工作流,正好从网上搜索到一个Asp.net工作流(WWF+LINQ)的例子,之前学习MOSS时接触过工作流,不过那是针对MOSS的工作流,我一直从事B/S架构开发,知道工作流可用于很多环境,其中就包含asp.net,这让我非常想做一个这样的实例。看了它的源码,大部分都觉的非常不错,不过也有些个人认为不太满意的地方,这可能是因为作者考虑到只是一个简单的demo,没有必要注意一些非技术方面的细节问题。

  项目介绍:一个报销二级审批工作流,数据层操作采用LINQ TO SQL,虽然MS不再发展示它。

  第一级:员工提交报销表给PM(经理),如果数目大于1000RMB,经理如果选择通过审批,工作流会到副总的二级审批,同时经理可以直接选择拒绝。

  第二级:PV(副总),副总收到PM的审批后,可以选择通过或者是拒绝,如果通过,工作流会提交到财务。由财务最后结束工作流。

  流程图如下:

  





  我创建的工作流与原作者的源码有以下几点不同:1:原文的工作流采用的是状态机工作流,而这里我采用顺序工作流。

  2:把数据操作部分和业务逻辑以及页面层功能完全分开,即,只要是和数据访问,操作相关的代码只允许出现在数据处理层中,而业务逻辑层以及页面层均不允许,页面层只和业务逻辑层沟通,不允许直接访问数据处理层。

  3:工程的命名上有改动,例如:解决方案名称:ApproveWorkFlow, 页面层叫ApproveWorkFlow.Web. 4:对相关的方法做了适当的改进。

  5:增加方法以及文档注释。

  项目结构图如下:项目结构说明:1:ApproveWorkFlow.BLL:业务逻辑层。

  2:ApproveWorkFlow.Common,可以放些常用的方法,就是常说的工具类。

  3:ApproveWorkFlow.DAL,数据处理层,数据的增删改查。

  4:ApproveWorkFlow.Data,数据库的连接类,这里我放了一个dbml文件。

  5:ApproveWorkFlow.Model,实体类。

  6:ApproveWorkFlow.MyInterface,接口层。

  7:ApproveWorkFlow.MyWorkFlow,工作流。

  8: ApproveWorkFlow.Web,页面层。

  WF中的持久化服务:SqlWorkflowPersistenceService是WF框架中的一个SQL持久性服务(支持SQL Server2005)。在安装DotNet时并不会自动安装此类所需要的数据库。要正确使用此类必需执行以下步骤:1:打开Sql Server Management Stuio. 2:新建一个数据库SqlPersistenceService,这个名字可以更改。

  3:执行相关数据库脚本:1:%WINDOWS%"Microsoft.NET"Framework"v3.0"Windows WorkflowFoundation"SQL"EN"SqlPersistenceService_Schema.sql. 2:%WINDOWS%"Microsoft.NET"Framework"v3.0"Windows Workflow Foundation"SQL"EN"SqlPersistenceService_Logic.sql.创建报销审批工作流:1:在设计面板中拉一个WhileActivity;2:在代码中加入一个属性,标记while的执行条件:!this.IsCompleted /// /// 工作流的while条件/// private Boolean isCompleted = false;public Boolean IsCompleted { get { return isCompleted; } set { isCompleted = value; } } 3:拉一个SequenceActivity. 4:再放一个ListenActivity,也叫单线触发容器,使用EventDrivenActivity作为分支容器,当某条分支中的结点执行完成后,该ListenActivity结点就结束,继续向下执行,其他分支内的结点就不执行了,它不能应用于状态机工作流。

  5:加入所有的EventDrivenActivity. 6:创建一个供EventDrivenActivity用的接口IApprove /// /// 这个接口标示为"ExternalDataExchange",目的是供工作流调用/// [ExternalDataExchange] public interface IApprove { /// /// 员工提交报销记录事件/// event EventHandler OnStaffSubmit;/// /// 员工删除报销记录事件/// event EventHandler OnStaffDelete;/// /// 小额数据PM审批通过事件/// event EventHandler OnPMSubmitMin;/// /// 大额数据PM审批通过事件/// 同时提交给副总审批/// event EventHandler OnPMSubmitMax;/// /// PM拒绝审批事件/// event EventHandler OnPMReject;/// /// 副总审批通过事件/// event EventHandler OnVPSubmit;/// /// 副总拒绝审批事件/// event EventHandler OnVPReject;/// /// 财务通过审批事件/// event EventHandler OnFinanceSubmit;} 7:设置EventDrivenActivity的属性:EventName,InterfaceType,Name,Invoked.InterfaceType选择第六步创建的接口。所有的工作流事件代码如下:注意: 财务审批事件(OnFinanceSubmit_Invoked)是工作流最后一步,所以工作流的完成标志也要在这完成。

  private void OnStaffSubmit_Invoked(object sender, ExternalDataEventArgs e)

  { BllExpense Bll = new BllExpense();info = e as ExpenseAccountInfo;info.AppStatus = "等待PM审批";Bll.AddRecord(info);} private void OnStaffDelete_Invoked(object sender, ExternalDataEventArgs e)

  { BllExpense Bll = new BllExpense();info.AppStatus = "结束";Bll.UpDateRecord(info);} private void OnPMSubmitMin_Invoked(object sender, ExternalDataEventArgs e)

  { BllExpense Bll = new BllExpense();info.AppStatus = "审批通过";Bll.UpDateRecord(info);} private void OnPMSubmitMax_Invoked(object sender, ExternalDataEventArgs e)

  { BllExpense Bll = new BllExpense();info.AppStatus = "等待VP审批";

  Bll.UpDateRecord(info);} private void OnPMReject_Invoked(object sender, ExternalDataEventArgs e)

  { BllExpense Bll = new BllExpense();info.AppStatus = "PM拒绝审批";Bll.UpDateRecord(info);} private void OnVPSubmit_Invoked(object sender, ExternalDataEventArgs e)

  { BllExpense Bll = new BllExpense();info.AppStatus = "审批通过";Bll.UpDateRecord(info);} private void OnVPReject_Invoked(object sender, ExternalDataEventArgs e)

  { BllExpense Bll = new BllExpense();info.AppStatus = "VP拒绝审批";Bll.UpDateRecord(info);} private void OnFinanceSubmit_Invoked(object sender, ExternalDataEventArgs e)

  { BllExpense Bll = new BllExpense();info.AppStatus = "结束";Bll.UpDateRecord(info);//结束工作流this.IsCompleted = true;} 8:创建一个业务逻辑类BLL_Approve来实现IApprove. public class BLL_Approve:IApprove { public event EventHandler OnStaffSubmit;public event EventHandler OnStaffDelete;public event EventHandler OnPMSubmitMin;public event EventHandler OnPMSubmitMax;public event EventHandler OnPMReject;public event EventHandler OnVPSubmit;public event EventHandler OnVPReject;public event EventHandler OnFinanceSubmit;public void RaiseStaffSubmit(ExpenseAccountInfo info)

  { if (OnStaffSubmit != null)

  { OnStaffSubmit(null, info);} public void RaiseStaffDelete(ExpenseAccountInfo info)

  { if (OnStaffDelete != null)

  { OnStaffDelete(null, info);} public void RaisePMSubmitMin(ExpenseAccountInfo info)

  { if (OnPMSubmitMin != null)

  { OnPMSubmitMin(null, info);} public void RaisePMSubmitMax(ExpenseAccountInfo info)

  { if (OnPMSubmitMax != null)

  { OnPMSubmitMax(null, info);} public void RaisePMReject(ExpenseAccountInfo info)

  { if (OnPMReject != null)

  { OnPMReject(null, info);} public void RaiseVPSubmit(ExpenseAccountInfo info)

  { if (OnVPSubmit != null)

  { OnVPSubmit(null, info);} public void RaiseVPReject(ExpenseAccountInfo info)

  { if (OnVPReject != null)

  { OnVPReject(null, info);} public void RaiseFinanceSubmit(ExpenseAccountInfo info)

  { if (OnFinanceSubmit != null)

  { OnFinanceSubmit(null, info);} 9:把工作流加入到asp.net中:具体方法见代码,相关方法应用可参考MSDN. BllExpense Bll;static WorkflowRuntime runtime;//运行时static WorkflowInstance instance;//实例static ExternalDataExchangeService service;//外部数据交换服务static WorkflowPersistenceService perService;//持久化服务static BLL_Approve project;//实现接口类protected void Page_Load(object sender, EventArgs e)

  { Bll = new BllExpense();if (!IsPostBack)

  { runtime = new WorkflowRuntime();service = new ExternalDataExchangeService();project = new BLL_Approve();perService = new SqlWorkflowPersistenceService(ConfigurationManager.ConnectionStrings["perstr"].ConnectionString);if (runtime.GetService(service.GetType()) == null)

  //服务不能重复加入{ runtime.AddService(service);} if (runtime.GetService(perService.GetType()) == null)

  { runtime.AddService(perService);} if (service.GetService(project.GetType()) == null)

  { service.AddService(project);//将此类加入外部数据交换服务} runtime.WorkflowIdled += OnWorkflowIdled;//工作流闲置事件runtime.StartRuntime();} public void OnWorkflowIdled(object sender, WorkflowEventArgs e)

  { e.WorkflowInstance.TryUnload();//将内存数据持久化到数据库中} 10:用户提交数据启动工作流。

  //创建一个工作流实例instance = runtime.CreateWorkflow(typeof(ApproveWorkFlow.MyWorkFlow .Workflow1 ));//启动工作流instance.Start();ExpenseAccountInfo info = new ExpenseAccountInfo(instance.InstanceId,Convert.ToDecimal(this.tbMoney.Text), this.tbName.Text,DateTime.Now.ToShortDateString(), "等待PM审批", this.tbNotes.Text);//触发工作流相应事件project.RaiseStaffSubmit(info);11:审批者审批工作流。

  Guid workflowId = new Guid(this.tbNo.Text);//根据报销单号取得一个未完成的工作流实例runtime.GetWorkflow(workflowId);ExpenseAccountInfo info = new ExpenseAccountInfo (workflowId, Convert.ToDecimal(this.tbMoney.Text), this.tbName.Text,DateTime.Now.ToShortDateString(), "", this.tbNotes.Text);if (info.Amount < 1000)

  { info.AppStatus = "审批通过";//触发工作流事件project.RaisePMSubmitMin(info);} else { info.AppStatus = "等待VP审批";//触发工作流事件project.RaisePMSubmitMax(info);}总结:本文并非原创,是以别人代码为基础,做了些改动,让它更接近一个真实的项目。
  • 大小: 28.7 KB
分享到:
评论

相关推荐

    Hue-workflow配置流程

    Hue的Workflow(工作流)组件则是用于构建和管理复杂的Hadoop作业流程,允许用户通过拖拽操作来设计数据处理任务,而无需编写复杂的命令行脚本或Java代码。在本文中,我们将深入探讨如何使用Hue配置和运行一个...

    Fire Workflow工作流开发程序包

    "Fire Workflow工作流开发程序包"是一个专门针对工作流管理系统的开发工具,旨在帮助程序员和系统架构师设计、实现和管理复杂的工作流程。这个程序包包含了一整套用于工作流开发的工具和资源,旨在提高工作效率,...

    snaker-workflow源码加配置文件

    Snaker Workflow是一款开源的工作流引擎,它主要用于企业的业务流程管理,提供了一套完整的流程定义、执行、监控和分析的解决方案。这个压缩包“snaker-workflow源码加配置文件”包含的是Snaker Workflow的核心源...

    workflow实现的源代码

    【标题】"workflow实现的源代码"涉及到的是工作流(Workflow)系统在信息技术中的实际应用,尤其是OA(Office Automation)系统的开发。工作流系统是一种自动化业务流程的技术,它能够管理和控制文档、信息或任务在...

    Windows Workflow Foundation构建工作流应用

    ### Windows Workflow Foundation 构建工作流应用 #### 一、Windows Workflow Foundation 概览 **Windows Workflow Foundation (WF)** 是由微软开发的一个用于构建工作流应用程序的框架。它旨在为开发者提供一个...

    数据库WorkFlow表结构

    数据库WorkFlow表结构 数据库WorkFlow表结构是小型工作流系统的一种解决方案,该表结构主要由五个表组成:flow_form_type、flow_type、flow_process、flow_run和flow_run_prcs。每个表都有其特定的字段和关系,用于...

    使用js编写的Workflow

    【标题】"使用js编写的Workflow"涉及到的主要知识点是JavaScript编程和工作流(Workflow)的实现,特别是如何在Web环境中创建一个支持拖放功能的工作流系统。JavaScript是一种广泛用于前端开发的脚本语言,它允许...

    搜狗服务器引擎Workflow v0.11.2.zip

    "搜狗服务器引擎Workflow v0.11.2.zip" 是一个包含软件工具、源码源代码、毕业设计论文和计算机案例的压缩包文件。这个版本的Workflow是搜狗公司针对服务器端工作流程管理的一个解决方案,它可能包含了用于处理、...

    SAP workflow与外部邮箱集成

    SAP Workflow 是 SAP 系统中的一个强大工具,它允许自动化和管理企业的各种业务流程,如审批流程。在本文中,我们将深入探讨如何将 SAP Workflow 与外部邮箱集成,以便通过电子邮件进行审批流程。这个集成使得审批者...

    高效易用Django流程引擎源码 - django-lb-workflow

    项目概述:django-lb-workflow 是一个基于Python的高效易用Django流程引擎源码,旨在轻松集成至现有系统。该项目主要由68个Python文件、30个HTML文件以及其他相关文件构成,共计136个文件。其中还包括了HTML模板、...

    workflow_springbootworkflow_workflowdemo_workflowspringBoot_work

    工作流(Workflow)是软件系统中用于管理业务流程自动化的重要技术,它可以帮助组织或企业实现流程规范化、提高工作效率。在本项目"workflow_springbootworkflow_workflowdemo_workflowspringBoot_work"中,开发者...

    dotnet-WorkflowCore是一款针对NET标准的轻量级工作流引擎

    《深入理解dotnet-WorkflowCore:打造.NET标准的轻量级工作流引擎》 在.NET开发领域,WorkflowCore是一款备受瞩目的轻量级工作流引擎,它专为.NET标准设计,旨在简化工作流的实现与管理。本文将深入探讨Workflow...

    lotus的workflow教程

    回想自己学习Domino Workflow的经历,也算有些坎坷,因为这方面的资料很少,Domino Workflow的帮助库虽然比较完整,但是缺乏一个主线,而且没有一些实用技巧的介绍。心中一直有一个想法,就是将自己掌握的Domino ...

    workflow 工作流引擎c#版本 源码

    工作流(Workflow)是一种自动化业务过程的技术,它允许在组织内部或跨组织执行一系列任务,按照预定义的规则和步骤进行。在IT领域,工作流引擎是实现工作流的核心组件,它负责管理和执行这些工作流程。C#是...

    最新鼎新WORKFLOW GP3.1.6.41全功能模块授权繁体简体双语安装版介绍

    鼎新WORKFLOW GP3.1.6.41是一款先进的工作流程管理系统,它集成了全面的功能模块,旨在提升企业的业务效率和管理水平。该系统不仅支持繁体和简体双语界面,更展现了其对不同地区用户的友好性,使得在多语言环境中...

    基于C++ Workflow的RPC框架

    本主题聚焦于使用C++ Workflow构建RPC框架,这是一种高效、灵活的方法来实现跨进程或跨网络的函数调用。 C++ Workflow是一个强大的库,它提供了异步编程模型,使得开发者可以编写出高性能、低延迟的并发代码。在...

    WinFrom的Workflow工作流的Hello World简单实例

    工作流(Workflow)是软件系统中用于自动化处理一系列任务或业务流程的技术,它允许开发者将复杂的业务逻辑分解为可管理的步骤。在Windows Forms(WinForms)应用中集成Workflow,可以构建用户友好的图形界面,同时...

    IBM Lotus Workflow 学习笔记

    【IBM Lotus Workflow 学习笔记】 IBM Lotus Workflow 是一种基于Lotus Domino平台的工作流管理系统,源自于德国开发商ONEStone公司的产品。在1999年被Lotus公司收购后,该工作流平台被重新命名为Domino Workflow,...

Global site tag (gtag.js) - Google Analytics