zoukankan      html  css  js  c++  java
  • [导入]WF示例之合同审批

      
           简单合同审批流程

    假设一个简单的合同审批流程,对每一个提交的合同,根据合同的不同金额自动发往不同的审批人(部门),审批人可以对合同进行通过或不通过的审批。使用WF设计的流程序如下。
     
    第一个节点(CallExtenalMethod)用于将合同信息保存到数据库中。紧接着的IFELSE用于判断合同的金额,以便将合同发往不的审批人。下面的Listen用于等待审事件(通过或不通过)的发生。
    业务服务类的设计
    <Serializable()> _
    Public Class ContractEventArgs
        Inherits ExternalDataEventArgs
     
        Private mOperatorName As String
     
        Public Sub New(ByVal instanceId As Guid, ByVal operatorName As String)
            MyBase.New(instanceId)
            mOperatorName = operatorName
        End Sub
     
        Public ReadOnly Property OperatorName() As String
            Get
                Return mOperatorName
            End Get
        End Property
     
    End Class
     
    ''' <summary>
    ''' 合同审批服务
    ''' </summary>
    ''' <remarks></remarks>
    <ExternalDataExchange()> _
    Public Interface IContractService
     
        ''' <summary>
        ''' 合同已经通过审批
        ''' </summary>
        Event ContractPassed As EventHandler(Of ContractEventArgs)
     
        ''' <summary>
        ''' 合同没有通过审批
        ''' </summary>
        Event ContractNoPassed As EventHandler(Of ContractEventArgs)
     
        ''' <summary>
        ''' 提交合同审批申请,将合同内容写入数据库
        ''' </summary>
        Function CreateContract(ByVal contractDate As Date, ByVal money As Double, ByVal content As String) As Contract
     
        ''' <summary>
        ''' 通过合同
        ''' </summary>
        Sub PassContract(ByVal id As String)
     
        ''' <summary>
        ''' 拒绝合同
        ''' </summary>
        Sub NoPassContract(ByVal id As String)
    End Interface
     
    业务服务类的定义要点
    接口上必须添加<ExternalDataExchange()>属性,否则不能作为ExternalDataExChangeService中的服务,事件参数必须从ExternalDataEventArgs类继承而来,否则不能被EventDrivenActivity捕获事件。引发事件时必须使用异步方式,代码如下:
        ''' <summary>
        ''' 引发PassContract事件
        ''' </summary>
        Public Sub RaisePassContraCTEvent(ByVal instanceId As Guid)
            ' Raise the event to the workflow
            ThreadPool.QueueUserWorkItem(AddressOf JustCloseTheTicket, _
                New ContractEventArgs(instanceId, "shangfc"))
        End Sub
     
     
        Public Sub JustCloseTheTicket(ByVal o As Object)
            Dim args As ContractEventArgs
            args = CType(o, ContractEventArgs)
     
            RaiseEvent ContractPassed(Nothing, args)
    End Sub
     
     
    在合同审批表单中应获得对应的WorkflowInstanceID,然后将此调用它的Load方法将它加载到内存中,然后从WorkflowRunTime中获取对应的业务服务(IContractService),并调用业务服务的方法来引发事件,从而驱动流程向下前进。代码如下:
    ''' <summary>
        ''' 通过合同的审批
        ''' </summary>
        Protected Sub btnPass_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPass.Click
            Dim rt As WorkflowRuntime = Application.Get("Workflow")
            Dim inst As WorkflowInstance = rt.GetWorkflow(New Guid(Label1.Text))
            inst.Load()
            Dim es As Workflow.Activities.ExternalDataExchangeService = rt.GetService(GetType(Workflow.Activities.ExternalDataExchangeService))
            Dim cs As ContractWorkFlow.IContractService = es.GetService(GetType(ContractWorkFlow.IContractService))
            cs.PassContract(Label1.Text)
    End Sub

    文章来源:http://blog.163.com/jhdzkfb22@126/blog/static/4584347520081111127378
  • 相关阅读:
    VS2005 无法启动调试 (如果你用的是IE8的)
    ClickOnce:部署,强制要求用户使用最新发布版本才可以执行软件的方法
    .Net 中的webBrowser控件加载网页时实现进度显示
    C# :DataGridView中使按下Enter键达到与按下Tab键一样的效果?
    Jquery:getJSON方法解决跨站ajax (json的解剖和运用) 附图片加载时的loading显示...
    GoogleMap : [Google Map]GMark事件运用(GEvent)
    Expression Designer系列工具汇总
    webBrowser:在extendedwebbrowser中实现IDocHostShowUI.ShowMessage 并判断或触发相应事件
    C#: 中文和UNICODE字符转换方法 及仿安居客地图实现。。。错误 GMap2未定义 解决办法 VB 中文转为UNICODE字符
    Jquery :Ajax 自动完成下拉列表。。。。。
  • 原文地址:https://www.cnblogs.com/shangfc/p/1067675.html
Copyright © 2011-2022 走看看