WF工作流接口规范

                                                          WF工作流接口规范

       本工作流系统是面向系统开发人员的,所以该接口规范也仅适用于开发工作流业务的软件开发人员。

1工作流设计器接口规范

    工作流设计器工作流模板定义工具,通过设计器实现在一定业务范围内的流程自定义;

开发人员在使用设计器时,需要进行配置,要了解设计器中集成的基本元素(Activity)的功能、事件的绑定和属性的设置等;

1.1 设计器配置文件接口

配置文件的格式如下:

    <LocalServiceNode>

<LSDLL name ="WF1" value="LocalServiceLib1.dll" desc="市场竞价                            LocalService"></LSDLL>

<LSDLL name ="WF2" value="LocalServiceLib2.dll" desc="调度算法   LocalService"></LSDLL>

   </LocalServiceNode>

  该配置主要是实现LocalService的动态加载,LocalService 是工作流实现业务流程的核心,后面会详细介绍;

项目名称

描述

<LocalServiceNode></LocalServiceNode>

LocalService 节点标记

<LSDLL></LSDLL>

LocalService 动态连接库DLL标记节点

name

LocalService 的名称,最好用中文描述

Value

LocalService 动态连接库DLL名称

Desc

LocalService 对应的业务描述

 完成上面的配置文件后,需要把LocalService文件(dll)放到设计器所在的目录下,启动设计器后,设计器自动完成LocalService 的动态加载

 如果新增加一种业务LocalService,就需要在上面的配置文件中增加一条信息:

<LSDLL name ="WF3" value="LocalServiceLib3.dll" desc="新增业务LocalService"></LSDLL>

同时把LocalServiceLib3.dll文件放到设计器所在的目录,重新打开设计器即可;

1.2设计器使用规范

    工作流设计器采用的WF状态机的模式,状态机工作流主要采用的是事件驱动的方式;设计器主程序界面如下:

工作流设计器界面主要分三部分:功能目录与Toolbar功能按钮区、流程图形化设计区、Activity元素与属性设置区;

Activity元素与属性设置列表如下:

Activity元素名称

功能描述

主要属性设置

1、StateActivity

状态活动

Set as Initial State:设置状态开始状态;

Set as Completed State:设置状态为完成状态

Name 状态名称(英文字母)

2、EventDrivenActivity

事件驱动活动

该活动是状态活动实现事件驱动的主要元素;

Name:元素名称(英文字母)

3、HandleExternalEventActivity

绑定外部事件活动

InterfaceType:需要绑定的接口类型,对应的是LocalService接口对象;

EventName:需要绑定的接口事件,是选定接口对象中的接口事件

4、CallExternalMethodActivity

调用外部方法活动

InterfaceType:需要绑定的接口类型,对应的是LocalService接口对象;

MethodName:要调用的外部方法名;该方法是选定接口对象中定义的方法;

5、SetStateActivity

状态转换活动

该元素主要指向当前状态的下一状态,是工作流状态流转的出口;

TargetStateName:指向下一个状态的状态名称;

6、StateInitializationActivity

状态初始化活动

该活动主要是在状态开始运行前执行;主要用来处理状态运行前的初始化操作;在该活动中可以绑定其他的活动来实现对外部方法的调用,达到处理实际业务的目的;

7、StateFinalizationActivity

状态结束活动

该活动和StateInitializationActivity和刚好相反,它是在一个状态转向另一个状态之前执行;其它的处理和上面的类似;

8、DelayActivity

延时活动

对状态处理的延时情况的处理;

TimeOutDuration:延时时间间隔的设置;

9TerminateActivity

终止活动

用来结束一个工作流流程,当工作流非正常结束时将用到该活动;

   在实际的设计中,还包括“剪切”、“拷贝”、“粘贴”和“删除”等编辑操作,还包括流程图的“缩放”、“导航”、“展开”与“合并”等操作;

   在工作流流程设计完成后,点击保存,就生成序列化文件(*.XOML),既工作流模板文件;

