/// <summary>
        /// 簽核人抓取異常郵件通知
        /// </summary>
        /// <param name="dtHead">表頭</param>
        /// <param name="handler">處理人</param>
        /// <param name="errReason">異常原因</param>
        protected void GetHandlerErrAlarm(DataTable dtHead, string errReason)
        {
            DataRow drHead    = dtHead.Rows[0];
            string  sLongonId = drHead["ERNAM"].ToString().Trim().Replace(" ", "");
            string  sCaseno   = drHead["MBLNR_A"].ToString().Trim();
            string  plantCode = drHead["WERKS"].ToString().Trim();

            string sub  = "[" + plantCode + "]GoodsMovement--獲取簽核人錯誤";
            string body = "Dear's \r\n";

            body += "      單號-" + sCaseno + ";申請人-" + sLongonId + "\r\n";
            body += errReason + "\r\n";
            SPMBasic  SPMBasic_class = new SPMBasic();
            string    applicant      = SPMBasic_class.GetEMailByEName(sLongonId);
            SendMail  mail           = new SendMail();
            ArrayList to             = new ArrayList();

            if (applicant.Length > 0)
            {
                to.Add(applicant);
            }
            ArrayList cc = new ArrayList();

            cc.Add(DBIO.GetITWindow(plantCode));
            mail.SendMail_Normal(to, cc, sub, body, false);
        }
    protected void btnConfirm_Click(object sender, DirectEventArgs e)
    {
        StringBuilder errMsg    = new StringBuilder();
        StringBuilder errMsg1   = new StringBuilder();
        StringBuilder errMsg2   = new StringBuilder();
        string        file      = FileAttachment.FileName;
        string        Result    = string.Empty;
        int           total_num = 0;
        int           ok_num    = 0;
        int           ng_num    = 0;
        bool          isok      = true;

        if (sbProd_group.Text.Length == 0)
        {
            Alert("請選擇產品類別!");
            return;
        }
        if (!FileAttachment.HasFile)
        {
            Alert("請選擇数据文件!");
            return;
        }
        else
        {
            string type = file.Substring(file.LastIndexOf(".") + 1).ToLower();
            if (type == "xlsx")
            {
                //把文件轉成流
                Stream stream = FileAttachment.PostedFile.InputStream;
                if (stream.Length == 8889)
                {
                    Alert("導入的資料表為空,請檢查!");
                    return;
                }
                try
                {
                    DataTable dt = ReadByExcelLibrary(stream);
                    if (dt.Rows.Count > 0)
                    {
                        NPIMgmt              oMgmt                 = new NPIMgmt(lblSite.Text, lblBu.Text);
                        NPI_Standard         oStandard             = oMgmt.InitialLeaveMgmt();
                        Model_NPI_APP_MEMBER oModel_NPI_APP_Member = new Model_NPI_APP_MEMBER();
                        oModel_NPI_APP_Member._UPDATE_USERID = lblLogonId.Text.Trim();
                        oModel_NPI_APP_Member._UPDATE_TIME   = DateTime.Today;
                        oModel_NPI_APP_Member._DOC_NO        = txtDOC_NO.Text;



                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            string dept         = dt.Rows[i]["Dept"].ToString();
                            string Category     = dt.Rows[i]["Category"].ToString();
                            string WriteName    = dt.Rows[i]["WriteEname"].ToString();
                            string ReplyEName   = dt.Rows[i]["ReplyEName"].ToString();
                            string CheckedEName = dt.Rows[i]["CheckedEName"].ToString();

                            DataTable dtW = CheckUserInfo(WriteName);
                            DataTable dtR = CheckUserInfo(ReplyEName);
                            DataTable dtC = CheckUserInfo(CheckedEName);

                            #region 檢查  Write Reply Check人員必須都為空或者都不為空
                            if (Category == "DFX TeamMember" || Category == "CTQ TeamMember" || Category == "ISSUES TeamMember" || Category == "PFMEA TeamMember")
                            {
                                #region
                                if (WriteName.Length == 0 && (ReplyEName.Length > 0 && CheckedEName.Length > 0))
                                {
                                    errMsg.Append("第" + (i + 2) + "行");
                                    errMsg.Append("簽核人員必須都為空後者都不為空</br>");
                                }
                                if (WriteName.Length == 0 && (ReplyEName.Length == 0 && CheckedEName.Length > 0))
                                {
                                    errMsg.Append("第" + (i + 2) + "行");
                                    errMsg.Append("簽核人員必須都為空後者都不為空</br>");
                                }
                                if (WriteName.Length == 0 && (ReplyEName.Length > 0 && CheckedEName.Length == 0))
                                {
                                    errMsg.Append("第" + (i + 2) + "行");
                                    errMsg.Append("簽核人員必須都為空後者都不為空</br>");
                                }

                                if (ReplyEName.Length == 0 && (WriteName.Length > 0 && CheckedEName.Length > 0))
                                {
                                    errMsg.Append("第" + (i + 2) + "行");
                                    errMsg.Append("簽核人員必須都為空後者都不為空</br>");
                                }
                                if (ReplyEName.Length == 0 && (WriteName.Length == 0 && CheckedEName.Length > 0))
                                {
                                    errMsg.Append("第" + (i + 2) + "行");
                                    errMsg.Append("簽核人員必須都為空後者都不為空</br>");
                                }
                                if (ReplyEName.Length == 0 && (WriteName.Length > 0 && CheckedEName.Length == 0))
                                {
                                    errMsg.Append("第" + (i + 2) + "行");
                                    errMsg.Append("簽核人員必須都為空後者都不為空</br>");
                                }


                                if (CheckedEName.Length == 0 && (ReplyEName.Length > 0 && WriteName.Length > 0))
                                {
                                    errMsg.Append("第" + (i + 2) + "行");
                                    errMsg.Append("簽核人員必須都為空後者都不為空</br>");
                                }
                                if (CheckedEName.Length == 0 && (ReplyEName.Length == 0 && WriteName.Length > 0))
                                {
                                    errMsg.Append("第" + (i + 2) + "行");
                                    errMsg.Append("簽核人員必須都為空後者都不為空</br>");
                                }
                                if (CheckedEName.Length == 0 && (ReplyEName.Length > 0 && WriteName.Length == 0))
                                {
                                    errMsg.Append("第" + (i + 2) + "行");
                                    errMsg.Append("簽核人員必須都為空後者都不為空</br>");
                                }


                                #endregion
                            }
                            #endregion

                            #region 檢查關卡名的準確性
                            if (!IsStepName(Category))
                            {
                                isok = false;
                                errMsg.Append("第" + (i + 2) + "行");
                                errMsg.Append("關卡名填寫錯誤!</br>");
                            }
                            #endregion

                            #region 檢查成員名準確性  不為空時 拼寫是否正確
                            if (Category == "DFX TeamMember" || Category == "CTQ TeamMember" || Category == "ISSUES TeamMember" || Category == "PFMEA TeamMember")
                            {
                                if (dtW.Rows.Count == 0 && WriteName.Length > 0)
                                {
                                    isok = false;
                                    errMsg.Append("第" + (i + 2) + "行Write人員不存在</br>");
                                }
                                if (dtR.Rows.Count == 0 && ReplyEName.Length > 0)
                                {
                                    isok = false;
                                    errMsg.Append("第" + (i + 2) + "行Reply人員不存在</br>");
                                }
                                if (dtC.Rows.Count == 0 && CheckedEName.Length > 0)
                                {
                                    isok = false;
                                    errMsg.Append("第" + (i + 2) + "行Check人員不存在</br>");
                                }
                            }
                            else
                            {
                                if (WriteName.Length > 0)
                                {
                                    if (dtW.Rows.Count == 0)
                                    {
                                        isok = false;
                                        errMsg.Append("第" + (i + 2) + "行Write人員不存在</br>");
                                    }
                                }
                                if (ReplyEName.Length > 0)
                                {
                                    if (dtR.Rows.Count == 0)
                                    {
                                        isok = false;
                                        errMsg.Append("第" + (i + 2) + "行Reply人員不存在</br>");
                                    }
                                }
                                if (CheckedEName.Length > 0)
                                {
                                    if (dtC.Rows.Count == 0)
                                    {
                                        isok = false;
                                        errMsg.Append("第" + (i + 2) + "行Check人員不存在</br>");
                                    }
                                }
                            }
                            #endregion
                        }

                        #region 數據處理
                        foreach (DataRow dr in dt.Rows)
                        {
                            total_num = dt.Rows.Count;
                            try
                            {
                                oModel_NPI_APP_Member._Category     = dr["Category"].ToString();
                                oModel_NPI_APP_Member._DEPT         = dr["Dept"].ToString();;
                                oModel_NPI_APP_Member._WriteEname   = dr["WriteEname"].ToString();
                                oModel_NPI_APP_Member._ReplyEName   = dr["ReplyEname"].ToString();
                                oModel_NPI_APP_Member._CheckedEname = dr["CheckedEname"].ToString();

                                SPMBasic oSpmBasic = new SPMBasic();
                                oModel_NPI_APP_Member._ReplyEmai    = oSpmBasic.GetEMailByEName(dr["ReplyEname"].ToString());
                                oModel_NPI_APP_Member._WriteEmail   = oSpmBasic.GetEMailByEName(dr["WriteEname"].ToString());
                                oModel_NPI_APP_Member._CheckedEmail = oSpmBasic.GetEMailByEName(dr["CheckedEname"].ToString());

                                if (isok)
                                {
                                    Dictionary <string, object> result = oStandard.RecordOperation_APPMemeber(oModel_NPI_APP_Member, Status_Operation.ADD);

                                    if ((bool)result["Result"])
                                    {
                                        ok_num += 1;
                                    }
                                    else
                                    {
                                        ng_num += 1;
                                        Alert((string)result["ErrMsg"].ToString());
                                    }
                                }

                                else
                                {
                                    ng_num += 1;
                                }
                            }
                            catch (Exception ex)
                            {
                                Alert(ex.ToString());
                            }
                        }
                        #endregion

                        if (errMsg.Length == 0)
                        {
                            string    DocNo       = txtDOC_NO.Text;
                            string    ProductType = sbProd_group.Text;
                            string    DFXCategory = "DFX TeamMember";
                            string    CTQCategory = "CTQ TeamMember";
                            DataTable dtDFXCount  = CompareDeptCountDFX(DocNo, ProductType, DFXCategory);
                            DataTable dtCTQCount  = CompareDeptCountCTQ(DocNo, ProductType, CTQCategory);
                            string    DFXDept     = dtDFXCount.Rows[0]["Dept"].ToString();
                            string    CTQDept     = dtCTQCount.Rows[0]["Dept"].ToString();

                            #region 先判斷DFX CTQ的部門數量是否一致
                            if (DFXDept.Length > 0)
                            {
                                errMsg2.Append("DFX " + DFXDept + "部門未維護</br>");
                            }
                            if (CTQDept.Length > 0)
                            {
                                errMsg2.Append("CTQ " + CTQDept + "部門未維護</br>");
                            }
                            if (errMsg2.Length > 0)
                            {
                                DeleteExist(txtDOC_NO.Text);//有異常則刪除已上傳的資料
                                BindMember(txtDOC_NO.Text, string.Empty);
                                Alert(string.Format("錯誤信息:<BR/>{0}", errMsg2.ToString()));
                                return;
                            }

                            #endregion

                            #region 根據已經Insert的數據進行第二次Check判斷 該部門某個階段都為空 其餘階段也必須為空
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                string WriteEname   = dt.Rows[i]["WriteEname"].ToString();
                                string ReplyEName   = dt.Rows[i]["ReplyEName"].ToString();
                                string CheckedEName = dt.Rows[i]["CheckedEName"].ToString();
                                string WriteDept    = dt.Rows[i]["Dept"].ToString();
                                //DataTable dtCheckCount = CheckDFXDept(DocNo, ProductType, Category);//當前團隊
                                if (WriteEname.Length == 0 && ReplyEName.Length == 0 && CheckedEName.Length == 0)
                                {
                                    string DFXType = dt.Rows[i]["Category"].ToString();

                                    #region DFX 對應部門的簽核人
                                    DataTable dtDFX      = GetMember(txtDOC_NO.Text, "DFX TeamMember", WriteDept);
                                    string    WriteDFX   = dtDFX.Rows[0]["WriteEname"].ToString();
                                    string    ReplyDFX   = dtDFX.Rows[0]["ReplyEName"].ToString();
                                    string    CheckedDFX = dtDFX.Rows[0]["CheckedEName"].ToString();
                                    #endregion

                                    #region CTQ 對應部門簽核人
                                    DataTable dtCTQ      = GetMember(txtDOC_NO.Text, "CTQ TeamMember", WriteDept);
                                    string    WriteCTQ   = dtCTQ.Rows[0]["WriteEname"].ToString();
                                    string    ReplyCTQ   = dtCTQ.Rows[0]["ReplyEName"].ToString();
                                    string    CheckedCTQ = dtCTQ.Rows[0]["CheckedEName"].ToString();
                                    #endregion

                                    #region Issue 對應部門簽核人
                                    DataTable dtIssue      = GetMember(txtDOC_NO.Text, "ISSUES TeamMember", WriteDept);
                                    string    WriteIssue   = dtIssue.Rows[0]["WriteEname"].ToString();
                                    string    ReplyIssue   = dtIssue.Rows[0]["ReplyEName"].ToString();
                                    string    CheckedIssue = dtIssue.Rows[0]["CheckedEName"].ToString();
                                    #endregion

                                    #region FMEA 對應部門簽核人
                                    DataTable dtFMEA      = GetMember(txtDOC_NO.Text, "PFMEA TeamMember", WriteDept);
                                    string    WriteFMEA   = dtFMEA.Rows[0]["WriteEname"].ToString();
                                    string    ReplyFMEA   = dtFMEA.Rows[0]["ReplyEName"].ToString();
                                    string    CheckedFMEA = dtFMEA.Rows[0]["CheckedEName"].ToString();
                                    #endregion

                                    #region Check Part 1
                                    if (DFXType == "DFX TeamMember")
                                    {
                                        if (WriteCTQ.Length > 0 || ReplyCTQ.Length > 0 || CheckedCTQ.Length > 0)
                                        {
                                            errMsg1.Append("DFX " + WriteDept + "部門人員為空時, CTQ也必須都為空</br>");
                                        }
                                        if (WriteIssue.Length > 0 || ReplyIssue.Length > 0 || CheckedIssue.Length > 0)
                                        {
                                            errMsg1.Append("DFX " + WriteDept + "部門人員為空時, Issue也必須都為空</br>");
                                        }
                                        if (WriteFMEA.Length > 0 || ReplyFMEA.Length > 0 || CheckedFMEA.Length > 0)
                                        {
                                            errMsg1.Append("DFX " + WriteDept + "部門人員為空時, FMEA也必須都為空</br>");
                                        }
                                    }
                                    if (DFXType == "CTQ TeamMember")
                                    {
                                        if (WriteDFX.Length > 0 || ReplyDFX.Length > 0 || CheckedDFX.Length > 0)
                                        {
                                            errMsg1.Append("CTQ " + WriteDept + "部門人員為空時, DFX也必須都為空</br>");
                                        }
                                        if (WriteIssue.Length > 0 || ReplyIssue.Length > 0 || CheckedIssue.Length > 0)
                                        {
                                            errMsg1.Append("CTQ " + WriteDept + "部門人員為空時, Issue也必須都為空</br>");
                                        }
                                        if (WriteFMEA.Length > 0 || ReplyFMEA.Length > 0 || CheckedFMEA.Length > 0)
                                        {
                                            errMsg1.Append("CTQ " + WriteDept + "部門人員為空時, FMEA也必須都為空</br>");
                                        }
                                    }
                                    if (DFXType == "ISSUES TeamMember")
                                    {
                                        if (WriteDFX.Length > 0 || ReplyDFX.Length > 0 || CheckedDFX.Length > 0)
                                        {
                                            errMsg1.Append("Issue " + WriteDept + "部門人員為空時, DFX也必須都為空</br>");
                                        }
                                        if (WriteCTQ.Length > 0 || ReplyCTQ.Length > 0 || CheckedCTQ.Length > 0)
                                        {
                                            errMsg1.Append("Issue " + WriteDept + "部門人員為空時, CTQ也必須都為空</br>");
                                        }
                                        if (WriteFMEA.Length > 0 || ReplyFMEA.Length > 0 || CheckedFMEA.Length > 0)
                                        {
                                            errMsg1.Append("Issue " + WriteDept + "部門人員為空時, FMEA也必須都為空</br>");
                                        }
                                    }
                                    if (DFXType == "PFMEA TeamMember")
                                    {
                                        if (WriteDFX.Length > 0 || ReplyDFX.Length > 0 || CheckedDFX.Length > 0)
                                        {
                                            errMsg1.Append("FMEA " + WriteDept + "部門人員為空時, DFX也必須都為空</br>");
                                        }
                                        if (WriteCTQ.Length > 0 || ReplyCTQ.Length > 0 || CheckedCTQ.Length > 0)
                                        {
                                            errMsg1.Append("FMEA " + WriteDept + "部門人員為空時, CTQ也必須都為空</br>");
                                        }
                                        if (WriteIssue.Length > 0 || ReplyIssue.Length > 0 || CheckedIssue.Length > 0)
                                        {
                                            errMsg1.Append("FMEA " + WriteDept + "部門人員為空時, Issue也必須都為空</br>");
                                        }
                                    }
                                    #endregion

                                    #region Check Part2

                                    #endregion
                                }

                                if (errMsg1.Length > 0)
                                {
                                    DeleteExist(txtDOC_NO.Text);//有異常則刪除已上傳的資料
                                    BindMember(txtDOC_NO.Text, string.Empty);
                                    Alert(string.Format("錯誤信息:<BR/>{0}", errMsg1.ToString()));
                                    return;
                                }
                            }
                            #endregion
                        }
                    }
                }
                catch (Exception ex)
                {
                    Alert("Excel數據有問題,錯誤信息: " + ex.Message);
                    return;
                }
            }
            else
            {
                Alert("文件類型只能為xlsx");
                return;
            }
        }

        //存在錯誤信息 則刪除已新增的數據
        if (errMsg.Length > 0)
        {
            DeleteExist(txtDOC_NO.Text);
            BindMember(txtDOC_NO.Text, string.Empty);
            Alert(string.Format("錯誤信息:<BR/>{0}", errMsg.ToString()));
        }
        else
        {
            BindMember(txtDOC_NO.Text, string.Empty);
            Alert(string.Format("上傳筆數:{0}<BR/>成功筆數:{1}<BR/>失敗筆數:{2}<BR/>錯誤信息:<BR/>{3}", total_num.ToString(), ok_num.ToString(), ng_num.ToString(), errMsg.ToString()));
        }
    }
    protected void btnAdd_Click(object sender, DirectEventArgs e)
    {
        string Catgory      = cmbType.SelectedItem.Text;
        string Dept         = cobDept.SelectedItem.Text;
        string WriteEname   = sbName.SelectedItem.Value;
        string ReplyEname   = sbReply.SelectedItem.Value;
        string CheckedEname = sbChecked.SelectedItem.Value;

        #region  [ Valid Fields]

        StringBuilder ErrMsg = new StringBuilder();
        if (string.IsNullOrEmpty(Catgory))
        {
            ErrMsg.Append("請選擇團隊類別</br>");
        }
        if (string.IsNullOrEmpty(Dept))
        {
            ErrMsg.Append("請選擇部門</br>");
        }
        if (string.IsNullOrEmpty(WriteEname))
        {
            ErrMsg.Append("請選擇填寫人員</br>");
        }
        if (string.IsNullOrEmpty(ReplyEname))
        {
            ErrMsg.Append("請選擇回覆人員</br>");
        }
        if (ErrMsg.ToString().Length > 0)
        {
            Alert(ErrMsg.ToString());
        }
        #endregion

        NPIMgmt              oMgmt                 = new NPIMgmt(lblSite.Text, lblBu.Text);
        NPI_Standard         oStandard             = oMgmt.InitialLeaveMgmt();
        Model_NPI_APP_MEMBER oModel_NPI_APP_Member = new Model_NPI_APP_MEMBER();
        oModel_NPI_APP_Member._UPDATE_USERID = lblLogonId.Text.Trim();
        oModel_NPI_APP_Member._UPDATE_TIME   = DateTime.Today;
        oModel_NPI_APP_Member._Category      = Catgory;
        oModel_NPI_APP_Member._DEPT          = Dept;
        oModel_NPI_APP_Member._WriteEname    = WriteEname;
        oModel_NPI_APP_Member._ReplyEName    = ReplyEname;
        oModel_NPI_APP_Member._DOC_NO        = txtDOC_NO.Text;
        oModel_NPI_APP_Member._CheckedEname  = CheckedEname;

        SPMBasic oSpmBasic = new SPMBasic();
        oModel_NPI_APP_Member._ReplyEmai    = oSpmBasic.GetEMailByEName(ReplyEname);
        oModel_NPI_APP_Member._WriteEmail   = oSpmBasic.GetEMailByEName(WriteEname);
        oModel_NPI_APP_Member._CheckedEmail = oSpmBasic.GetEMailByEName(CheckedEname);

        try
        {
            Dictionary <string, object> result = oStandard.RecordOperation_APPMemeber(oModel_NPI_APP_Member, Status_Operation.ADD);
            if ((bool)result["Result"])
            {
                Alert("新增團隊成員成功!");
            }
            else
            {
                Alert((string)result["ErrMsg"].ToString());
            }
        }
        catch (Exception ex)
        {
            Alert(ex.ToString());
        }
        BindMember(txtDOC_NO.Text, string.Empty);
    }