一、序列:
1.序列seq_os_wfentry:
OS_WFENTRY表的主键ID引用
create sequence seq_os_wfentry minvalue 10 increment by 10;
2.序列seq_os_currentsteps:
OS_CURRENTSTEP表的主键ID引用
create sequence seq_os_currentsteps;
二、表
1.OS_WFENTRY:
create table OS_WFENTRY
(
ID number, --工作流实例Id,引用seq_os_wfentry. Nextval
NAME varchar(20), --工作流名称,通过workflow的initialize方法传入
STATE integer, --工作流实例的状态
primary key (ID)
);
说明:
该表存储了工作流实例Id,名称及状态信息。
工作流实例的状态主要有以下几种:
public static final int CREATED = 0;//被创建
public static final int ACTIVATED = 1;//活动
public static final int SUSPENDED = 2;//挂起
public static final int KILLED = 3;// 杀死
public static final int COMPLETED = 4;//完成
public static final int UNKNOWN = -1;//未知
2.OS_CURRENTSTEP:
create table OS_CURRENTSTEP
(
ID number, --主键,引用seq_os_currentsteps.nextVal
ENTRY_ID number, --引用OS_WFENTRY的ID
STEP_ID integer, --引用流程定义文件step标记的Id属性值
ACTION_ID integer, --详见该表的说明
OWNER varchar(20), --该step的owner(拥有者)
START_DATE date, --step开始时间
FINISH_DATE date, --step结束时间
DUE_DATE date, --step的最后期限
STATUS varchar(20), --step的状态
CALLER varchar(20), --step的caller(调用者)
primary key (ID),
foreign key (ENTRY_ID) references OS_WFENTRY(ID),
foreign key (OWNER) references OS_USER(USERNAME),
foreign key (CALLER) references OS_USER(USERNAME)
);
说明:
存放当前步骤的表。
ACTION_ID,:该字段在一开始时为null,即表示当前step未执行任何action。当执行了一个action后,其result(可能是有条件结果,也可能是无条件结果)致使产生了一个新的step,此时将更新current step的ACTION_ID的字段为该action标记的id属性值,同时更新该currentstep的状态为该result的old-status,以及FINISH_DATE字段为当前时间。
START_DATE:新插入一条记录时的时间。
DUE_DATE:如果一个action的result致使了一个新的step,则该result的due-date属性的值为新的current-step的DUE_DATE字段的初始值。
STATUS:该字段的一般取值为”Underway”或”Finished”或”Queued”。
3.OS_HISTORYSTEP
create table OS_HISTORYSTEP
(
ID number, --历史step的Id
ENTRY_ID number, --所属工作流实例的Id,引用了OS_WFENTRY的ID
STEP_ID integer, --引用流程定义文件step标记的Id属性值
ACTION_ID integer, --引用了action标记的Id属性值,参考os_currentsteps
OWNER varchar(20), --历史状态下的step拥有者
START_DATE date, --STEP开始日期,参考OS_CURRENTSTEPS
FINISH_DATE date, --STEP结束日期,参考OS_CURRENTSTEPS
DUE_DATE date, --STEP最后期限, 参考OS_CURRENTSTEPS
STATUS varchar(20), --STEP状态,一般为”Finished”
CALLER varchar(20), --STEP最后调用者
primary key (ID),
foreign key (ENTRY_ID) references OS_WFENTRY(ID),
foreign key (OWNER) references OS_USER(USERNAME),
foreign key (CALLER) references OS_USER(USERNAME)
);
说明:
Osworkflow中的step都是经历了一个从currentstep到historystep的过程。
可能一个stepA成为currentstep后,经历一个动作(action)并完成其result(可能是有条件结果,也可能是无条件结果)后,会产生新的stepB并将其放到os_currentstep表中。在将新的stepB插入到os_currentstep表中之前必须先做另一件事就是:
(1) 先改变OS_CURRENTSTEP表中stepA的STATUS字段为该action标记的old-status属性值,更新stepA的ACTION_ID字段值为该action的id属性值,更新stepA的FINISH_DATE值为当前日期,更新stepA的CALLER字段为工作流上下文中的caller;
(2) 将stepA记录插入到OS_HISTORY表中;
(3) 将stepA在OS_CURRENTSTEP_PREV中的记录转移到OS_HISTORYSTEP_PREV表中(先插入到后表中,再从前表中删除);
(4) 将OS_CURRENTSTEP表中的stepA记录删除。
基于以上的逻辑可以更好理解OS_CURRENTSTEP,OS_HISTORYSTEP表,OS_CURRENTSTEP_PREV和OS_HISTORYSTEP_PREV之间的关系。
4.OS_CURRENTSTEP_PREV
create table OS_CURRENTSTEP_PREV
(
ID number, --引用OS_CURRENTSTEP表的ID
PREVIOUS_ID number, --引用OS_HISTORYSTEP表的ID
primary key (ID, PREVIOUS_ID),
foreign key (ID) references OS_CURRENTSTEP(ID),
foreign key (PREVIOUS_ID) references OS_HISTORYSTEP(ID)
);
5.OS_HISTORYSTEP_PREV
create table OS_HISTORYSTEP_PREV
(
ID number,
PREVIOUS_ID number, --引用OS_HISTORYSTEP表的ID
primary key (ID, PREVIOUS_ID), --引用OS_HISTORYSTEP表的ID
foreign key (ID) references OS_HISTORYSTEP(ID),
foreign key (PREVIOUS_ID) references OS_HISTORYSTEP(ID)
);
另外,osworkflow还利用了OpenSymphony的两个开源项目:osuser和osproperty,而这两个项目也提供了JDBC实现。在osworkflow提供的JDBC实现中也提供了这两个项目的表结构支持,表示如下:
项目名称 | 表 |
Osproperty项目 | OS_PROPERTYENTRY |
Osuser项目 | OS_USER |
OS_GROUP | |
OS_MEMBERSHIP |
现依次介绍:
6. OS_PROPERTYENTRY
create table OS_PROPERTYENTRY
(
GLOBAL_KEY varchar(255), --全局变量名称,"osff_" + entryId
ITEM_KEY varchar(255), --局部变量名称,某个属性的值
ITEM_TYPE smallint, --该属性的变量类型,
STRING_VALUE varchar(255), --属性字符串类型的值
DATE_VALUE date, --属性日期类型的值
DATA_VALUE blob, --属性字节数组的值
FLOAT_VALUE float, --属性float的值
NUMBER_VALUE numeric, --属性number的值
primary key (GLOBAL_KEY, ITEM_KEY)
);
7. OS_USER
create table OS_USER
(
USERNAME varchar(20), --用户名称
PASSWORDHASH varchar(2024), --加密过的密码值
primary key (USERNAME)
);
8.OS_GROUP
create table OS_GROUP
(
GROUPNAME varchar(20), --用户组的名称
primary key (GROUPNAME)
);
9.OS_MEMBERSHIP
create table OS_MEMBERSHIP
(
USERNAME varchar(20), --用户名称
GROUPNAME varchar(20), --组名称
primary key (USERNAME, GROUPNAME),
foreign key (USERNAME) references OS_USER(USERNAME),
foreign key (GROUPNAME) references OS_GROUP(GROUPNAME)
);
说明:
表OS_USER,OS_GROUP通过OS_MEMBERSHIP实现了多对多的关联,实现了一个用户群组角色管理。