1.3页面流接口规范

在工作流模板完成并保存成物理文件后,就可以对页面流信息进行设置,图示如下:

工作流的页面流信息是和状态信息绑定起来的,开始状态和结束状态一般不用绑定页面流信息;URL地址中填写的是页面的相对路径。

    URL参数设置完成后,点击确定,生成一个xml 文件,该文件和工作流模型文件同名,但后缀名不同;例如:工作流模型文件是:WFExpenseAccount.xoml,

也面流配置文件就位:WFExpenseAccount.xml;在实际的调用中可以直接进行修改。

    也面流文件格式示例如下:

<WFNodeRUL>

<forward StateName="WaitingForCreateState"   URL="CreateOrderBillandStartWF.aspx" />

 <forward StateName="OpenState" URL="EditOrderBill.aspx" />

 <forward StateName="ProcessedState"URL="ProcessOrderBill.aspx"    />

 <forward StateName="CompletedState" URL="CompletedOrderBill.aspx"   />

 </WFNodeRUL>

格式文件注解如下:

项目名称

描述

<WFNodeRUL></WFNodeRUL>

节点页面流标签

<forward/>

节点标签

StateName

工作流状态名属性

URL

状态对应的页面流地址

上面的工作完成后,把保存出来的物理文件(*.xoml、*.xml、*.cs)拷贝到调用项目的BIN目录下,工作流引擎就可以对这些文件进行加载调用。

2工作流引擎调用接口规范

    工作流引擎是工作流调用、执行、流转与监控的基础部分;工作流引擎对WF调用运行机制进行了封装,对外提供统一的调用接口;

    LocalService 动态加载参数配置文件格式如下:

<LocalServiceNode>

<LSDLL Name ="WF1" LocalServiceDLL ="WFLocalServicesLib" NameSpaceClass="StateMachineLocalService.StateMachineService" desc=""></LSDLL>

<LSDLL Name ="WF2LocalServiceDLL ="WFLocalServicesLib2" NameSpaceClass="WFLB.Orderbill" desc="订单类"></LSDLL>

</LocalServiceNode>

格式文件注解如下:

项目名称

描述

<LocalServiceNode></LocalServiceNode>

LocalService类型节点

<LSDLL></LSDLL>

LocalService 动态连接库(DLL)节点

Name

动态连接库名称(中文描述)

LocalServiceDLL

动态连接库物理文件名称

NameSpaceClass

LocalService命名空间加类名字符串

desc

LocalService 业务功能描述

  

上述配置文件配置好后,需要把LocalService动态连接库拷贝到项目程序的BIN目录下,引擎就可以对这些LocalService进行动态的加载;

   工作流对外提供的调用接口主要封装在WFWebUIService 类中;WFWebUIService类提供主要的功能函数列表如下:

功能函数名称

功能与参数描述

Public string StartWorkflow(string xomlFileName)

功能:创建一个新的工作流实例

参数:xomlFileName 工作流模板文件名称

返回值:工作流实例Guid 字符串

public string GetWFStateUrl(string xomlFileName, string curStateName)

功能:获得工作流状态邦定的页面流信息

参数:xomlFileName 工作六流模板文件名称

curStateName 工作流当前状态名

返回值:URL 地址串

public string GetWFCurrState(string wfInstanceId)

功能:获得当前工作流的状态

参数:wfInstanceId 工作流实例ID(必须是GUID,并且该工作流实例必须没有结束)

返回值:当前工作流的状态名

public void  RaiseEventDriven(DynamicForm form)

功能:通用事件驱动的调用端口

参数:DynamicForm 自定义参数输入类,主要封装的是HashTable,通过键值对的方式传入参数

返回值:无

public DataSet GetRecformExeSQL(string qyrSQL)

功能:获得数据库记录集

参数:qrySQL 操作数据库的SQL语句

返回值:DataSet 数据集

