Easyflow.NET 程式更新流程說明 開單加流程、流程中增減修改流程

對於 Easyflow 執行流程增減修改等動作中,比較有關聯的資料表有三個:

  • 表單流程異動子檔(RESDB):紀錄表單所有的流程關卡,新增刪除或更新都由此表來操作。
  • 表單流程異動明細檔(RESDC):紀錄表單流程已確定完成簽核的關卡簽核狀態。
  • 表單流程異動明細簽核檔(RESDD):紀錄表單流程簽核中的所有詳細的歷程,例如: 對同流程關卡經歷多次上呈、退件的動作,每一次的簽核結果都會被詳盡紀錄。

無意間在網路上找到「程式碼控制流程說明文件」。雖然這是ASP版本的說明文件,但是文章中講到對流程控制時所使用的物件架構,在Dot.NET版本中它有被延用下來且物件名稱都一樣。

  • rstTRFlow:「resdb」資料表物件,使用時機 流程簽核中。
  • rstTRFlowDetail:「resdc」資料表物件,使用時機 流程簽核中。
  • rstTRFlowApprove:「resdd」資料表物件,使用時機 流程簽核中。

在開單時可利用覆寫「BeforeSendNewFormAddFlow」函式,在送出來表單時手動加入新的流程關卡。※「TRFlowRESDB」類別所建立的物件,可以在開單時新增流程資訊。

		protected override void BeforeSendNewFormAddFlow(TRFlowRESDB[] xFlowData, ref bool xBlnFlowChanged)
		{
			xBlnFlowChanged = false; //不要重新解析流程
			int rows_count = MasterObj.DetailObjs[0].NewRows.Count;//取得grid有幾列資料
			xFlowData = new TRFlowRESDB[rows_count];//宣告流程物件陣列及其大小
			int resdb003=9901,index=0;//迴圈用的變數,流程關號、流程物件索引
			//送出表單時插入自訂流程使用 MasterObj.DetailObjs[0].NewRows 物件
			//DetailObjs[0]代表第一個Grid物件
			//NewRows代表尚未存入資料庫的資料
			foreach (DscRow dscRow in MasterObj.DetailObjs[0].NewRows)
			{
				if (!dscRow.IsDeleted)
				{
					xFlowData[index].resdb001 = formID; //表單代號
					xFlowData[index].resdb002 = SheetNo; //表單單號
					xFlowData[index].resdb003 = resdb003.ToString(); //關號
					xFlowData[index].resdb004 = "0010"; //支號
					xFlowData[index].resdb005 = 1; //流程角色
					xFlowData[index].resdb006 = 4; //簽核種類
					xFlowData[index].resdb007 = dscRow["empl1"].Value.ToString(); //流程角色參數1 (Grid物件中取得的員工編號值,中括號中填入"欄位名稱")
					xFlowData[index].resdb008 = ""; //流程角色參數2
					xFlowData[index].resdb009 = ""; //流程角色參數3
					xFlowData[index].resdb010 = ""; //流程角色參數4
					xFlowData[index].resdb011 = 0;  //容許簽核時間
					xFlowData[index].resdb012 = "N"; //自動ByPass?
					xFlowData[index].resdb013 = "0"; //ByPass方式
					xFlowData[index].resdb014 = "Y"; //是否強制簽核?
					xFlowData[index].resdb015 = "Y"; //是否單一簽核
					xFlowData[index].resdb016 = "N"; //可否列印?
					xFlowData[index].resdb017 = "Y"; //可否撤簽?
					xFlowData[index].resdb018 = "Y"; //可否加簽?
					xFlowData[index].resdb019 = "N"; //可否轉會?
					xFlowData[index].resdb020 = "N"; //可否轉寄?
					xFlowData[index].resdb021 = "N"; //可否新增附加檔?
					xFlowData[index].resdb022 = "N"; //可否修改附加檔?
					xFlowData[index].resdb023 = "N"; //可否刪除附加檔?
					xFlowData[index].resdb024 = "Y"; //可否閱讀附加檔?
					xFlowData[index].resdb025 = "N"; //簽核時密碼驗證?
					xFlowData[index].resdb026 = "N"; //流程是否已經解析?
					xFlowData[index].resdb027 = ""; //流程提示訊息
					xFlowData[index].resdb028 = ""; //
					xFlowData[index].resdb029 = ""; //
					resdb003++;
					index++;
				}
			}
			base.BeforeSendNewFormAddFlow(xFlowData, ref xBlnFlowChanged);
		}

