Oracle WorkFlow(工作流)(二)

2.4消息(Message)
消息主要是为通知服务的,可以把消息当作通知的内容和类型。消息也属于一个单据类型,通知只能和同一个单据类型里的消息相关联。
每个消息可以有一个或多个属性和自己相联系,消息的属性既可以是独立的属性,也可以是对单据类型属性的一个引用。在消息体内可以对消息的属性进行引用,这样在流程的实例里,如果已经对消息的属性赋值,则在引用消息属性的地方会自动的用消息属性的值替换。我们就可以在消息体内显示必要的信息。
你可以对一个消息定义自动流转规则,这样在工作流的实例里,当流转到和该消息对应的通知活动的时候,工作流引擎就会根据用户定义的自动流转规则自动向下流转,用户就不需要参与了。
消息时工作流程里通知活动发送给角色的内容,消息可以提示户对通知进行回复或者让用户采取一个动作决定下一个活动,在工作流里一个消息的接收者被称作"Performer";每个消息都和一个单据类型联系在一起,这样可以允许消息引用单据类型属性,在运行时进行标记替换。
当你定义消息的时候,可以指定接收者回复的值,然后工作流引擎根据用户的返回值决定流程的下一个活动,你也可以在消息的主题和消息体内包括消息属性使消息成为一个上下文环境敏感的消息。你可以从浏览树里直接把一个消息直接拖拽到通知分支下面创建一个发送该消息的通知,也可以把消息拖拽到一个已存在的通知活动上更新通知发送的消息。
当你为通知活动创建一个通知的时候,你需要注意通知是否规定了一个结果类型,如果有结果类型的话,你创建的通知需要提示通知接收者一些特定的响应用来解释通知的结果类型,工作流引擎使用这些结果决定流程需要流到哪些活动。要想创建一个对特殊响应进行提示的消息,你需要完成消息页面的"Result"页,你输入的信息创建了一个特殊的"Response"消息属性,它有一个内部名称"RESULT",结果消息属性的数据类型是一个查找类型,并且必须和通知的结果查找类型一致,这可以保证通知活动的执行者从一个通知活动期望的结果值列表里选择一个值。
一旦你创建了一个消息,你可以为消息定义需要的所有属性,在浏览树里消息的属性存放在消息的下面。消息属性的来源(Send or  Respond)决定了消息属性的使用方式,你可以使用"Send"类型的消息属性进行标记替换或者和消息一块发送。每个消息类型都有一个数据类型,"Send"类型的消息属性可以是一个常量或者是一个对单据类型属性的引用。"Response"类型的消息属性组成了消息的响应部分,响应消息属性为接收者的响应提供了指令。如果你定义了一个响应消息属性,你必须给它指定数据类型,你也可以给它指定一个默认值,默认值可以是一个常量,也可以是对相同数据类型单据类型属性的引用。
创建一个消息:

  • § 从浏览树里选择一个单据类型子树中的Messages,然后右键并从菜单里选择"New Message",消息属性页面就会出现;
  • § 为消息提供一个大写的内部名称,一个显示名称,你可以为消息输入一段描述性的信息;
  • § 为消息选择一个默认的优先级,消息的优先级只是提醒接收者消息的紧急程度,对消息的传送和处理没有影响;
  • § 保存你的修改;
  • § 选择"Body"页定义消息体;
  • § 主题会有一个和消息显示名称一样的默认值,你可以保存这个默认的主题或者输入一个新的主题,消息的主题可以包含消息的属性,在运行时通过标记替换来赋值。
  • § 在消息体输入框内输入一段纯文本信息,Oracle工作流使用你输入的文本生成通知消息的一个文本版本,这段文本消息可以从一个E-mail阅读器里查看;
  • § 你也可以输入一个HTML格式的消息体,同时也可以从一个HTML文件里导入,注意,当你输入或导入HTML文件的时候,不要包括<Body>...</Body>HTML标记,如果你包括了这些标记,Oracle工作流只是简单的抽取这些标记之间的内容,<Body>标记之前的内容。Oracle工作流使用你在HTML消息体内的内容为通知消息生成一个HTML格式的版本,你可以从通知的详细页面来查看HTML格式的通知消息或者从一个E-mail阅读器来查看HTML格式的消息或者HTML格式的附件,如果你的HTML消息体的内容是空的,工作流会使用你在文本消息体内输入的内容生成通知消息。另外一个需要注意的问题是,Oracle工作流不能识别消息体内的图标和图像文件。
  • § 你可以再消息体内包括消息的属性,这样在运行的时候,可以使用消息属性的值进行标记替换。
  • § 保存你所作的修改。
  • § 选择"Role"页面规定访问该消息的角色信息;
  • § 选择"Access"页面规定允许修改消息的访问级别;
  • § 如果你想让通知消息提示"Performer"返回一个结果值并且希望Oracle工作流引擎把消息的结果值解释为通知活动的返回结果值,你需要选择"Result"页完成要求的信息,Oracle工作流使用你在该页面上输入的信息生成一个叫做"Result"的特殊"Response"类型的消息属性;在该页面上输入一个显示名称和一段描述性的信息,并在列表里选择一个查找类型,你选择的查找类型应该和通知或定的结果查找类型一致,在默认值区域里选择一个查找类型编码;
  • § 保存你所作的修改;
  • § 你刚定义的消息会出现在浏览树的Messages分支下面,你可以双击这个消息来查看或修改消息的信息;
  • § 你必须定义所有包含在消息主题和消息体内的消息属性;
  • § 如果你想创建一个引用单据类型属性的消息,从浏览树里选择一个单据类型属性并把它用鼠标拖拽到消息上,你必须在消息属性窗口里编辑该属性,确保消息属性有正确的来源。默认值区域会自动的设置成单据属性并引用原始的单据属性;
  • § 你也可以创建一个不引用已存在单据类型属性的消息属性;