public DataSet GetRecFromExeProcedure(string strStoredProcedureName)

功能:执行没有不带参数的存储过程,返回数据集

参数:strStoredProcedureName 存储过程名称

返回值:DataSet 数据集

public DataSet GetRecFromExeProcedure(string strStoreProcedureName,SqlParameter[] sqlParameter)

功能:执行带输入参数的存储过程,返回数据集合

参数:StrStoreProcedureName 存储过程名称

sqlParameter 存储过程参数列表

返回值:DataSet 数据集

public void InsertOrUpdateFromExeProcedure(string strStoreProcedureName,SqlParameter[] sqlParameter)

功能:通过执行存储过程进行插入和更新数据库的操作

参数:sqlParameter 存储过程参数列表

返回值:无

public string[] GetStateRightsList(string  wfInstanceID, string stateName)

功能:获得实例状态的权限列表

参数:wfInstanceID 工作流实例ID

 

stateName 工作流状态名称

返回值:工作流状态权限列表

public string[] GetEventRightsList(string wfInstanceID, string stateName, string eventName)

功能:获得实例状态中事件的权限列表

参数:wfInstanceID 工作流实例ID

 

stateName 工作流状态名称

eventName 工作流状态中事件名称

返回值:工作流状态中事件列表权限列表

public ArrayList getBussinessStateList(string InstanceID)

功能:获得工作流实例业务状态列表

参数:InstanceID 工作流实例GUID字符串

返回值:实例业务状态列表

public ArrayList getActivityStateList(string InstanceID)

功能:获得节点Activity自身属性信息列表

参数:InstanceID 工作流实例GUID字符串

返回值:Activity自身属性信息列表

public ArrayList getWFInstanceOperList(string InstanceID)

功能:获得实例操作信息列表

参数:InstanceID 工作流实例GUID字符串

返回值:实例操作信息列表

public ArrayList getWFInstanceStateList(string strWFGuid)

功能:获得实例运行状态列表

参数:InstanceID 工作流实例GUID字符串

返回值:实例运行状态列表

 

 

3 LocalService 编写规范与接口规范

LocalService 服务是工作流业务流程实现的核心服务,所有的LocalService服务类都继承统一的接口IBaseLocalService,同时每个LocalService 都继承自己特定的接口,所有的LocalService 对外提供统一的调用方式;

    每个针对LocalService的借口必须以[ExternalDataExChange]属性来标记,以保证工作流和LocalService之间能进行数据交换;

    数据交互的方式是通过DynamicForm 对象来实现,DynamicForm 是自定义封装用于参数传递的类;

IBaseLocalService 接口代码示例(该接口定义不允许修改):

    /// <summary>

    /// 所有LocalService 的父类接口,对外保证统一的事件触发方式

    /// GeneralXU 07-05-06

    /// </summary>

    public interface IBaseLocalService

    {

        void RaiseEvent(DynamicForm form, Guid id);

}

LocalService 自身接口代码示例(该接口,开发人员根据实际的业务需要自己写):

namespace StateMachineLocalService

{

    /// <summary>

    /// GeneralXU 07-04-12

    /// </summary>

    [Serializable] //该类可以被序列化,但是不能继承

    public class StateMEventArgs : ExternalDataEventArgs

    {

        private DynamicForm _parameters;

        //"base" 关键字指在派生类创建时调用基类的构造函数

        public StateMEventArgs(Guid instanceId, DynamicForm parameters)

            : base(instanceId)

        {

            Parameters = parameters;

        }

 

        public DynamicForm Parameters

        {

            get { return _parameters; }

            set { _parameters = value; }

        }

 

    }

    //状态机LocalService接口

    [ExternalDataExchange]

    public interface IStateMachineService

    {

        //范型类型的参数,指定事件所生成的事件的数据类型

        //同时,EventHandler就是系统类库中声明的一个委托,这里用了委托的方式

        event EventHandler<StateMEventArgs> StateCreated;