而在流程簽核中則以覆寫「BeforeApprove」、「AfterApprove」這兩個函式來處理流程關卡的新增、刪除、修改。在這兩個函式中就可以使用 RstTRFlow、RstTRFlowApprove、RstTRFlowDetail 這三個物件來操作他們所對應的表單資料。

#region 簽核前處理
		protected override void BeforeApprove(PublicUTIL.DBProcessor processor)
		{
			base.BeforeApprove(processor);
			//取得單身欄位資料
			string sql_command = @"select empl1 from [EFNETDB].[dbo].[test2_2] where test2_2001='{0}' and test2_2002='{1}' ";
			sql_command = String.Format(sql_command, this.formID, this.SheetNo);
			SqlDataAdapter my_adapter = processor.getDataAdapter(sql_command);
			DataTable my_table= new DataTable();
			my_adapter.Fill(my_table);

			if (AryFlowProperty.SerialSignResult == "2") //同意
			{
				//如果關號是0010,則手動塞流程
				if (this.FlowNo == "0010")
				{
					foreach (DataRow my_resdd_row in RstTRFlowApprove.Tables[0].Select("resdd003 like '2%'"))
					{
						my_resdd_row.Delete();
					}
					foreach (DataRow my_resdc_row in RstTRFlowDetail.Tables[0].Select("resdc003 like '2%'"))
					{
						my_resdc_row.Delete();
					}
					foreach (DataRow my_resdb_row in RstTRFlow.Tables[0].Select("resdb003 like '2%'"))
					{
						my_resdb_row.Delete();
					}

					int resdb003=20;
					foreach( DataRow my_row in my_table.Rows )
					{
						DataRow my_datarow = RstTRFlow.Tables[0].NewRow();//流程資料表建立一新的資料列
						//開始設定資料列相關資資料
						my_datarow["resdb001"] = formID;
						my_datarow["resdb002"] = SheetNo;
						my_datarow["resdb003"] = resdb003.ToString()+DateTime.Now.Second.ToString("00");
						my_datarow["resdb004"] = "0010"; //支號
						my_datarow["resdb005"] = 1; //流程角色
						my_datarow["resdb006"] = 4; //簽核種類
						my_datarow["resdb007"] = my_row["empl1"].ToString(); //流程角色參數1 (Grid物件中取得的員工編號值,中括號中填入"欄位名稱")
						my_datarow["resdb008"] = ""; //流程角色參數2
						my_datarow["resdb009"] = ""; //流程角色參數3
						my_datarow["resdb010"] = ""; //流程角色參數4
						my_datarow["resdb011"] = 0;  //容許簽核時間
						my_datarow["resdb012"] = "N"; //自動ByPass?
						my_datarow["resdb013"] = "0"; //ByPass方式
						my_datarow["resdb014"] = "Y"; //是否強制簽核?
						my_datarow["resdb015"] = "Y"; //是否單一簽核
						my_datarow["resdb016"] = "N"; //可否列印?
						my_datarow["resdb017"] = "Y"; //可否撤簽?
						my_datarow["resdb018"] = "Y"; //可否加簽?
						my_datarow["resdb019"] = "N"; //可否轉會?
						my_datarow["resdb020"] = "N"; //可否轉寄?
						my_datarow["resdb021"] = "N"; //可否新增附加檔?
						my_datarow["resdb022"] = "N"; //可否修改附加檔?
						my_datarow["resdb023"] = "N"; //可否刪除附加檔?
						my_datarow["resdb024"] = "Y"; //可否閱讀附加檔?
						my_datarow["resdb025"] = "N"; //簽核時密碼驗證?
						my_datarow["resdb026"] = "N"; //流程是否已經解析?
						my_datarow["resdb027"] = ""; //流程提示訊息
						my_datarow["resdb028"] = ""; //
						my_datarow["resdb029"] = ""; //
						RstTRFlow.Tables[0].Rows.Add(my_datarow);//將資料列插入流程資料表中
						resdb003++;
					}
				}
			}
		}
#endregion

		protected override void AfterApprove()
		{
			base.AfterApprove();
		}

p.s:以上的程式碼片段僅為測試說明用,實際上可能未能符合流程關卡新增刪除相關資料表依存邏輯。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s