OA流程表单信息查询实现

    如果要实现OA流程表单信息的查询,需要理解工作引擎的表单展示机制。工作引擎它封装了一套独有的表单控件,其可以设置控件的DataField绑定数据项,例如:

    <SheetControls:SheetDataTrackLink ID="SheetDataTrackLink1" DataField="申请内容" runat="server" />  

    如上所示,控件绑定了数据项“申请内容”。


    而数据项“申请内容”来自于设计流程时的表单模板,具体的值存放在了数据库的相关表的特定字段中。比如我们在流程设计器设计了一个流程,添加数据“申请内容”,设置模板类型为“公文类”,设置模板名称为“12345”,并发布。则,数据库中会新增表“I_公文类_12345”,其中表有字段“申请内容”。

    这里我们要指出,一般地,我们将表单信息以及一些决定流程流转的关键性数据添加到流程模板(即数据库中对应的表中)。

    

    另外我们需要关注的是,数据库的表InstanceContext存放了所有的流程,每一条流程诞生的时候,都会向其插入一条记录。H3数据库的表WorkItem存放了所有的工作项,每生成一条工作项,都会向其插入一条记录。


    通过以上,我们得出流程信息查询的sql:    

            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,其决定了每个流程模板应该展示的表单数据,内容如下:

wKioL1g83nizijOBAACjArflUdc720.png    字段解释如下:

    Name: 展示的名称;

    type:展示的类型;

    queryName:对应于表单查询语句的字段;

    sortedIndex:决定了表单字段展示的先后顺序;


    具体实现代码如下:

    

    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);
                }
            }


    以上则完成了表单信息的查询展示。