OA流程表单信息查询实现
如果要实现OA流程表单信息的查询,需要理解工作引擎的表单展示机制。工作引擎它封装了一套独有的表单控件,其可以设置控件的DataField绑定数据项,例如:
<SheetControls:SheetDataTrackLink ID="SheetDataTrackLink1" DataField="申请内容" runat="server" />
如上所示,控件绑定了数据项“申请内容”。
而数据项“申请内容”来自于设计流程时的表单模板,具体的值存放在了数据库的相关表的特定字段中。比如我们在流程设计器设计了一个流程,添加数据“申请内容”,设置模板类型为“公文类”,设置模板名称为“12345”,并发布。则,数据库中会新增表“I_公文类_12345”,其中表有字段“申请内容”。
这里我们要指出,一般地,我们将表单信息以及一些决定流程流转的关键性数据添加到流程模板(即数据库中对应的表中)。
另外我们需要关注的是,数据库的表InstanceContext存放了所有的流程,每一条流程诞生的时候,都会向其插入一条记录。H3数据库的表WorkItem存放了所有的工作项,每生成一条工作项,都会向其插入一条记录。
通过以上,我们得出流程信息查询的sql:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
declare
@var_WorkFlowName nvarchar(36);
select
@var_WorkFlowName=t.WorkflowName
from
WorkItem t
where
t.ObjectID=@pWorkItemID;
if (@var_WorkFlowName =
'123456'
)
begin
select
user_.
Name
as
drafter,
context.CreatedTime
as
draft_time,
unit.
Name
as
draft_department,
context.InstanceName
as
document_name,
case
context.Priority
when
0
then
'普通'
when
1
then
'急件'
when
2
then
'特急'
end
as
emergency,
I_.备注
as
remarks,
I_.拟稿人意见
as
comments
from
WorkItem item
join
InstanceContext context
on
item.InstanceId=context.ObjectID
join
User
user_
on
user_.ObjectID=context.Originator
join
OrganizationUnit unit
on
unit.ObjectID=context.OrgUnit
join
I_公文类_123456 I_
on
I_.InstanceId=context.ObjectID
where
item.ObjectID=@pWorkItemID;
end
;
|
我们首先获取流程模板的名称,然后根据不同的查询模板执行不同查询语句,获取需要展示的表单信息。
以下我们对相关表进行解释:
1、WorkItem,工作项表,每生成一条工作项,即在此表插入一条记录;
2、InstanceContext,流程表,每发起一个流程,即在此表插入一条记录;
3、User,用户表,存放所有用户信息;
4、OrganizationUnit,部门表,存放所有部门信息;
5、I_公文类_123456,特定流程模板表,存在流程表单信息;
然后我们建立一张表FormField,其决定了每个流程模板应该展示的表单数据,内容如下:
Name: 展示的名称;
type:展示的类型;
queryName:对应于表单查询语句的字段;
sortedIndex:决定了表单字段展示的先后顺序;
具体实现代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
DAL.FlowInfoManger dal =
new
DAL.FlowInfoManger();
// 流程需要收集的表字段
DataTable dtFormField = dal.GetFlowData(WorkItemID);
Flow flow =
new
Flow();
// 初始化流程id
flow.flowguid = WorkItemID;
// 流程的实际展示内容
DataTable dtFormMessage =
new
DataTable();
dtFormMessage = dal.GetFlowData(WorkItemID, procName);
if
(dtFormMessage.Rows.Count > 0)
{
foreach
(DataRow dr
in
dtFormField.Rows)
{
FormField form =
new
FormField();
form.name = (dr[
"Name"
] == DBNull.Value) ?
""
: dr[
"Name"
].ToString();
form.type = (dr[
"type"
] == DBNull.Value) ?
""
: dr[
"type"
].ToString();
string
queryName = (dr[
"queryName"
] == DBNull.Value) ?
""
:
dr[
"queryName"
].ToString();
if
(queryName !=
string
.Empty)
{
form.value = (dtFormMessage.Rows[0][queryName] == DBNull.Value) ?
""
: dtFormMessage.Rows[0][queryName].ToString();
}
flow.info.Add(form);
}
}
|
以上则完成了表单信息的查询展示。
本文转自 许大树 51CTO博客,原文链接:http://blog.51cto.com/abelxu/1877581,如需转载请自行联系原作者