// // 這個檔案是 表單簽核主檔 資料表的資料存取類別 檔案二 // 您可以修改這個檔案,加入您自訂的屬性與方法 // using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Data; using System.Data.Common; using WebLib; using System.Data.SqlClient; namespace Education { /// /// 表單簽核主檔 資料存取類別 /// public partial class DAC_表單簽核主檔 : WebLib.DAC { /// /// 給查詢畫面用的 Select 方法 /// [DataObjectMethod(DataObjectMethodType.Select)] public 表單簽核主檔List Select() { 表單簽核主檔List result = new 表單簽核主檔List(); IDataList list = result as IDataList; DbCommand cmdSelect = NewCommand(); cmdSelect.CommandText = _select + _from + _where; cmdSelect.CommandText += _order; Select(cmdSelect, ref list); return result; } /// /// InsertOne 之前會執行此方法 /// 在這裡可以做一些檢查或是自動編號等動作 /// 回傳 false 會打斷 InsertOne 的執行 /// protected virtual bool BeforeInsertOne(表單簽核主檔 value) { return true; } /// /// InsertOne 之後會執行此方法 /// protected virtual void AfterInsertOne(表單簽核主檔 value) { } /// /// InsertOne 發生錯誤時會執行此方法 /// protected virtual void OnInsertOneError(Exception error, out bool handled) { handled = false; } /// /// UpdateOne 之前會執行此方法 /// 在這裡可以做一些檢查 /// 回傳 false 會打斷 UpdateOne 的執行 /// protected virtual bool BeforeUpdateOne(表單簽核主檔 value) { return true; } /// /// UpdateOne 之後會執行此方法 /// protected virtual void AfterUpdateOne(表單簽核主檔 value) { } /// /// UpdateOne 發生錯誤時會執行此方法 /// protected virtual void OnUpdateOneError(Exception error, out bool handled) { handled = false; } /// /// DeleteOne 之前會執行此方法 /// 在這裡可以做一些檢查 /// 回傳 false 會打斷 DeleteOne 的執行 /// protected virtual bool BeforeDeleteOne(表單簽核主檔 value) { return true; } /// /// DeleteOne 之後會執行此方法 /// protected virtual void AfterDeleteOne(表單簽核主檔 value) { } /// /// DeleteOne 之前會執行此方法 /// 在這裡可以做一些檢查 /// 回傳 false 會打斷 DeleteOne 的執行 /// protected virtual bool BeforeDeleteOne(int 簽核ID, int DB_APPNO) { return true; } /// /// DeleteOne 之後會執行此方法 /// protected virtual void AfterDeleteOne(int 簽核ID, int DB_APPNO) { } /// /// DeleteOne 發生錯誤時會執行此方法 /// protected virtual void OnDeleteOneError(Exception error, out bool handled) { handled = false; } // 有另外加上去的屬性及方法,請加在這裡 /// /// 取得最後簽核狀態 /// public 表單簽核主檔 GetLastStatus(int 簽核ID) { 表單簽核主檔List d = SelectOne(簽核ID); if (d.Count > 0) return d[0]; else return null; } /// /// 取得最後簽核狀態 /// public 表單簽核主檔 GetLastStatus(string 表單類別ID, string 表單ID) { DbCommand cmd = NewCommand( "SELECT TOP 1 簽核ID FROM " + _tableName + " WHERE 表單類別ID=@表單類別ID AND 表單ID=@表單ID " + " ORDER BY 簽核ID DESC "); AddParam(cmd, "表單類別ID", 表單類別ID); AddParam(cmd, "表單ID", 表單ID); int id; ExecuteScalar(cmd, out id); return GetLastStatus(id); } /// /// 取得某人的表單 /// /// /// [DataObjectMethod(DataObjectMethodType.Select)] public 表單簽核主檔List Select我的表單(string 送簽人員, DateTime 送簽日期1, DateTime 送簽日期2) { 表單簽核主檔List result = new 表單簽核主檔List(); IDataList list = result as IDataList; DbCommand cmdSelect = NewCommand(); cmdSelect.CommandText = _select + _from + _where + " and 送簽人員 = @送簽人員 "; AddParam(cmdSelect, "送簽人員", 送簽人員); if (送簽日期1.Ticks > 0 && 送簽日期2.Ticks > 0) { cmdSelect.CommandText += " and 送簽日期 >= @送簽日期1 and 送簽日期 < @送簽日期2 "; AddParam(cmdSelect, "送簽日期1", 送簽日期1); AddParam(cmdSelect, "送簽日期2", 送簽日期2.AddDays(1)); } cmdSelect.CommandText += " order by 訓練課程企劃編號, 簽核ID "; Select(cmdSelect, ref list); return result; } /// /// 判斷此表單是否可以送簽 /// public bool 可送簽(string 表單類別ID, string 表單ID) { 表單簽核主檔 status = GetLastStatus(表單類別ID, 表單ID); if (status == null) // 沒有送簽過,可送簽 return true; else if (status.最終結果 == "N") // 最後結果為不同意,可重新送簽 return true; else if (status.撤簽 == "Y" && status.最終結果 == "Y") // 已撤簽,已撤簽簽核,可重新送簽 return true; else return false; } /// /// 判斷此表單是否可以由這個使用者取消簽核 /// public bool 可取消(string 表單類別ID, string 表單ID, string UserId) { 表單簽核主檔 status = GetLastStatus(表單類別ID, 表單ID); if (status == null) // 沒有送簽過,不可取消 return false; else if (status.撤簽 == "Y") // 撤簽,不可取消 return false; else if (status.最終簽核人員.CompareTo(UserId) != 0) // 不是這個人簽的表單,不可由這個人取消 return false; else if (status.最終結果.Length == 0) // 這個人還沒有簽過,不可由這個人取消 return false; else return true; } /// /// 判斷此表單是否可以由這個使用者簽核 /// public bool 可簽核(string 表單類別ID, string 表單ID, string UserId) { 表單簽核主檔 status = GetLastStatus(表單類別ID, 表單ID); if (status == null) // 沒有送簽過 return false; if (status.應簽關數 == status.已簽關數) // 已簽完 return false; //else if (status.撤簽 == "Y") // return false; DAC_表單簽核明細 Dao表單簽核明細 = new DAC_表單簽核明細(conn); 表單簽核明細List canApprove = Dao表單簽核明細.GetCanApprove(status.簽核ID); foreach (表單簽核明細 item in canApprove) { if (item.簽核人員.CompareTo(UserId) == 0) return true; } return false; } /// /// 判斷此表單是否可以由這個使用者撤簽 /// public bool 可撤簽(string 表單類別ID, string 表單ID, string UserId) { 表單簽核主檔 status = GetLastStatus(表單類別ID, 表單ID); if (status == null) // 沒有送簽過 return false; else if (status.撤簽 == "Y") // 撤簽 return false; else if (status.應簽關數 == status.已簽關數 && status.最終結果 == "Y") // 已簽完 return false; else if (status.送簽人員.CompareTo(UserId) != 0) // 不是這個人送簽的表單 return false; else return true; } /// /// 將表單送簽 /// /// 表單類別 /// 表單編號 /// 簽核單號 public int 送簽(string 表單類別ID, string 表單ID, string 送簽人員, string 應簽核人員, string 表單ID格式, int 訓練課程企劃編號, int 編號2) { if (!可送簽(表單類別ID, 表單ID)) return 0; string 應簽關數; switch (表單類別ID) { case "課程企劃": case "教學日誌暨異常狀況": case "訓練檢討報告": case "處理結果追蹤": default: 應簽關數 = "2"; // 2022-03-15 由 3 關改回 2 關 break; } bool wantClose = OpenConnection(); tran = conn.BeginTransaction(); try { // 新增簽核單 表單簽核主檔 newItem = new 表單簽核主檔() { 表單類別ID = 表單類別ID, 表單ID = 表單ID, 應簽關數 = 應簽關數, 已簽關數 = "0", 撤簽 = "", 最終結果 = "", 送簽人員 = 送簽人員, 送簽日期 = DateTime.UtcNow.AddHours(8).Date, 表單ID格式 = 表單ID格式, 訓練課程企劃編號 = 訓練課程企劃編號, 編號2 = 編號2 }; int newId = InsertOne(newItem); // 新增簽核明細 表單簽核明細 newDetail = new 表單簽核明細() { 簽核ID = newId, 關ID = "1", 簽核人員 = 應簽核人員 }; DAC_表單簽核明細 Dao表單簽核明細 = new DAC_表單簽核明細(conn); Dao表單簽核明細.Transaction = tran; Dao表單簽核明細.InsertOne(newDetail); tran.Commit(); return newId; } catch (Exception error) { tran.Rollback(); throw error; } finally { CloseConnection(wantClose); } } public bool 核准(int 簽核ID, string 本關人員, string 簽核意見, string 下關人員) { // 1. 取出目前的狀態 表單簽核主檔 status = GetLastStatus(簽核ID); DAC_表單簽核明細 Dao表單簽核明細 = new DAC_表單簽核明細(conn); int 本關 = DAC.GetInt32(status.已簽關數 == "" ? "0" : status.已簽關數); //switch (status.已簽關數) //{ // case "": // case "0": bool wantClose = OpenConnection(); bool haveNext = false; tran = conn.BeginTransaction(); Dao表單簽核明細.Transaction = tran; try { // 更新主檔狀態 status.已簽關數 = (本關 + 1).ToString(); status.最終結果 = "Y"; status.最終簽核人員 = 本關人員; status.最終簽核日期 = DateTime.UtcNow.AddHours(8); status.最終簽核意見 = 簽核意見; UpdateOne(status); // 更新明細檔狀態 表單簽核明細 lastDetail = Dao表單簽核明細.GetLast(簽核ID); lastDetail.簽核人員 = 本關人員; lastDetail.簽核日期 = DateTime.UtcNow.AddHours(8); lastDetail.簽核結果 = "Y"; lastDetail.簽核意見 = 簽核意見; Dao表單簽核明細.UpdateOne(lastDetail); // 若還未簽核完,新增下關簽核明細 if (status.已簽關數 != status.應簽關數) { 表單簽核明細 newDetail = new 表單簽核明細() { 簽核ID = 簽核ID, 關ID = (本關 + 2).ToString(), 簽核人員 = 下關人員 }; Dao表單簽核明細.InsertOne(newDetail); haveNext = true; } // 已簽核完 else { // 課程企劃書要把已簽核欄位改成 Y if (status.表單類別ID == "課程企劃") { DAC_訓練課程企劃 Dao訓練課程企劃 = new DAC_訓練課程企劃(); Dao訓練課程企劃.Connection = conn; Dao訓練課程企劃.Transaction = tran; 訓練課程企劃List d = Dao訓練課程企劃.SelectOne(Convert.ToInt32(status.表單ID)); if (d.Count > 0) { d[0].已簽核 = "Y"; Dao訓練課程企劃.UpdateOne(d[0]); } } } tran.Commit(); return haveNext; } catch (Exception error) { tran.Rollback(); throw error; } finally { CloseConnection(wantClose); } // case "1": // wantClose = OpenConnection(); // tran = conn.BeginTransaction(); // Dao表單簽核明細.Transaction = tran; // try // { // // 更新主檔狀態 // status.已簽關數 = "2"; // status.最終結果 = "Y"; // status.最終簽核人員 = 本關人員; // status.最終簽核日期 = DateTime.UtcNow.AddHours(8); // status.最終簽核意見 = 簽核意見; // UpdateOne(status); // // 更新明細檔狀態 // 表單簽核明細 lastDetail = Dao表單簽核明細.GetLast(簽核ID); // lastDetail.簽核人員 = 本關人員; // lastDetail.簽核日期 = DateTime.UtcNow.AddHours(8); // lastDetail.簽核結果 = "Y"; // lastDetail.簽核意見 = 簽核意見; // Dao表單簽核明細.UpdateOne(lastDetail); // // 課程企劃書要把已簽核欄位改成 Y // if (status.表單類別ID == "課程企劃") // { // DAC_訓練課程企劃 Dao訓練課程企劃 = new DAC_訓練課程企劃(); // Dao訓練課程企劃.Connection = conn; // Dao訓練課程企劃.Transaction = tran; // 訓練課程企劃List d = Dao訓練課程企劃.SelectOne(Convert.ToInt32(status.表單ID)); // if (d.Count > 0) // { // d[0].已簽核 = "Y"; // Dao訓練課程企劃.UpdateOne(d[0]); // } // } // tran.Commit(); // return false; // } // catch (Exception error) // { // tran.Rollback(); // throw error; // } // finally // { // CloseConnection(wantClose); // } //} //return false; } public void 不核准(int 簽核ID, string 本關人員, string 簽核意見) { // 1. 取出目前的狀態 表單簽核主檔 status = GetLastStatus(簽核ID); DAC_表單簽核明細 Dao表單簽核明細 = new DAC_表單簽核明細(conn); int 本關 = DAC.GetInt32(status.已簽關數 == "" ? "0" : status.已簽關數); //switch (status.已簽關數) //{ // case "": // case "0": bool wantClose = OpenConnection(); tran = conn.BeginTransaction(); Dao表單簽核明細.Transaction = tran; try { // 更新主檔狀態 status.已簽關數 = (本關 + 1).ToString(); status.最終結果 = "N"; status.最終簽核人員 = 本關人員; status.最終簽核日期 = DateTime.UtcNow.AddHours(8); status.最終簽核意見 = 簽核意見; UpdateOne(status); // 更新明細檔狀態 表單簽核明細 lastDetail = Dao表單簽核明細.GetLast(簽核ID); lastDetail.簽核人員 = 本關人員; lastDetail.簽核日期 = DateTime.UtcNow.AddHours(8); lastDetail.簽核結果 = "N"; lastDetail.簽核意見 = 簽核意見; Dao表單簽核明細.UpdateOne(lastDetail); tran.Commit(); } catch { tran.Rollback(); } finally { CloseConnection(wantClose); } // break; // case "1": // wantClose = OpenConnection(); // tran = conn.BeginTransaction(); // Dao表單簽核明細.Transaction = tran; // try // { // // 更新主檔狀態 // status.已簽關數 = "2"; // status.最終結果 = "N"; // status.最終簽核人員 = 本關人員; // status.最終簽核日期 = DateTime.UtcNow.AddHours(8); // status.最終簽核意見 = 簽核意見; // UpdateOne(status); // // 更新明細檔狀態 // 表單簽核明細 lastDetail = Dao表單簽核明細.GetLast(簽核ID); // lastDetail.簽核人員 = 本關人員; // lastDetail.簽核日期 = DateTime.UtcNow.AddHours(8); // lastDetail.簽核結果 = "N"; // lastDetail.簽核意見 = 簽核意見; // Dao表單簽核明細.UpdateOne(lastDetail); // tran.Commit(); // } // catch // { // tran.Rollback(); // } // finally // { // CloseConnection(wantClose); // } // break; //} } public void 取消簽核(int 簽核ID) { // 1. 取出目前的狀態 表單簽核主檔 status = GetLastStatus(簽核ID); if (status == null) return; DAC_表單簽核明細 Dao表單簽核明細 = new DAC_表單簽核明細(conn); switch (status.已簽關數) { case "": case "0": // 還沒有簽,不動作 break; #region 第一關取消 case "1": // 取消第一關已簽核,回到第一關未簽核,刪除第二關簽核明細 bool wantClose = OpenConnection(); tran = conn.BeginTransaction(); Dao表單簽核明細.Transaction = tran; try { // 更新主檔狀態 status.已簽關數 = "0"; status.最終結果 = ""; status.最終簽核人員 = ""; status.最終簽核日期 = new DateTime(); status.最終簽核意見 = ""; UpdateOne(status); // 更新明細檔狀態 表單簽核明細List detail = Dao表單簽核明細.SelectOneId(簽核ID); foreach (表單簽核明細 detailItem in detail) { if (detailItem.關ID == "1") { detailItem.簽核日期 = new DateTime(); detailItem.簽核結果 = ""; detailItem.簽核意見 = ""; Dao表單簽核明細.UpdateOne(detailItem); continue; } if (detailItem.關ID == "2") { Dao表單簽核明細.DeleteOne(detailItem); } } tran.Commit(); } catch { tran.Rollback(); } finally { CloseConnection(wantClose); } break; #endregion #region 第二關取消 case "2": // 取消第二關已簽核,回到第二關未簽核,第一關已簽核,刪除第三關簽核明細 wantClose = OpenConnection(); tran = conn.BeginTransaction(); Dao表單簽核明細.Transaction = tran; try { // 更新明細檔狀態 表單簽核明細List detail = Dao表單簽核明細.SelectOneId(簽核ID); foreach (表單簽核明細 detailItem in detail) { if (detailItem.關ID == "1") { // 更新主檔狀態 status.已簽關數 = "1"; status.最終結果 = detailItem.簽核結果; status.最終簽核人員 = detailItem.簽核人員; status.最終簽核日期 = detailItem.簽核日期; status.最終簽核意見 = detailItem.簽核意見; UpdateOne(status); continue; } if (detailItem.關ID == "2") { detailItem.簽核日期 = new DateTime(); detailItem.簽核結果 = ""; detailItem.簽核意見 = ""; Dao表單簽核明細.UpdateOne(detailItem); } if (detailItem.關ID == "3") { Dao表單簽核明細.DeleteOne(detailItem); } } // 課程企劃書要把已簽核欄位改成 N if (status.表單類別ID == "課程企劃") { DAC_訓練課程企劃 Dao訓練課程企劃 = new DAC_訓練課程企劃(); Dao訓練課程企劃.Connection = conn; Dao訓練課程企劃.Transaction = tran; 訓練課程企劃List d = Dao訓練課程企劃.SelectOne(Convert.ToInt32(status.表單ID)); if (d.Count > 0) { d[0].已簽核 = "N"; Dao訓練課程企劃.UpdateOne(d[0]); } } tran.Commit(); } catch { tran.Rollback(); } finally { CloseConnection(wantClose); } break; #endregion #region 第三關取消 case "3": // 取消第三關已簽核,回到第三關未簽核,第二關已簽核 wantClose = OpenConnection(); tran = conn.BeginTransaction(); Dao表單簽核明細.Transaction = tran; try { // 更新明細檔狀態 表單簽核明細List detail = Dao表單簽核明細.SelectOneId(簽核ID); foreach (表單簽核明細 detailItem in detail) { if (detailItem.關ID == "2") { // 更新主檔狀態 status.已簽關數 = "2"; status.最終結果 = detailItem.簽核結果; status.最終簽核人員 = detailItem.簽核人員; status.最終簽核日期 = detailItem.簽核日期; status.最終簽核意見 = detailItem.簽核意見; UpdateOne(status); continue; } if (detailItem.關ID == "3") { detailItem.簽核日期 = new DateTime(); detailItem.簽核結果 = ""; detailItem.簽核意見 = ""; Dao表單簽核明細.UpdateOne(detailItem); } } // 課程企劃書要把已簽核欄位改成 N if (status.表單類別ID == "課程企劃") { DAC_訓練課程企劃 Dao訓練課程企劃 = new DAC_訓練課程企劃(); Dao訓練課程企劃.Connection = conn; Dao訓練課程企劃.Transaction = tran; 訓練課程企劃List d = Dao訓練課程企劃.SelectOne(Convert.ToInt32(status.表單ID)); if (d.Count > 0) { d[0].已簽核 = "N"; Dao訓練課程企劃.UpdateOne(d[0]); } } tran.Commit(); } catch { tran.Rollback(); } finally { CloseConnection(wantClose); } break; #endregion #region 撤簽取消 case "D": // 取消 D 關已簽核,回到 D 關未簽核 wantClose = OpenConnection(); tran = conn.BeginTransaction(); Dao表單簽核明細.Transaction = tran; try { // 更新主檔狀態 status.已簽關數 = "0"; status.最終結果 = ""; status.最終簽核人員 = ""; status.最終簽核日期 = new DateTime(); status.最終簽核意見 = ""; UpdateOne(status); // 更新明細檔狀態 表單簽核明細List detail = Dao表單簽核明細.SelectOneId(簽核ID); foreach (表單簽核明細 detailItem in detail) { if (detailItem.關ID == "D") { detailItem.簽核日期 = new DateTime(); detailItem.簽核結果 = ""; detailItem.簽核意見 = ""; Dao表單簽核明細.UpdateOne(detailItem); } } tran.Commit(); } catch { tran.Rollback(); } finally { CloseConnection(wantClose); } break; #endregion } } public void 撤簽(int 簽核ID, string 撤簽簽核人員) { // 1. 取出目前的狀態 表單簽核主檔 status = GetLastStatus(簽核ID); if (status == null) return; bool wantClose = OpenConnection(); tran = conn.BeginTransaction(); try { 表單簽核明細 newDetail; // 已送簽但尚未簽核,抽單等於直接回到未簽核狀態 if (status.已簽關數 == "" || status.已簽關數 == "0") { // 更新主檔狀態 status.應簽關數 = "D"; status.撤簽 = "Y"; status.已簽關數 = "D"; status.最終結果 = "Y"; status.最終簽核人員 = "SYSTEM"; status.最終簽核日期 = DateTime.UtcNow.AddHours(8); status.最終簽核意見 = "尚未簽核抽單,自動審批"; // 新增撤簽明細 newDetail = new 表單簽核明細() { 簽核ID = status.簽核ID, 關ID = "D", 簽核人員 = "SYSTEM", 簽核日期 = status.最終簽核日期, 簽核結果 = "Y", 簽核意見 = "尚未簽核抽單,自動審批" }; //DAC_表單簽核明細 Dao表單簽核明細 = new DAC_表單簽核明細(conn); //Dao表單簽核明細.Transaction = tran; //Dao表單簽核明細.InsertOne(newDetail); } else { // 更新主檔狀態 status.應簽關數 = "D"; status.撤簽 = "Y"; status.已簽關數 = ""; status.最終結果 = ""; status.最終簽核人員 = ""; status.最終簽核日期 = new DateTime(); status.最終簽核意見 = ""; //UpdateOne(status); // 新增撤簽明細 newDetail = new 表單簽核明細() { 簽核ID = status.簽核ID, 關ID = "D", 簽核人員 = 撤簽簽核人員 }; //DAC_表單簽核明細 Dao表單簽核明細 = new DAC_表單簽核明細(conn); //Dao表單簽核明細.Transaction = tran; //Dao表單簽核明細.InsertOne(newDetail); } UpdateOne(status); DAC_表單簽核明細 Dao表單簽核明細 = new DAC_表單簽核明細(conn); Dao表單簽核明細.Transaction = tran; Dao表單簽核明細.InsertOne(newDetail); tran.Commit(); } catch (Exception error) { tran.Rollback(); throw error; } finally { CloseConnection(wantClose); } } public void 撤簽核准(int 簽核ID, string 本關人員, string 簽核意見) { 撤簽批示(簽核ID, 本關人員, true, 簽核意見); } public void 撤簽不核准(int 簽核ID, string 本關人員, string 簽核意見) { 撤簽批示(簽核ID, 本關人員, false, 簽核意見); } private void 撤簽批示(int 簽核ID, string 本關人員, bool 簽核結果, string 簽核意見) { 表單簽核主檔 status = GetLastStatus(簽核ID); if (status == null) return; DAC_表單簽核明細 Dao表單簽核明細 = new DAC_表單簽核明細(conn); bool wantClose = OpenConnection(); tran = conn.BeginTransaction(); Dao表單簽核明細.Transaction = tran; try { // 更新主檔狀態 status.已簽關數 = "D"; status.最終結果 = 簽核結果 ? "Y" : "N"; status.最終簽核人員 = 本關人員; status.最終簽核日期 = DateTime.UtcNow.AddHours(8); status.最終簽核意見 = 簽核意見; UpdateOne(status); // 更新明細檔狀態 表單簽核明細 lastDetail = Dao表單簽核明細.GetLast(簽核ID); lastDetail.簽核人員 = 本關人員; lastDetail.簽核日期 = DateTime.UtcNow.AddHours(8); lastDetail.簽核結果 = 簽核結果 ? "Y" : "N"; lastDetail.簽核意見 = 簽核意見; Dao表單簽核明細.UpdateOne(lastDetail); tran.Commit(); } catch (Exception error) { tran.Rollback(); throw error; } finally { CloseConnection(wantClose); } } public bool 表單可異動(string 表單類別ID, string 表單ID) { // 1. 取出目前的狀態 表單簽核主檔 status = GetLastStatus(表單類別ID, 表單ID); if (status == null) // 尚未送簽,可異動 return true; else if (status.應簽關數.CompareTo("D") != 0 && status.最終結果 == "N") // 不准,可異動 return true; else if (status.應簽關數 == "D" && status.最終結果 == "Y") // 抽單核准,可異動 return true; else if (status.應簽關數.CompareTo("D") != 0 && status.最終結果 == "Y") // 已簽准,不可異動 return false; else if (status.應簽關數.CompareTo(status.已簽關數) != 0) // 簽核中,不可異動 return false; else return true; } [DataObjectMethod(DataObjectMethodType.Select)] public 表單簽核主檔List Get可簽核的表單(string UserId) { 表單簽核主檔List result = new 表單簽核主檔List(); IDataList list = result as IDataList; DbCommand cmd = NewCommand(); // cmd.CommandText = // @"select 簽核ID, A.表單類別ID, A.表單ID, 送簽人員, 送簽日期, 應簽關數, 已簽關數, 撤簽, 最終結果, 最終簽核人員, 最終簽核日期, 最終簽核意見, 表單ID格式, 訓練課程企劃編號, 編號2, // DB_APPNO, DB_CRDAT, DB_CRUSR, DB_TRDAT, DB_TRUSR // from // ( // select 簽核ID, 表單類別ID, 送簽人員, 送簽日期, 應簽關數, 已簽關數, 撤簽, 最終結果, 最終簽核人員, 最終簽核日期, 最終簽核意見, 表單ID格式, // DB_APPNO, DB_CRDAT, DB_CRUSR, DB_TRDAT, DB_TRUSR, // case when CHARINDEX('|', 表單ID) = 0 then 表單ID else SUBSTRING(表單ID, 1, CHARINDEX('|', 表單ID) - 1) end as 表單ID, // case when CHARINDEX('|', 表單ID) = 0 then '' else SUBSTRING(表單ID, CHARINDEX('|', 表單ID) + 1, 10) end as 表單ID2 // from 表單簽核主檔 // ) AS A // join // ( // select 1 as 表單順序, '課程企劃' as 表單類別ID, CAST(編號 AS NVARCHAR(10)) as 表單ID, '' AS 表單ID2, 顯示編號 as 訓練課程編號 from 訓練課程企劃 // union all // select 2 as 表單順序, '場地遴選' as 表單類別ID, CAST(課程企劃編號 AS NVARCHAR(10)) as 表單ID, '' AS 表單ID2, // (select top 1 顯示編號 from 訓練課程企劃 where 場地遴選.課程企劃編號=訓練課程企劃.編號) as 訓練課程編號 from 場地遴選 // union all // select 3 as 表單順序, '講師遴選' as 表單類別ID, CAST(課程企劃編號 AS NVARCHAR(10)) as 表單ID, CAST(課程序號 AS NVARCHAR(10)) AS 表單ID2, // (select top 1 顯示編號 from 訓練課程企劃 where 講師遴選.課程企劃編號=訓練課程企劃.編號) as 訓練課程編號 from 講師遴選 // union all // select 4 as 表單順序, '訓練檢討報告' as 表單類別ID, CAST(訓練課程企劃編號 AS NVARCHAR(10)) as 表單ID, '' AS 表單ID2, // (select top 1 顯示編號 from 訓練課程企劃 where 訓練檢討報告.訓練課程企劃編號=訓練課程企劃.編號) as 訓練課程編號 from 訓練檢討報告 // union all // select 5 as 表單順序, '教學日誌暨異常狀況' as 表單類別ID, CAST(課程企劃編號 AS NVARCHAR(10)) as 表單ID, CAST(課程序號 AS NVARCHAR(10)) AS 表單ID2, // (select top 1 顯示編號 from 訓練課程企劃 where 教學日誌.課程企劃編號=訓練課程企劃.編號) as 訓練課程編號 from 教學日誌 // union all // select 6 as 表單順序, '教育訓練效益追蹤調查表' as 表單類別ID, CAST(訓練課程企劃編號 AS NVARCHAR(10)) as 表單ID, CAST(填表序號 AS NVARCHAR(10)) AS 表單ID2, // (select top 1 顯示編號 from 訓練課程企劃 where 訓練效益.訓練課程企劃編號=訓練課程企劃.編號) as 訓練課程編號 from 訓練效益 // ) as B on A.表單類別ID=B.表單類別ID and A.表單ID=B.表單ID and A.表單ID2=B.表單ID2 // where 簽核ID in ( // select 簽核ID from 表單簽核明細 A // where 關ID = (select max(B.關ID) from 表單簽核明細 B where A.簽核ID=B.簽核ID) // and (簽核結果 = '' or 簽核結果 is null) // and 簽核人員 = @簽核人員 // ) // order by B.訓練課程編號, B.表單順序 // "; cmd.CommandText = _select + _from + @" where 簽核ID in ( select 簽核ID from 表單簽核明細 A where 關ID = (select max(B.關ID) from 表單簽核明細 B where A.簽核ID=B.簽核ID) and (簽核結果 = '' or 簽核結果 is null) and 簽核人員 = @簽核人員 ) order by 訓練課程企劃編號, 簽核ID"; AddParam(cmd, "簽核人員", UserId); Select(cmd, ref list); return result; } [DataObjectMethod(DataObjectMethodType.Select)] public 表單簽核主檔List Get已簽核的表單(string UserId) { 表單簽核主檔List result = new 表單簽核主檔List(); IDataList list = result as IDataList; DbCommand cmd = NewCommand(); cmd.CommandText = // @"select 簽核ID, A.表單類別ID, A.表單ID, 送簽人員, 送簽日期, 應簽關數, 已簽關數, 撤簽, 最終結果, 最終簽核人員, 最終簽核日期, 最終簽核意見, 表單ID格式, 訓練課程企劃編號, 編號2, // DB_APPNO, DB_CRDAT, DB_CRUSR, DB_TRDAT, DB_TRUSR // from // ( // select 簽核ID, 表單類別ID, 送簽人員, 送簽日期, 應簽關數, 已簽關數, 撤簽, 最終結果, 最終簽核人員, 最終簽核日期, 最終簽核意見, 表單ID格式, // DB_APPNO, DB_CRDAT, DB_CRUSR, DB_TRDAT, DB_TRUSR, // case when CHARINDEX('|', 表單ID) = 0 then 表單ID else SUBSTRING(表單ID, 1, CHARINDEX('|', 表單ID) - 1) end as 表單ID, // case when CHARINDEX('|', 表單ID) = 0 then '' else SUBSTRING(表單ID, CHARINDEX('|', 表單ID) + 1, 10) end as 表單ID2 // from 表單簽核主檔 // ) AS A // join // ( // select 1 as 表單順序, '課程企劃' as 表單類別ID, CAST(編號 AS NVARCHAR(10)) as 表單ID, '' AS 表單ID2, 顯示編號 as 訓練課程編號 from 訓練課程企劃 // union all // select 2 as 表單順序, '場地遴選' as 表單類別ID, CAST(課程企劃編號 AS NVARCHAR(10)) as 表單ID, '' AS 表單ID2, // (select top 1 顯示編號 from 訓練課程企劃 where 場地遴選.課程企劃編號=訓練課程企劃.編號) as 訓練課程編號 from 場地遴選 // union all // select 3 as 表單順序, '講師遴選' as 表單類別ID, CAST(課程企劃編號 AS NVARCHAR(10)) as 表單ID, CAST(課程序號 AS NVARCHAR(10)) AS 表單ID2, // (select top 1 顯示編號 from 訓練課程企劃 where 講師遴選.課程企劃編號=訓練課程企劃.編號) as 訓練課程編號 from 講師遴選 // union all // select 4 as 表單順序, '訓練檢討報告' as 表單類別ID, CAST(訓練課程企劃編號 AS NVARCHAR(10)) as 表單ID, '' AS 表單ID2, // (select top 1 顯示編號 from 訓練課程企劃 where 訓練檢討報告.訓練課程企劃編號=訓練課程企劃.編號) as 訓練課程編號 from 訓練檢討報告 // union all // select 5 as 表單順序, '教學日誌暨異常狀況' as 表單類別ID, CAST(課程企劃編號 AS NVARCHAR(10)) as 表單ID, CAST(課程序號 AS NVARCHAR(10)) AS 表單ID2, // (select top 1 顯示編號 from 訓練課程企劃 where 教學日誌.課程企劃編號=訓練課程企劃.編號) as 訓練課程編號 from 教學日誌 // union all // select 6 as 表單順序, '教育訓練效益追蹤調查表' as 表單類別ID, CAST(訓練課程企劃編號 AS NVARCHAR(10)) as 表單ID, CAST(填表序號 AS NVARCHAR(10)) AS 表單ID2, // (select top 1 顯示編號 from 訓練課程企劃 where 訓練效益.訓練課程企劃編號=訓練課程企劃.編號) as 訓練課程編號 from 訓練效益 // ) as B on A.表單類別ID=B.表單類別ID and A.表單ID=B.表單ID and A.表單ID2=B.表單ID2 // where 簽核ID in ( // select distinct 簽核ID from 表單簽核明細 A // where (簽核結果 = 'Y' or 簽核結果 = 'N') // and 簽核人員 = @簽核人員 // ) // order by B.訓練課程編號, B.表單順序 // "; cmd.CommandText = _select + _from + @" where 簽核ID in ( select distinct 簽核ID from 表單簽核明細 A where (簽核結果 = 'Y' or 簽核結果 = 'N') and 簽核人員 = @簽核人員 ) order by 訓練課程企劃編號, 簽核ID"; AddParam(cmd, "簽核人員", UserId); Select(cmd, ref list); return result; } } /// /// 表單簽核主檔 資料集合類別 /// public partial class 表單簽核主檔List : List<表單簽核主檔> { // 有另外加上去的屬性及方法,請加在這裡 } /// /// 表單簽核主檔 資料紀錄類別 /// public partial class 表單簽核主檔 { // 有另外加上去的屬性及方法,請加在這裡 } }