2.5函数(Function)
函数就是一个可以自动执行的活动,该活动可以完成一定的功能,函数活动通常和一个PL/SQL存储过程或者一个Oracle内部的过程联系在一起,在定义函数活动的时候必须定义该函数对应的过程名称。
函数类型的活动有自己的参数定义,函数活动的参数主要是为对应的过程服务的。在运行的时候通过给函数活动的参数赋值,经过相应的处理之后,工作流引擎就会把函数活动的参数值传给相应的过程,这样就能保证函数的正确执行。如果对应的过程没有参数的话,可以不定义参数。
创建一个Function:

  • § 从浏览树选择一个单据类型,右键Function并从菜单里选择"New Function",在活动属性页里定义函数活动的信息;
  • § 为函数活动提供一个大写的内部名称以及显示名称,你也可以一段描述活动的摘要信息;
  • § 输入函数活动执行的函数名称,并选择函数的类型;
  • § 选择函数活动的结果类型,
  • § 输入函数活动的时间花费;
  • § 选择一个标识函数活动的图标;
  • § 保存你的修改
  • § 选择"Details"页面显示或修改活动的详细信息;
  • § 选择"Roles"页面制定访问活动的角色信息(这个功能可能在将来的版本里支持);
  • § 选择"Access"页面规定允许修改活动的访问信息;
  • § 新定义的函数活动会出现在浏览树里的"Functions"分支下面,你可以用鼠标双击这个函数活动来查看和修改函数活动的信息。
  • § 如果你的函数需要输入参数,你可以为函数活动定属性。

