天天看點

老瓶裝新酒-基于工作引擎的OA手機App開發(2)

    OA流程表單資訊查詢實作

    如果要實作OA流程表單資訊的查詢,需要了解工作引擎的表單展示機制。工作引擎它封裝了一套獨有的表單控件,其可以設定控件的DataField綁定資料項,例如:

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

    如上所示,控件綁定了資料項“申請内容”。

    而資料項“申請内容”來自于設計流程時的表單模闆,具體的值存放在了資料庫的相關表的特定字段中。比如我們在流程設計器設計了一個流程,添加資料“申請内容”,設定模闆類型為“公文類”,設定模闆名稱為“12345”,并釋出。則,資料庫中會新增表“I_公文類_12345”,其中表有字段“申請内容”。

    這裡我們要指出,一般地,我們将表單資訊以及一些決定流程流轉的關鍵性資料添加到流程模闆(即資料庫中對應的表中)。

    另外我們需要關注的是,資料庫的表InstanceContext存放了所有的流程,每一條流程誕生的時候,都會向其插入一條記錄。H3資料庫的表WorkItem存放了所有的工作項,每生成一條工作項,都會向其插入一條記錄。

    通過以上,我們得出流程資訊查詢的sql:    

<code>            </code><code>declare</code> <code>@var_WorkFlowName nvarchar(36);</code>

<code>            </code><code>select</code> <code>@var_WorkFlowName=t.WorkflowName </code><code>from</code> <code>WorkItem t </code><code>where</code> <code>t.ObjectID=@pWorkItemID;</code>

<code>            </code><code>if (@var_WorkFlowName = </code><code>'123456'</code><code>)</code>

<code>            </code><code>begin</code>

<code>                </code><code>select</code> <code>user_.</code><code>Name</code> <code>as</code> <code>drafter, </code>

<code>            </code><code>context.CreatedTime </code><code>as</code> <code>draft_time, </code>

<code>            </code><code>unit.</code><code>Name</code> <code>as</code> <code>draft_department,</code>

<code>            </code><code>context.InstanceName </code><code>as</code> <code>document_name, </code>

<code>            </code><code>case</code> <code>context.Priority </code><code>when</code> <code>0 </code><code>then</code> <code>'普通'</code><code>when</code> <code>1 </code><code>then</code> <code>'急件'</code><code>when</code> <code>2 </code><code>then</code> <code>'特急'</code> <code>end</code>  <code>as</code> <code>emergency, </code>

<code>            </code><code>I_.備注 </code><code>as</code> <code>remarks, </code>

<code>            </code><code>I_.拟稿人意見 </code><code>as</code> <code>comments</code>

<code>            </code><code>from</code> <code>WorkItem item</code>

<code>            </code><code>join</code> <code>InstanceContext context </code><code>on</code> <code>item.InstanceId=context.ObjectID</code>

<code>            </code><code>join</code> <code>User</code> <code>user_ </code><code>on</code> <code>user_.ObjectID=context.Originator</code>

<code>            </code><code>join</code> <code>OrganizationUnit unit </code><code>on</code> <code>unit.ObjectID=context.OrgUnit</code>

<code>            </code><code>join</code> <code>I_公文類_123456 I_ </code><code>on</code> <code>I_.InstanceId=context.ObjectID</code>

<code>            </code><code>where</code> <code>item.ObjectID=@pWorkItemID;</code>

<code>            </code><code>end</code><code>;</code>

    我們首先擷取流程模闆的名稱,然後根據不同的查詢模闆執行不同查詢語句,擷取需要展示的表單資訊。

    以下我們對相關表進行解釋:

    1、WorkItem,工作項表,每生成一條工作項,即在此表插入一條記錄;

    2、InstanceContext,流程表,每發起一個流程,即在此表插入一條記錄;

    3、User,使用者表,存放所有使用者資訊;

    4、OrganizationUnit,部門表,存放所有部門資訊;

    5、I_公文類_123456,特定流程模闆表,存在流程表單資訊;

    然後我們建立一張表FormField,其決定了每個流程模闆應該展示的表單資料,内容如下:

    Name: 展示的名稱;

    type:展示的類型;

    queryName:對應于表單查詢語句的字段;

    sortedIndex:決定了表單字段展示的先後順序;

    具體實作代碼如下:

<code>    </code><code>DAL.FlowInfoManger dal = </code><code>new</code> <code>DAL.FlowInfoManger();</code>

<code>     </code><code>// 流程需要收集的表字段</code>

<code>     </code><code>DataTable dtFormField = dal.GetFlowData(WorkItemID);</code>

<code>     </code><code>Flow flow = </code><code>new</code> <code>Flow();</code>

<code>     </code><code>// 初始化流程id</code>

<code>     </code><code>flow.flowguid = WorkItemID;</code>

<code>     </code><code>// 流程的實際展示内容</code>

<code>     </code><code>DataTable dtFormMessage = </code><code>new</code> <code>DataTable();</code>

<code>     </code><code>dtFormMessage = dal.GetFlowData(WorkItemID, procName);</code>

<code>            </code><code>if</code> <code>(dtFormMessage.Rows.Count &gt; 0)</code>

<code>            </code><code>{</code>

<code>                </code><code>foreach</code> <code>(DataRow dr </code><code>in</code> <code>dtFormField.Rows)</code>

<code>                </code><code>{</code>

<code>                    </code><code>FormField form = </code><code>new</code> <code>FormField();</code>

<code>                    </code><code>form.name = (dr[</code><code>"Name"</code><code>] == DBNull.Value) ? </code><code>""</code> <code>: dr[</code><code>"Name"</code><code>].ToString();</code>

<code>                    </code><code>form.type = (dr[</code><code>"type"</code><code>] == DBNull.Value) ? </code><code>""</code> <code>: dr[</code><code>"type"</code><code>].ToString();</code>

<code>                    </code><code>string</code> <code>queryName = (dr[</code><code>"queryName"</code><code>] == DBNull.Value) ? </code><code>""</code> <code>:</code>

<code>                        </code><code>dr[</code><code>"queryName"</code><code>].ToString();</code>

<code>                    </code><code>if</code> <code>(queryName != </code><code>string</code><code>.Empty)</code>

<code>                    </code><code>{</code>

<code>                        </code><code>form.value = (dtFormMessage.Rows[0][queryName] == DBNull.Value) ? </code><code>""</code>

<code>                            </code><code>: dtFormMessage.Rows[0][queryName].ToString();</code>

<code>                    </code><code>}</code>

<code>                    </code><code>flow.info.Add(form);</code>

<code>                </code><code>}</code>

<code>            </code><code>}</code>

    以上則完成了表單資訊的查詢展示。

本文轉自 許大樹 51CTO部落格,原文連結:http://blog.51cto.com/abelxu/1877581,如需轉載請自行聯系原作者