8.2 启动与执行业务流程
8.2.2 TaskInstance.aspx.cs文件代码:
......(续前页,继续Page_Load()函数内容)
//显示前面任务已上传的附件
if(ds.Tables[0].Rows[0]["AboutAttached"].ToString().Trim() == "R"
|| ds.Tables[0].Rows[0]["AboutAttached"].ToString().Trim() == "LR")
{
//这里的sql语句的前提是回退并重新选择新的分支(或分支,而且过程逻辑不允许嵌套)
//执行时要删除原分支的所有任务实例以及它们上传的相关附件等。
strSql="select ImageID,ImageName from RelatedAttachedImages where
ProcessInstanceID="+ds.Tables[1].Rows[0]["ProcessInstanceID"].ToString()
+" and TaskInstanceID < "+ViewState["taskinstanceid"].ToString();
DataSet attachedds=basecode.SQLExeDataSet(strSql);
if(attachedds != null & attachedds.Tables[0].Rows.Count>=1)
{
TableRow tr;
TableCell tc;
tr=new TableRow();
tc=new TableCell();
tc.HorizontalAlign=HorizontalAlign.Right;
tc.Width=Unit.Percentage(15);
tc.Text="相关资料";
tr.Cells.Add(tc);
tc=new TableCell();
tr.Cells.Add(tc);
Tbl.Rows.Add(tr);
HyperLink link;
for(int k=0;k<attachedds.Tables[0].Rows.Count;k++)
{
tr=new TableRow();
tc=new TableCell();
tc.Width=Unit.Percentage(15);
tr.Cells.Add(tc);
tc=new TableCell();
link=new HyperLink();
link.Text=attachedds.Tables[0].Rows[k]["ImageName"].ToString();
link.NavigateUrl="DisplayImage.aspx?id="+attachedds.Tables[0]
.Rows[k]["ImageID"].ToString();
link.Target="_blank";
link.ForeColor=Color.CadetBlue;
tc.Controls.Add(link);
tr.Cells.Add(tc);
Tbl.Rows.Add(tr);
}
}
}//结束显示附件链接的if语句
//显示字段编辑控件
if((ds.Tables[0].Rows[0]["Writablefields"] != DBNull.Value)
& (ds.Tables[0].Rows[0]["Writablefields"].ToString().Length>1))
{
string[] writeablefields=new Tools().StringSplit(ds.Tables[0]
.Rows[0]["Writablefields"].ToString(),",");
string[] tablecompletename=
new Tools().StringSplit(ds.Tables[1].Rows[0]["RelatedTable"].ToString(),".");
string tablename=tablecompletename[1];
string tableower=tablecompletename[0];
strSql="select FieldName,DataType,DataLenth,FieldAlias,ControlType from
RelatedTablesFields where (FieldName='"+writeablefields[0]+"'";
//i<readablefields.Length-1因为最后一个是空格
for(int i=1;i<writeablefields.Length-1;i++)
{
strSql=strSql+" or FieldName='"+writeablefields[i]+"'";
}
strSql=strSql+") and TableName='"+tablename+"' and
TableOwer='"+tableower+"';select "+writeablefields[0];
//获取可写字段的值(针对暂时保存和回退任务实例已有字段值的情况)
for(int i=1;i<writeablefields.Length-1;i++)
{
strSql=strSql+","+writeablefields[i];
}
strSql=strSql+" from "+ds.Tables[1].Rows[0]["RelatedTable"].ToString()
+" where "+identityname.Tables[0].Rows[0]["IdentifiedField"].ToString()
+"="+ds.Tables[1].Rows[0]["IdentityFieldValue"].ToString();
wfields=basecode.SQLExeDataSet(strSql);
if(wfields == null)
{
Label2.Text="6:"+basecode.BaseSqlErrDes;
return;
}
TableRow tr;
TableCell tc;
TextBox tx;
for(int j=0;j<wfields.Tables[0].Rows.Count;j++)
{
tr=new TableRow();
tc=new TableCell();
tc.HorizontalAlign=HorizontalAlign.Right;
tc.Width=Unit.Percentage(15);//注意此处用法
tc.Text=wfields.Tables[0].Rows[j]["FieldAlias"].ToString();
tr.Cells.Add(tc);
tc=new TableCell();
tc.HorizontalAlign=HorizontalAlign.Left;
tx=new TextBox();
tx.ID=wfields.Tables[0].Rows[j]["FieldName"].ToString();
//单行文本框
if(wfields.Tables[0].Rows[j]["ControlType"].ToString() == "1")
{
tx.Columns=60;
}
//多行文本框
if(wfields.Tables[0].Rows[j]["ControlType"].ToString() == "2")
{
tx.TextMode=TextBoxMode.MultiLine;
tx.Rows=5;
tx.Columns=80;
}
tx.Text=wfields.Tables[1].Rows[0][wfields.Tables[0]
.Rows[j]["FieldName"].ToString()].ToString();
tc.Controls.Add(tx);
tr.Cells.Add(tc);
Tbl2.Rows.Add(tr);
}//for
//目前已定义的记录集中后面要用到的:ds(包含任务定义记录表和流程实例记录表)、
//wfields(包含可写字段中文名、控件类型记录表和可写字段值记录表)、
//identityname(业务表标识字段名).
}//结束显示字段编辑框的if语句
//显示当前用户已上传的附件(针对暂时保存和回退任务实例的情况)
if(ds.Tables[0].Rows[0]["AboutAttached"].ToString().Trim() == "L"
|| ds.Tables[0].Rows[0]["AboutAttached"].ToString().Trim() == "LR")
{
strSql="select ImageID,ImageName from RelatedAttachedImages where
ProcessInstanceID="+ds.Tables[1].Rows[0]["ProcessInstanceID"].ToString()
+" and TaskInstanceID = "+ViewState["taskinstanceid"].ToString();
DataSet attachedds=basecode.SQLExeDataSet(strSql);
if(attachedds != null & attachedds.Tables[0].Rows.Count>=1)
{
TableRow tr;
TableCell tc;
tr=new TableRow();
tc=new TableCell();
tc.HorizontalAlign=HorizontalAlign.Right;
tc.Width=Unit.Percentage(15);
tc.Text="您上传的资料";
tr.Cells.Add(tc);
tc=new TableCell();
tr.Cells.Add(tc);
tc=new TableCell();
tr.Cells.Add(tc);
Tbl3.Rows.Add(tr);
HyperLink link;
for(int k=0;k<attachedds.Tables[0].Rows.Count;k++)
{
tr=new TableRow();
tc=new TableCell();
tc.Width=Unit.Percentage(15);
tr.Cells.Add(tc);
tc=new TableCell();
tc.Width=Unit.Percentage(30);
tc.HorizontalAlign=HorizontalAlign.Center;
link=new HyperLink();
link.Text=attachedds.Tables[0].Rows[k]["ImageName"].ToString();
link.NavigateUrl="DisplayImage.aspx?id="
+attachedds.Tables[0].Rows[k]["ImageID"].ToString();
link.Target="_blank";
link.ForeColor=Color.CadetBlue;
tc.Controls.Add(link);
tr.Cells.Add(tc);
//在处理回退的或暂时保存的任务实例时,用户可以删除自己上传的附件
tc=new TableCell();
LinkButton lbn=new LinkButton();
lbn.Text="删除";
lbn.ID=attachedds.Tables[0].Rows[k]["ImageID"].ToString();
lbn.Click+=new EventHandler(lbn_Click);
lbn.Attributes.Add("onClick","JavaScript:return confirm('确定删除吗?')");
tc.Controls.Add(lbn);
tr.Cells.Add(tc);
Tbl3.Rows.Add(tr);
}
}//if
}//if
//点击暂时保存任务实例按钮时先把沟通栏(留言)信息保存到临时表TempSavedMessage(包
//括过程实例编号、用户编号和审核信息3个字段,结束任务时删除记录)中
//因为点击删除按钮后首先调用page_load方法,如果不把设置沟通栏控件值的语句放在
//ispostback判断中,沟通栏控件将始终显示临时表中的值,控件的输入修改将不能保留.
if(! IsPostBack)
{
string processinstanceid=ds.Tables[1].Rows[0]["ProcessInstanceID"].ToString();
strSql="select TempMessage from TempSavedMessage where ProcessInstanceID="
+processinstanceid+" and UserID="+Session["userid"].ToString ();
DataSet tempmessage=basecode.SQLExeDataSet(strSql);
if(tempmessage != null)
{
if(tempmessage.Tables[0].Rows.Count>=1)
{
if(tempmessage.Tables[0].Rows[0]["TempMessage"] == DBNull.Value
|| tempmessage.Tables[0].Rows[0]["TempMessage"].ToString().Trim() == "")
TextBox1.Text="";
else
TextBox1.Text=
tempmessage.Tables[0].Rows[0]["TempMessage"].ToString().Trim();
}
}
}
//显示要打印的表格链接按钮
if(ds.Tables[0].Rows[0]["PrintedTable"] != DBNull.Value & ds.Tables[0]
.Rows[0]["PrintedTable"].ToString().Trim() != "")
{
string[] printedtablearray=new Tools().StringSplit(ds.Tables[0]
.Rows[0]["PrintedTable"].ToString().Trim(),",");
strSql="select PrintedTableID,PrintedTableName from PrintedTable
where PrintedTableID="+printedtablearray[0];
//i<printedtablearray因为数组最后一项是空字符串
for(int i=1;i<printedtablearray.Length-1;i++)
{
strSql=strSql+" or PrintedTableID="+printedtablearray[i];
}
DataSet printedtableds=basecode.SQLExeDataSet(strSql);
TableRow tr;
TableCell tc;
for(int j=0;j<printedtableds.Tables[0].Rows.Count;j++)
{
if(j==0)//第一行
{
tr=new TableRow();
tc=new TableCell();
tc.Width=Unit.Percentage(15);
tc.HorizontalAlign=HorizontalAlign.Right;
tc.Text="打印表格:";
tr.Cells.Add(tc);
}
else
{
tr=new TableRow();
tc=new TableCell();
tc.Width=Unit.Percentage(15);
tr.Cells.Add(tc);
}
tc=new TableCell();
tc.HorizontalAlign=HorizontalAlign.Left;
LinkButton lbn=new LinkButton();
lbn.Text=printedtableds.Tables[0].Rows[j]["PrintedTableName"].ToString();
lbn.ID="lbn"+printedtableds.Tables[0].Rows[j]["PrintedTableID"].ToString();
lbn.Click+=new EventHandler(printedtablebutton_Click);
tc.Controls.Add(lbn);
tr.Cells.Add(tc);
PTable.Rows.Add(tr);
}
}
//如果是首任务则不显示退回任务按钮
string processID=ds.Tables[1].Rows[0]["ProcessDefinitionID"].ToString();
TaskDefinitionClass task=new TaskDefinitionClass();
if(task.IsFirstTask(ViewState["taskID"].ToString(),processID))
{
Button3.Visible=false;
DropDownList1.Visible=false;
}
//如果是or split任务,则显示迁移按钮(在同一行显示)
string nodelogic=task.GetLogicTypeOfNode(ViewState["taskID"].ToString());
ViewState["NodeLogic"]=nodelogic;
//AndJoin&OrSplit情况针对当前任务既是并行分支的合并节点又是选择路由的分支节点
if(nodelogic == "OrSplit" || nodelogic == "AndJoin&OrSplit"
|| nodelogic == "OrJoin&OrSplit")
{
//不显示完成任务按钮等
Button2.Visible=false;
string taskname=task.GetTaskNameByID(ViewState["taskID"].ToString());
//获取所有后继节点名称.or split的后继都是任务节点.
DataSet transds=new Transition().GetNextNodesName(taskname,processID);
TableRow tr;
TableCell tc;
Button btn;
tr=new TableRow();
for(int j=0;j<transds.Tables[0].Rows.Count;j++)
{
btn=new Button();
btn.Text=transds.Tables[0].Rows[j][0].ToString();
btn.ID=transds.Tables[0].Rows[j][0].ToString();
btn.Click+=new EventHandler(TransitionBtn_Click);
tc=new TableCell();
tc.Width=Unit.Percentage(15);
tc.HorizontalAlign=HorizontalAlign.Left;
tc.Controls.Add(btn);
tr.Cells.Add(tc);
}
TransTbl.Rows.Add(tr);
}
}//page_load()
//暂时保存任务
private void Button1_Click(object sender, System.EventArgs e)
{
//获取业务表数据
string relatedtable=
ds.Tables[1].Rows[0]["RelatedTable"].ToString();
string identityfield=
identityname.Tables[0].Rows[0]["IdentifiedField"].ToString();
string fieldvalue=ds.Tables[1].Rows[0]["IdentityFieldValue"].ToString();
string processinstanceid=
ds.Tables[1].Rows[0]["ProcessInstanceID"].ToString();
//保存可写字段值
if(! Savefields(relatedtable,identityfield,fieldvalue,processinstanceid))
return;
if(! saveTempMessage(processinstanceid))
return;
//处理附件上传
if(ds.Tables[0].Rows[0]["AboutAttached"].ToString().Trim() == "L"
|| ds.Tables[0].Rows[0]["AboutAttached"].ToString().Trim() == "LR")
{
if(! SaveAttached(processinstanceid,relatedtable,identityfield,fieldvalue))
return;
}
//返回任务列表
Response.Redirect("TaskInstanceList.aspx");
}
......(待续)