2.6通知(Notification)
通知活动对一个人或一个角色发送一个通知,通知必须和一个消息联系在一起。通知活动有自己的结果类型,返回的结果一般是根据用户的交互产生的,除非你在消息里定义了自动流转规则。
创建一个Notification:

  • § 从浏览树里选择一个单据类型,右键Notification并从菜单里选择"New Notification",在出现的活动窗口里定义通知活动;
  • § 通知活动必须有一个大写的内部名称,另外还必须有一个显示名称,你也可以为通知定义一段描述信息对通知活动进行描述。
  • § 指定通知活动的结果类型(一个定义好的查找类型),结果类型是一个可能返回结果的列表,你的工作流会根据活动的返回结果进行分支处理。你的通知活动也可以没有返回结果。
  • § 选择你的通知想发送的消息名称;
  • § 如果你想把通知指定给一个包含多个人的角色,并且给角色里的每一个人发送一份通知的拷贝,选择"Expand Role",如果你把选择该选项,就给整个角色发送一个通知的拷贝。
  • § 你可以在"Function"域里指定一个PL/SQL存储过程,这就是一个"Post-Function"函数,工作流引擎会根据用户的响应在不同的模式下执行这个函数,可能的模式类型有:Respond、Forward、Time Out和Transfer;
  • § 为活动选择一个图标按钮,便于在流程图里标识活动;
  • § 保存你的修改;
  • § 选择"Details"页面显示或修改活动的详细信息;
  • § 选择"Roles"页面制定访问活动的角色信息(这个功能可能在将来的版本里支持);
  • § 选择"Access"页面规定允许修改活动的访问信息;
  • § 保存你的修改;
  • § 新定义的通知活动会出现在浏览树里的"Notifications"分支下面,你可以用鼠标双击这个通知活动来查看和修改通知活动的信息。


2.7查找类型(Lookup Type)
查找类型是你定义的一些枚举数据,单据类型里的查找类型主要用来表达活动结果返回值类型,另外也可以在定义单据类型属性、活动属性、消息和消息属性时引用查找类型,一个查找类型有自己相应的值列表,在引用查找类型的时候,你只需要定义查找类型就可以了,和查找类型相关的值会自动过去的。
查找类型是一个静态值列表,这些列表可以被活动、单据类型、消息或属性引用,例如一个活动可以引用一个查找类型作为它可能的返回值。
当你定义一个查找类型的时候,你必须把它和一个单据类型联系起来;然而,但你在创建一个活动或属性的时候,你可以引用但前数据存储里的任何查找类型,不论这个查找类型和哪个单据类型联系在一起。
    创建一个Lookup Type:

  • § 从浏览树里选择一个单据类型,然后右键从菜单中选择"New",一个查找类型属性页就会出现;
  • § 查找类型有一个大写的内部名称、一个显示名称,你也可以输入一段描述性的摘要信息,在引用查找类型的时候,需要指定它的内部名称;
  • § 选择"Access"页定义允许修改查找类型的访问级别;
  • § 保存你的修改;
  • § 新定义的查找类型会出现在浏览树的"Lookup Types"分支下面,你可以在今后双击该查找类型来查看和修改它的属性;
  • § 为查找类型定义编码:
  • Oslash; 选择一个查找类型,右键并从菜单里选择"New Lookup Code",一个查找编码属性页会出现;
  • Oslash; 输入大写的内部名称、显示名称,你也可以输入一段摘要信息;
  • Oslash; 保存你的修改;
  • Oslash; 新定义的查找类型编码会在相对应的查找类型下面出现。

3工作流引擎

