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
  • 相关阅读:
    java+selenium+new——同一个标签窗口里 ,访问多个网页的后退driver.navigate().back()、前进driver.navigate().forward()、刷新driver.navigate().refresh()等功能 。以及获取当前页面的title属性driver.getTitle()和获取当前页面的url地址driver.getCurrentUrl()
    SoapUI接口测试——关联——参数化
    SoapUI接口测试——添加测试套件——new TestSuite——(类似于postman里面的集合)——添加测试步骤——teststeps(测试步骤)
    java+selenium+new——获取网页源代码driver.getPageSource()
    g++命令行详解
    hdoj_1503Advanced Fruits
    指针遍历vector向量
    最长公共子序列
    hdoj_1087Super Jumping! Jumping! Jumping!
    pcc32应用1
  • 原文地址:https://www.cnblogs.com/shangfc/p/1067675.html
Copyright © 2011-2022 走看看