using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using WebLib; namespace Education.Forms.簽核 { [DataBindingHandler("System.Web.UI.Design.TextDataBindingHandler, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] [DefaultBindingProperty("表單ID")] public partial class 送簽 : System.Web.UI.UserControl { private FormBase parent; private DAC_表單簽核主檔 Dao表單簽核; private DAC_表單簽核明細 Dao表單簽核明細; private DAC_組織人員 Dao組織人員; private DAC_組織圖 Dao組織圖; private DAC_職務 Dao職務; protected void Page_Init(object sender, EventArgs e) { parent = (Page as FormBase); Dao表單簽核 = new DAC_表單簽核主檔(parent.conn); Dao表單簽核明細 = new DAC_表單簽核明細(parent.conn); Dao組織人員 = new DAC_組織人員(parent.conn); Dao組織圖 = new DAC_組織圖(parent.conn); Dao職務 = new DAC_職務(parent.conn); } protected void Page_Load(object sender, EventArgs e) { if (!parent.IsPostBack) Refresh(); } /* ===== 舊 Refresh 保留 ===== public void Refresh() { NameValueList 簽核人員List = new NameValueList(); NameValueList 抽單簽核人員List = new NameValueList(); 組織人員List 組織List = null; // 取得表單簽核狀態 表單簽核主檔 status = Dao表單簽核.GetLastStatus(表單類別, 表單ID); if (status != null) 組織List = Dao組織人員.Select人員所屬的組織(status.送簽人員); else 組織List = Dao組織人員.Select人員所屬的組織(parent.UserId); string 目前關卡 = "0"; if (status != null) { 表單簽核明細 detail = Dao表單簽核明細.GetLast(status.簽核ID); 目前關卡 = detail.關ID; // 若抽單且已簽核,視同未送簽 if (status.應簽關數 == "D" && status.已簽關數 == "D") 目前關卡 = "0"; // 若不核准,視同未送簽 if (status.最終結果 == "N") 目前關卡 = "0"; } if (目前關卡 == "0" && status == null) lbStatus.Text = "尚未送簽"; if (目前關卡 == "0" && status != null && status.最終結果 == "N") lbStatus.Text = "先前送簽不核准"; if (目前關卡 == "0" && status != null && status.應簽關數 == "D" && status.已簽關數 == "D") lbStatus.Text = "先前已抽單"; if (目前關卡 == "1" && status.已簽關數 == "0") lbStatus.Text = "已送簽,等待第一關簽核"; if (目前關卡 == "2" && status.已簽關數 == "1") lbStatus.Text = "第一關已簽核,等待第二關簽核"; if (目前關卡 == "3" && status.已簽關數 == "2") lbStatus.Text = "第二關已簽核,等待第三關簽核"; if (目前關卡 == "1" && status.已簽關數 == "1" && status.應簽關數 == "1") lbStatus.Text = "已簽核完畢"; if (目前關卡 == "2" && status.已簽關數 == "2" && status.應簽關數 == "2") lbStatus.Text = "已簽核完畢"; if (目前關卡 == "3" && status.已簽關數 == "3" && status.應簽關數 == "3") lbStatus.Text = "已簽核完畢"; if (目前關卡 == "D") lbStatus.Text = "已抽單,等待簽核"; // 改 UI 的可視與否 btnApprove.Visible = Dao表單簽核.可簽核(表單類別, 表單ID, parent.UserId); btnCancel.Visible = Dao表單簽核.可取消(表單類別, 表單ID, parent.UserId); btnSend.Visible = 可送簽 && Dao表單簽核.可送簽(表單類別, 表單ID); btnWithDraw.Visible = 可送簽 && Dao表單簽核.可撤簽(表單類別, 表單ID, parent.UserId); pnlApprove.Visible = btnApprove.Visible; // pnlNext.Visible = (btnSend.Visible || btnApprove.Visible) && (目前關卡 == "0" || 目前關卡 == "1" || 目前關卡 == "2"); pnlNext.Visible = (btnSend.Visible || btnApprove.Visible) && (目前關卡 == "0" || 目前關卡 == "1"); pnlWithdraw.Visible = btnWithDraw.Visible; if (pnlApprove.Visible || pnlNext.Visible || pnlWithdraw.Visible) this.Attributes.CssStyle["display"] = "block"; else this.Attributes.CssStyle["display"] = "none"; if (pnlNext.Visible) { switch (目前關卡) { case "0": // 第一關是主管 2022-03-15 修改 // Get部門簽核人員(PublicVariable.人資部ID, 簽核人員List); if (status != null) { Get直接主管(status.送簽人員, 簽核人員List, 組織List); } else { Get直接主管(parent.UserId, 簽核人員List, 組織List); } break; case "1": // 下一關是總管理處 2022-03-15 修改 // 取出這個人員的直接主管,以及所屬組織的主管 // Get直接主管(status.送簽人員, 簽核人員List, 組織List); Get部門簽核人員(PublicVariable.總管理處ID, 簽核人員List); break; case "2": // 下一關沒有了 2022-03-15 修改 // Get部門簽核人員(PublicVariable.總管理處ID, 簽核人員List); //DataTable 人員dt = Dao組織人員.Select組織人員(PublicVariable.總管理處ID); break; case "3": // 總管理處 break; case "D": // 抽單 break; } ddlApprover.DataSource = 簽核人員List; ddlApprover.DataTextField = "Name"; ddlApprover.DataValueField = "Value"; ddlApprover.DataBind(); } if (status != null) { if (pnlWithdraw.Visible) { Get直接主管(status.送簽人員, 抽單簽核人員List, 組織List); ddlWithdrawApprover.DataSource = 抽單簽核人員List; ddlWithdrawApprover.DataTextField = "Name"; ddlWithdrawApprover.DataValueField = "Value"; ddlWithdrawApprover.DataBind(); } ds簽核歷程.SelectParameters["簽核ID"].DefaultValue = status.簽核ID.ToString(); gv簽核歷程.DataBind(); gv簽核歷程.Visible = true; } else { gv簽核歷程.Visible = false; } } ===== 舊 Refresh 結束 ===== */ /// /// 新 Refresh:固定簽核人員清單,不從資料庫動態查詢 /// public void Refresh() { 表單簽核主檔 status = Dao表單簽核.GetLastStatus(表單類別, 表單ID); string 目前關卡 = "0"; if (status != null) { 表單簽核明細 detail = Dao表單簽核明細.GetLast(status.簽核ID); 目前關卡 = detail.關ID; if (status.應簽關數 == "D" && status.已簽關數 == "D") 目前關卡 = "0"; if (status.最終結果 == "N") 目前關卡 = "0"; } if (目前關卡 == "0" && status == null) lbStatus.Text = "尚未送簽"; if (目前關卡 == "0" && status != null && status.最終結果 == "N") lbStatus.Text = "先前送簽不核准"; if (目前關卡 == "0" && status != null && status.應簽關數 == "D" && status.已簽關數 == "D") lbStatus.Text = "先前已抽單"; if (目前關卡 == "1" && status.已簽關數 == "0") lbStatus.Text = "已送簽,等待第一關簽核"; if (目前關卡 == "2" && status.已簽關數 == "1") lbStatus.Text = "第一關已簽核,等待第二關簽核"; if (目前關卡 == "3" && status.已簽關數 == "2") lbStatus.Text = "第二關已簽核,等待第三關簽核"; if (目前關卡 == "1" && status.已簽關數 == "1" && status.應簽關數 == "1") lbStatus.Text = "已簽核完畢"; if (目前關卡 == "2" && status.已簽關數 == "2" && status.應簽關數 == "2") lbStatus.Text = "已簽核完畢"; if (目前關卡 == "3" && status.已簽關數 == "3" && status.應簽關數 == "3") lbStatus.Text = "已簽核完畢"; if (目前關卡 == "D") lbStatus.Text = "已抽單,等待簽核"; btnApprove.Visible = Dao表單簽核.可簽核(表單類別, 表單ID, parent.UserId); btnCancel.Visible = Dao表單簽核.可取消(表單類別, 表單ID, parent.UserId); btnSend.Visible = 可送簽 && Dao表單簽核.可送簽(表單類別, 表單ID); btnWithDraw.Visible = 可送簽 && Dao表單簽核.可撤簽(表單類別, 表單ID, parent.UserId); pnlApprove.Visible = btnApprove.Visible; pnlNext.Visible = (btnSend.Visible || btnApprove.Visible) && (目前關卡 == "0" || 目前關卡 == "1"); pnlWithdraw.Visible = btnWithDraw.Visible; if (pnlApprove.Visible || pnlNext.Visible || pnlWithdraw.Visible) this.Attributes.CssStyle["display"] = "block"; else this.Attributes.CssStyle["display"] = "none"; if (pnlNext.Visible) { NameValueList 簽核人員List = new NameValueList(); switch (目前關卡) { case "0": Label1.Text = "第一關簽核人員:"; 簽核人員List.Add(new NameValueItem("陳琬婷", "02070")); break; case "1": Label1.Text = "第二關簽核人員:"; 簽核人員List.Add(new NameValueItem("黃佳萍", "00002")); 簽核人員List.Add(new NameValueItem("吳惠如", "00003")); break; } ddlApprover.DataSource = 簽核人員List; ddlApprover.DataTextField = "Name"; ddlApprover.DataValueField = "Value"; ddlApprover.DataBind(); } if (status != null) { if (pnlWithdraw.Visible) { NameValueList 抽單簽核人員List = new NameValueList(); 抽單簽核人員List.Add(new NameValueItem("陳琬婷", "02070")); ddlWithdrawApprover.DataSource = 抽單簽核人員List; ddlWithdrawApprover.DataTextField = "Name"; ddlWithdrawApprover.DataValueField = "Value"; ddlWithdrawApprover.DataBind(); } ds簽核歷程.SelectParameters["簽核ID"].DefaultValue = status.簽核ID.ToString(); gv簽核歷程.DataBind(); gv簽核歷程.Visible = true; } else { gv簽核歷程.Visible = false; } } /// /// 從部門取得人員,不包括本人 /// /// /// private void Get部門簽核人員(int 部門ID, NameValueList 簽核人員List) { 簽核人員List.Clear(); DataTable 人員dt = Dao組織人員.Select組織人員(部門ID); foreach (DataRow r in 人員dt.Rows) { string 人員ID = DAC.GetString(r["人員ID"]); string 人員姓名 = DAC.GetString(r["人員姓名"]); //if (人員ID.Length > 0 && 人員ID.CompareTo(parent.UserId) != 0 && // !簽核人員List.ValueExists(人員ID)) if (人員ID.Length > 0 && !簽核人員List.ValueExists(人員ID)) { 簽核人員List.Add(人員姓名, 人員ID); } } } /// /// 取得本人的直屬主管、部門主管以及以上各部門主管 /// /// /// private void Get直接主管(string 員工編號, NameValueList 簽核人員List, 組織人員List 組織List) { foreach (組織人員 item in 組織List) { // 直接主管 if (item.直接主管ID.Length > 0 && item.直接主管ID.CompareTo(員工編號) != 0 && !簽核人員List.ValueExists(item.直接主管ID)) { 簽核人員List.Add(String.Format("{0} {1}", item.直接主管ID, parent.Get員工姓名(item.直接主管ID)), item.直接主管ID); } // 所屬組織主管 組織圖List 組織data = Dao組織圖.SelectOne(item.組織ID); if (組織data.Count > 0) { string 主管ID = 組織data[0].部門主管; if (主管ID.Length > 0 && 主管ID.CompareTo(員工編號) != 0 && !簽核人員List.ValueExists(主管ID)) { 簽核人員List.Add(String.Format("{0} {1}", 主管ID, parent.Get員工姓名(主管ID)), 主管ID); } } } } public string 表單類別 { get { return DAC.GetString(ViewState["表單類別"]); } set { ViewState["表單類別"] = value; } } [Bindable(true)] public string 表單ID { get { return DAC.GetString(ViewState["表單ID"]); } set { ViewState["表單ID"] = value; } } [Bindable(true)] public string 表單ID格式 { get { return DAC.GetString(ViewState["表單ID格式"]); } set { ViewState["表單ID格式"] = value; } } [Bindable(true)] public bool 可送簽 { get { return DAC.GetBoolean(ViewState["可送簽"]); } set { ViewState["可送簽"] = value; } } [Bindable(true)] public int 訓練課程企劃編號 { get { return DAC.GetInt32(ViewState["訓練課程企劃編號"]); } set { ViewState["訓練課程企劃編號"] = value; } } [Bindable(true)] public int 編號2 { get { return DAC.GetInt32(ViewState["編號2"]); } set { ViewState["編號2"] = value; } } public string 提示文字 { get { return lbHint.Text; } set { lbHint.Text = value; } } public event EventHandler Approved; public event EventHandler Rejected; public event EventHandler Canceled; protected void btnApprove_Click(object sender, EventArgs e) { 表單簽核主檔 status = Dao表單簽核.GetLastStatus(表單類別, 表單ID); if (status == null) return; // 一般的簽核 if (status.應簽關數.CompareTo("D") != 0) { // 核准 if (rblApprove.SelectedValue == "Y") { bool 有下關 = Dao表單簽核.核准(status.簽核ID, parent.UserId, txtApproveText.Text, ddlApprover.SelectedValue); if (有下關) { // 發送送簽郵件 string 電子郵件 = parent.Dao員工.Get電子郵件(ddlApprover.SelectedValue); string 員工姓名 = parent.Dao員工.Get員工姓名(ddlApprover.SelectedValue); 發送郵件 發送郵件 = new 發送郵件(); 發送郵件.Context = Context; 發送郵件.發送簽核郵件(status.簽核ID, 員工姓名, 電子郵件); } if (Approved != null) Approved(sender, e); } // 不核准 if (rblApprove.SelectedValue == "N") { Dao表單簽核.不核准(status.簽核ID, parent.UserId, txtApproveText.Text); if (Rejected != null) Rejected(sender, e); } } // 撤簽的簽核 else { // 核准 if (rblApprove.SelectedValue == "Y") { Dao表單簽核.撤簽核准(status.簽核ID, parent.UserId, txtApproveText.Text); if (Approved != null) Approved(sender, e); } // 不核准 if (rblApprove.SelectedValue == "N") { Dao表單簽核.撤簽不核准(status.簽核ID, parent.UserId, txtApproveText.Text); if (Rejected != null) Rejected(sender, e); } } Refresh(); } protected void btnCancel_Click(object sender, EventArgs e) { 表單簽核主檔 status = Dao表單簽核.GetLastStatus(表單類別, 表單ID); if (status == null) return; Dao表單簽核.取消簽核(status.簽核ID); if (Canceled != null) Canceled(sender, e); Refresh(); } public event SendEventHandler Send; public event SendingEventHandler Sending; protected void btnSend_Click(object sender, EventArgs e) { if (Sending != null) { SendingEventArgs e1 = new SendingEventArgs() { 允許送簽 = true }; Sending(sender, e1); if (!e1.允許送簽) return; } // 送簽 int 簽核ID = Dao表單簽核.送簽(表單類別, 表單ID, parent.UserId, ddlApprover.SelectedValue, 表單ID格式, 訓練課程企劃編號, 編號2); // 發送送簽郵件 string 電子郵件 = parent.Dao員工.Get電子郵件(ddlApprover.SelectedValue); string 員工姓名 = parent.Dao員工.Get員工姓名(ddlApprover.SelectedValue); 發送郵件 發送郵件 = new 發送郵件(); 發送郵件.Context = Context; 發送郵件.發送簽核郵件(簽核ID, 員工姓名, 電子郵件); if (Send != null) Send(sender, new SendEventArgs() { 簽核ID = 簽核ID }); Refresh(); } protected void btnWithDraw_Click(object sender, EventArgs e) { // 抽單 表單簽核主檔 status = Dao表單簽核.GetLastStatus(表單類別, 表單ID); if (status == null) return; // 發送撤簽郵件 string 電子郵件 = parent.Dao員工.Get電子郵件(ddlWithdrawApprover.SelectedValue); string 員工姓名 = parent.Dao員工.Get員工姓名(ddlWithdrawApprover.SelectedValue); 發送郵件 發送郵件 = new 發送郵件(); 發送郵件.Context = Context; 發送郵件.發送撤簽郵件(status.簽核ID, 員工姓名, 電子郵件); Dao表單簽核.撤簽(status.簽核ID, ddlWithdrawApprover.SelectedValue); Refresh(); } protected string Get員工姓名(string 員工編號) { return parent.Get員工姓名(員工編號); } protected void ds簽核歷程_ObjectCreating(object sender, ObjectDataSourceEventArgs e) { e.ObjectInstance = Dao表單簽核明細; } } }