3.1概览

  • Oslash; 工作流引擎是运行在数据库服务器端的PL/SQL程序
  • Oslash; 工作流引擎任何时候都处于激活状态,只要它的PL/SQL过程或函数被调用
  • Oslash; 工作流引擎管理着每个工作流流程实例的活动
  • Oslash; 当一个活动完成后,工作流引擎决定了下一个将被运行的活动
  • Oslash; 工作流引擎自动执行工作流的功能活动
  • Oslash; 工作流引擎会调用通知系统给用户发送通知(通知系统也是运行在服务器端的PL/SQL程序,它可以和ORACLE的WEB代理进行接口或者通过 ‘通知邮递员'程序来给最终用户发通知)。
  • Oslash; 将对系统资源消耗比较大的活动推迟,由后台引擎来运行
  • Oslash; 侦测错误并执行处理错误的流程

3.2启动工作流流程

要在应用中调用工作流的流程(例如:在采购订单的FORM中调用‘审批采购订单'的工作流流程),必须在应用的程序中使用启动工作流流程的工作流引擎API:调用WF_ENGINE.CreateProcess接着调用WF_ENGINE.StartProcess或单独调用WF_ENGINE.LaunchProcess。在这些API中都必须指定ITEM_TYPE和ITEM_KEY的值作为参数。

3.3活动的状态

当工作流引擎执行一个活动时,它将修改活动的状态为以下的值之一:
  • Oslash; Active:活动当前正在被执行,例如主流程活动一直处于活动状态直到盖流程中的所有活动都已完成
  • Oslash; Complete:活动已经执行完毕,并且执行成功
  • Oslash; Waiting:活动正等待相关活动的完成,一个活动尽管已经运行结束,但它必须等待相关的活动也运行结束才能被标记为Complete
  • Oslash; Notified:活动正在等待通知的回应
  • Oslash; Deferred:活动被推迟到后台运行
  • Oslash; Error:活动在执行过程中出错
  • Oslash; Suspend:活动被暂挂,在暂挂被取消后将继续运行

3.4通知工作流引擎

在一个活动结束后必须通知工作流引擎。流程、通知和功能活动结束后会自动调用WF_ENGINE.CompleteActivity来通知工作流引擎它们已经运行结束。如果一个功能活动调用的是一段外部程序,那么外部程序需要调用WF_ENGINE.CompleteActivity,在活动结束的时候。

3.5工作流引擎的数据库包

工作流引擎是由一些PL/SQL的数据库包组成的,大致包括:
  • ü WF_ENGINE:用来启动和运行工作流流程,获取、写入或创建项目类型Attribute、功能活动Attribute的值,管理活动的状态
  • ü WF_CORE:触发和捕获错误
  • ü WF_PURGE:清除无用的运行的中间数据
  • ü WF_DIRECTORY:用来存入和获取目录服务的信息
  • ü WF_MONITOR:生成工作流监控页面的URL
  • ü WF_NOTIFICATION:管理工作流的通知
  • ü WF_PREFERENCE:检索用户的偏好信息
3.6工作流相关的主要表结构
  • Oslash; wf_item_types_vl

保存工作流的定义,即类(大的种类,如:OEOH、OEOL)

  • Oslash; wf_activities

保存当前系统中的工作流的名称(一个版本一条信息)

  • Oslash; wf_items

保存实际的工作流,或者说工作流的对象实例

例如:每当生成一条SO时,系统往里面插入一条记录(一行一条记录)

  • Oslash; wf_process_activities

工作流每个NODE的属性信息

  • u process_item_type : item_type
  • u PROCESS_NAME : 工作流的名称
  • u PROCESS_VERSION :工作流的版本信息
  • u ACTIVITY_ITEM_TYPE : 节点的ITEM类型
  • u ACTIVITY_NAME : 节点 ITEM 的名称
  • u INSTANCE_ID : 节点 ID
  • u INSTANCE_LABEL : 节点显示的 LABEL 标记
  • Oslash; WF_ACTIVITY_ATTRIBUTES

保存工作流实例的attribute最新值

  • Oslash; wf_item_activity_statuses

保存工作流实例的各个activity的状态,比如完成否,返回值

  • Oslash; wf_notifications

保存工作流实例的notifications消息,基本是按顺序的,可以看发给谁了

  • Oslash; wf_roles

角色视图,工作流引用角色的依据,有mail地址等信息

  • Oslash; wf_user_roles
原文地址:https://www.cnblogs.com/wanghang/p/6299262.html