8.1 对业务过程定义的细化
经过前七章所讨论的各项准备工作,定义和执行审批业务流程的条件已基本具备。在执行一项审批业务之前,首先是使用工作流图形工具定义业务过程。
回忆一下第五章讨论的业务过程图形的定义过程:如图8.1所示,首先在工作流图形界面绘制业务过程,包括代表业务环节的任务节点与代表过程走向的迁移(有向线段)等,在绘制过程中,右键点击任务节点可以编辑任务名称。
在过程图形绘制完成后可以点击菜单命令保存业务过程。在输入业务名称、选择业务办理过程中要编辑和处理的业务数据表之后,点击“保存流程”按钮,系统将分别保存业务名称、关联的各节点任务名称以及迁移走向等到过程定义表、任务定义表以及迁移表中。

图8.1 定义业务过程
分析以上过程可以看出,业务流程的定义并不完整,如各任务环节由谁完成、不同任务对业务数据的编辑浏览权限等还没有定义。因此,在发起和执行业务之前还需要进一步细化业务过程定义。下面将讨论的程序就是要完成对业务过程的细化。当然,这部分细化工作也完全可以在工作流定义工具中统一完成。
细化业务过程定义的各Web程序如图8.2所示。在完成各任务节点的细化定义,并设置业务过程定义为“已完成”之后,业务过程的定义才真正结束,至此就可以发起和执行具体的审批业务了。

图8.2 细化业务过程定义
8.1.1 UpdateProcessDefinition.aspx文件代码
......
<form id="Form1" method="post" runat="server">
<table cellSpacing="0" cellPadding="0" width="100%" align="center" border="0">
<tr><td style="FONT-SIZE: 16px" align="center">业务流程定义</td></tr>
<tr height="50">
<td align="right"><span id="Message" style="FONT-SIZE: 11pt; FONT-FAMILY: Arial"
runat="server" MaintainState="false"></span> </td>
</tr>
<tr>
<td><asp:datagrid id="DataGrid1" runat="server" AllowPaging="True" Width="100%"
DataKeyField="ProcessID" HeaderStyle-HorizontalAlign="Center"
>
<ItemStyle Font-Size="13px" HorizontalAlign="Center" Height="28px"
VerticalAlign="Bottom"></ItemStyle>
<HeaderStyle Font-Size="16px" HorizontalAlign="Center" Height="30px"
VerticalAlign="Middle" BackColor="#EEEEEE"></HeaderStyle>
<Columns>
<asp:HyperLinkColumn DataNavigateUrlField="ProcessID"
DataNavigateUrlFormatString="UpdateTaskDefinitionList.aspx?id={0}"
DataTextField="ProcessID" HeaderText="业务流程编号">
</asp:HyperLinkColumn>
<asp:BoundColumn DataField="ProcessName" HeaderText="业务流程名称">
</asp:BoundColumn>
<asp:BoundColumn DataField="Alias" ReadOnly="True" HeaderText="关联业务表">
</asp:BoundColumn>
<asp:BoundColumn DataField="task_name" ReadOnly="True"
HeaderText="开始任务名称"></asp:BoundColumn>
<asp:TemplateColumn HeaderText="是否已完成任务定义">
<ItemTemplate>
<asp:Label id="Label1" runat="server">
<%# DataBinder.eval_r(Container.DataItem,"completeddefine") %>
</asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList id="DropDownList1" runat="server">
<asp:ListItem Value="N">未完成</asp:ListItem>
<asp:ListItem Value="Y">已完成</asp:ListItem>
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateColumn>
<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="更新"
CancelText="取消" EditText="编辑"></asp:EditCommandColumn>
<asp:ButtonColumn Text="删除" CommandName="Delete"></asp:ButtonColumn>
</Columns>
<PagerStyle Font-Size="9pt" HorizontalAlign="Right" ForeColor="#3366FF"
Mode="NumericPages"></PagerStyle>
</asp:datagrid></td>
</tr>
</table>
</form>
......
UpdateProcessDefinition.aspx.cs文件代码:
......
using System.Text.RegularExpressions;
using DataAccess;
using WFEngine;
namespace workflow.admin
{
public class UpdateProcessDefinition : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;
protected System.Web.UI.HtmlControls.HtmlGenericControl Message;
private void Page_Load(object sender, System.EventArgs e)
{
if(! IsPostBack)
{
//验证用户是否登录
if(Session["userid"] == null)
Response.Redirect("./Message.aspx");
BindGrid();
}
Message.InnerHtml="";
}
void BindGrid()
{
ProcessDefinitionClass processdef=new ProcessDefinitionClass();
//获取图形定义工具所定义的业务过程
DataSet ds=processdef.GetCompleteProcessDefinitions();
DataGrid1.DataSource=ds;
DataGrid1.DataBind();
}
private void DataGrid1_EditCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DataGrid1.EditItemIndex=e.Item.ItemIndex;
BindGrid();
}
private void DataGrid1_CancelCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DataGrid1.EditItemIndex=-1;
BindGrid();
}
private void DataGrid1_UpdateCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
TextBox tx=(TextBox)e.Item.Cells[1].Controls[0];
if(tx.Text.Trim() == "")
{
Message.InnerHtml="流程名称不能为空!";
return;
}
string processName=tx.Text.Trim();
string processID=DataGrid1.DataKeys[e.Item.ItemIndex].ToString();
string defcompleted=
((DropDownList)e.Item.FindControl("DropDownList1")).SelectedValue;
ProcessDefinitionClass processdef=new ProcessDefinitionClass();
if(! processdef.UpdateProcessDefinition(processName,defcompleted,processID))
{
Message.InnerHtml=processdef.ProcessErrDes;
return;
}
DataGrid1.EditItemIndex=-1;
BindGrid();
}
private void DataGrid1_PageIndexChanged(object source,
System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex = e.NewPageIndex;
BindGrid();
}
private void DataGrid1_ItemDataBound(object sender,
System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item
||e.Item.ItemType == ListItemType.AlternatingItem)
{
LinkButton btn = (LinkButton)(e.Item.Cells[6].Controls[0]);
btn.Attributes.Add("onClick","JavaScript:return confirm('确定删除吗?')");
}
if(e.Item.ItemType == ListItemType.EditItem)
{
DropDownList defcompleted=(DropDownList)e.Item.FindControl("DropDownList1");
//根据业务过程定义表的字段值(过程定义是否完成)设置控件的默认值
if(DataBinder.eval_r(e.Item.DataItem,"DefineCompleted")!= DBNull.Value)
defcompleted.SelectedValue=
Convert.ToString(DataBinder.eval_r(e.Item.DataItem,"DefineCompleted"));
defcompleted.Visible=true;
}
}
private void DataGrid1_DeleteCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
string processID=DataGrid1.DataKeys[e.Item.ItemIndex].ToString();
ProcessInstanceClass processIns=new ProcessInstanceClass();
if(processIns.IsProcessInstantiated(processID))
{
Response.Write("<script>window.alert('流程已经被实例化,不可删除!') </script>");
return;
}
ProcessDefinitionClass process=new ProcessDefinitionClass();
//删除业务流程以及关联的节点、迁移定义记录
if(! process.DeleteProcessDefinition(processID))
{
Response.Write("<script>window.alert('删除流程失败!') </script>");
return;
}
}
}
}