        event EventHandler<StateMEventArgs> StateShipped;

        event EventHandler<StateMEventArgs> StateUpdated;

        event EventHandler<StateMEventArgs> StateProcessed;

        event EventHandler<StateMEventArgs> StateCanceled;

    }

 

}

LocalService 接口类代码示例(该接口类,开发人员根据实际的业务需要自己写):

namespace StateMachineLocalService

{

    /// <summary>

    /// GeneralXU 07-04-12

    /// </summary>

   //状态机LocalService类(接口的实现),是工作流对外的一个接口类;这里有委托和范型的使用

public class StateMachineService : IBaseLocalService,IStateMachineService

{

    #region IStateMachineService成员声明

        public event EventHandler<StateMEventArgs> StateCreated;

        public event EventHandler<StateMEventArgs> StateShipped;

        public event EventHandler<StateMEventArgs> StateUpdated;

        public event EventHandler<StateMEventArgs> StateProcessed;

        public event EventHandler<StateMEventArgs> StateCanceled;

    #endregion

 

       public StateMachineService()

        {

        }

 

        public void RaiseStateCreatedEvent(DynamicForm form, Guid instanceId)

        {

            if (StateCreated != null)

            {

                StateCreated(null, new StateMEventArgs(instanceId, form));

            }

        }

 

        public void RaiseStateShippedEvent(DynamicForm form, Guid instanceId)

        {

            if (StateShipped != null)

            {

                StateShipped(null, new StateMEventArgs(instanceId, form));

            }

        }

 

        public void RaiseStateUpdatedEvent(DynamicForm form, Guid instanceId)

        {

            if (StateUpdated != null)

            {

                StateUpdated(null, new StateMEventArgs(instanceId, form));

            }

        }

 

        public void RaiseStateProcessedEvent(DynamicForm form, Guid instanceId)

        {

            if (StateProcessed != null)

            {

                StateProcessed(null, new StateMEventArgs(instanceId, form));

            }

        }

 

       public void RaiseStateCanceledEvent(DynamicForm form, Guid instanceId)

        {

            if (StateCanceled != null)

            {

                StateCanceled(null, new StateMEventArgs(instanceId, form));

            }

        }

 

       

 

        #region IBaseLocalService 成员

        /// <summary>

        /// 公共接口实现引发事件

        /// </summary>

        /// <param name="form"></param>

        /// <param name="id"></param>

        public void RaiseEvent(DynamicForm form, Guid id)

        {

            string eventName = (string)form["eventName"];

            switch (eventName)

            {

                case "CreateState":

                    RaiseStateCreatedEvent(form, id);

                    break;

                case "ShipState":

                    RaiseStateShippedEvent(form, id);

                    break;

                case "UpdateState":

                    RaiseStateUpdatedEvent(form, id);

                    break;

                case "ProcessState":

                    RaiseStateProcessedEvent(form, id);

                    break;

                case "CancelState":

                    RaiseStateCanceledEvent(form, id);

                    break;

                default:

                    break;

            }

        }

 

        #endregion

    }

}

4工作流基础信息管理页面介绍

页面名称

功能描述

WFModelTypeMag.aspx

实现工作流基础类型的添加;

实现工作流模板的针对类型的归类

WFModelListSelMag.aspx

实现对工作流模板文件的按条件过滤,条件包括:文件名、创建人、创建时间、所属类型、业务描述等

实现对工作流模板的选择调用;

WFRightSetMag.aspx

实现对工作流状态和事件权限设置;

5工作流监控和工作流图形化展示

工作流监控制接口上面提到一些,另外还有一些通过对数据库表的操作来实现;另外还有一些特殊的接口,会根据实际应用中的业务需求提供;

工作流图形化展现,目前改变原来用几个图片简单展示状态的方式,目前采用VML技术动态输出流程(目前处在测试研究阶段),接口会在随后研发中定义出来。

原文地址:https://www.cnblogs.com/GeneralXU/p/775773.html