Пример #1
0
 protected void btnFlowDeleted_Click(object sender, EventArgs e)
 {
     FlowExpressTraceLog.Init(true);
     labFlowDeleted.Text = FlowExpress.IsFlowCaseDeleted(FlowDeleted_FlowID.ucSelectedID, FlowDeleted_FlowCaseID.Text, FlowDeleted_IsRun.Checked).ToString();
     if (FlowExpressTraceLog.IsError())
     {
         labFlowDeleted.Text += "<hr>" + FlowExpressTraceLog.getFlowExpressTraceLogInfoPage();
     }
 }
Пример #2
0
 protected void FlowCaseValueChanged_Click(object sender, EventArgs e)
 {
     FlowExpressTraceLog.Init(true);
     FlowExpress.FlowCaseValueChangeKind tKind = (FlowExpress.FlowCaseValueChangeKind) int.Parse(FlowCaseValueChanged_ChangeKind.SelectedValue);
     labFlowCaseValueChanged.Text = FlowExpress.IsFlowCaseValueChanged(FlowCaseValueChanged_FlowID.ucSelectedID, FlowCaseValueChanged_FlowCaseID.Text, tKind, FlowCaseValueChanged_NewValues.Text.Split(','), FlowCaseValueChanged_ChkFields.Text.Split(',')).ToString();
     if (FlowExpressTraceLog.IsError())
     {
         labFlowCaseValueChanged.Text += "<hr>" + FlowExpressTraceLog.getFlowExpressTraceLogInfoPage();
     }
 }
Пример #3
0
    //2015.07.24 新增
    protected void btnFlowSysBtnVerify_Click(object sender, EventArgs e)
    {
        FlowExpressTraceLog.Init(true);
        FlowExpress oFlow = new FlowExpress(FlowSysBtnVerify_FlowID.ucSelectedID, FlowSysBtnVerify_FlowCaseID.Text, false, false);

        if (oFlow != null)
        {
            labFlowSysBtnVerify.Text = FlowExpress.IsFlowSysStepBtnVerify(oFlow.FlowID, oFlow.FlowCurrLastLogID, FlowSysBtnVerify_FlowSysStepBtnID.ucSelectedID, FlowSysBtnVerify_FlowCloseStepID.ucSelectedID, null, FlowSysBtnVerify_Opinion.Text).ToString();
            if (FlowExpressTraceLog.IsError())
            {
                labFlowSysBtnVerify.Text += "<hr>" + FlowExpressTraceLog.getFlowExpressTraceLogInfoPage();
            }
        }
        else
        {
            labFlowSysBtnVerify.Text = "初始 FlowExpress 物件錯誤";
        }
    }
Пример #4
0
    protected void IsFlowReAssign_Click(object sender, EventArgs e)
    {
        FlowExpressTraceLog.Init(true);
        if (IsFlowReAssign_ReAssignTo.Text.IsJSON())
        {
            //2017.01.25 新增改派對象可使用 JSON 格式
            labIsFlowReAssign.Text = FlowExpress.IsFlowReAssign(IsFlowReAssign_FlowID.ucSelectedID, IsFlowReAssign_FlowLogID.Text, Util.getDictionary(IsFlowReAssign_ReAssignTo.Text), IsFlowReAssign_Opinion.Text, IsFlowReAssign_IsRun.Checked).ToString();
        }
        else
        {
            labIsFlowReAssign.Text = FlowExpress.IsFlowReAssign(IsFlowReAssign_FlowID.ucSelectedID, IsFlowReAssign_FlowLogID.Text, IsFlowReAssign_ReAssignTo.Text, IsFlowReAssign_Opinion.Text, IsFlowReAssign_IsRun.Checked).ToString();
        }

        if (FlowExpressTraceLog.IsError())
        {
            labIsFlowReAssign.Text += "<hr>" + FlowExpressTraceLog.getFlowExpressTraceLogInfoPage();
        }
    }
Пример #5
0
    protected void btnStartVerify_Click(object sender, EventArgs e)
    {
        FlowExpress oFlow = new FlowExpress();

        labFlowVerifyMsg.Text = "";
        string strShowPopBtnJS = "";

        //取得流程意見,若為空白則補上預設值
        if (string.IsNullOrEmpty(txtFlowOpinion.ucTextData))
        {
            txtFlowOpinion.ucTextData = oFlow.FlowDefOpinion;
        }
        //取得指派對象,需將 value 中包含的項目Key移除
        AjaxControlToolkit.TabPanel TabVerify = TabVerifyContainer.ActiveTab;
        string strBtnSeqNo = TabVerify.ID.Right(2);
        Dictionary <string, string> oAssDic = new Dictionary <string, string>();

        //單選指派
        Util_ucCommSingleSelect oneVerify = (Util_ucCommSingleSelect)Util.FindControlEx(TabVerify, "oneVerify" + strBtnSeqNo);

        if (oneVerify.Visible)
        {
            oAssDic.AddRange(Util.getDictionary(oneVerify.ucSelectedDictionary, false));
        }
        //複選指派
        //可能是 ucCommMultiSelect 或是 ucCheckBoxList 2016.09.20
        Util_ucCommMultiSelect muiVerify = (Util_ucCommMultiSelect)Util.FindControlEx(TabVerify, "muiVerify" + strBtnSeqNo);

        if (muiVerify.Visible)
        {
            oAssDic.AddRange(Util.getDictionary(muiVerify.ucSelectedDictionary, false));
        }

        Util_ucCheckBoxList chkVerify = (Util_ucCheckBoxList)Util.FindControlEx(TabVerify, "chkVerify" + strBtnSeqNo);

        if (chkVerify.Visible)
        {
            oAssDic.AddRange(Util.getDictionary(chkVerify.ucSelectedDictionary, false));
        }


        //2014.10.20 新增
        //任意指派
        Util_ucUserPicker anyVerify = (Util_ucUserPicker)Util.FindControlEx(TabVerify, "anyVerify" + strBtnSeqNo);

        if (anyVerify.Visible && !string.IsNullOrEmpty(anyVerify.ucSelectedUserIDList))
        {
            for (int i = 0; i < anyVerify.ucSelectedUserIDList.Split(',').Count(); i++)
            {
                oAssDic.Add(anyVerify.ucSelectedUserIDList.Split(',')[i], UserInfo.findUserName(anyVerify.ucSelectedUserIDList.Split(',')[i]));
            }
        }

        //2014.11.05 新增
        //全部指派
        ListBox allVerify = (ListBox)Util.FindControlEx(TabVerify, "allVerify" + strBtnSeqNo);

        if (allVerify.Visible)
        {
            oAssDic.AddRange(Util.getDictionary(Util.getDictionary(allVerify.GetAllItems()), false));
        }

        //只顯示 [tabFlowVerify] 頁籤 2017.02.07
        tabCustForm.Visible      = false;
        tabFlowAttach.Visible    = false;
        tabFlowFullLog.Visible   = false;
        DivVerifyBtnArea.Visible = false;
        DivVerifyMsgArea.Visible = true;

        strShowPopBtnJS += "var oClose = parent.document.getElementById('ucFlowTodoList1_ucModalPopup1_btnClose');";
        strShowPopBtnJS += "if (oClose != null){oClose.style.display='';}";
        strShowPopBtnJS += "var oComplete = parent.document.getElementById('ucFlowTodoList1_ucModalPopup1_btnComplete');";
        strShowPopBtnJS += "if (oComplete != null){oComplete.style.display='';}";
        Util.setJSContent(strShowPopBtnJS);

        if (oAssDic.Count > 0)
        {
            //指派對象有值,可進行審核
            labFlowVerifyMsg.Text = "";
            Dictionary <string, string> dicBtnContext = Util.getDictionary(TabVerify.DynamicContextKey);  //取出btn參數
            string strFlowStepBtnID = dicBtnContext["FlowStepBtnID"].ToString().Trim();
            string strFlowStepBtnIsAddMultiSubFlow   = dicBtnContext["FlowStepBtnIsAddMultiSubFlow"].ToString().Trim().ToUpper();
            string strFlowStepBtnAddSubFlowID        = dicBtnContext["FlowStepBtnAddSubFlowID"].ToString().Trim();
            string strFlowStepBtnAddSubFlowStepBtnID = dicBtnContext["FlowStepBtnAddSubFlowStepBtnID"].ToString().Trim();
            string strFlowStepOpinion = txtFlowOpinion.ucTextData;

            bool IsNeedAddSubFlow    = false;
            bool IsAddSubFlowSucceed = false;

            //檢查是否有按鈕停止條件 2017.05.25 新增
            string[] oStopReasonList;
            string   strStopResonMsg;
            if (FlowExpress.IsFlowStepButtonStop(oFlow, strFlowStepBtnID, out oStopReasonList))
            {
                strStopResonMsg = string.Format(WorkRS.Resources.FlowVerifyMsg_StopVerify1, oFlow.FlowCaseHtmlInfo);
                if (!oStopReasonList.IsNullOrEmpty())
                {
                    string strStopReasonTip = string.Format(" {0} \n", WorkRS.Resources.FlowVerifyMsg_StopReasonTipTitle);
                    for (int i = 0; i < oStopReasonList.Length; i++)
                    {
                        strStopReasonTip += string.Format(" ● {0}\n", oStopReasonList[i]);
                    }
                    strStopResonMsg = string.Format("<span title=\"{0}\">{1}</span>", strStopReasonTip, strStopResonMsg);
                }
                labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, strStopResonMsg);
                return;
            }

            //檢查是否有自訂審核URL
            if (!string.IsNullOrEmpty(oFlow.FlowCurrStepCustVerifyURL))
            {
                if (System.IO.File.Exists(Server.MapPath(oFlow.FlowCurrStepCustVerifyURL)))
                {
                    //==若有自訂審核URL==
                    //設定Session傳遞參數[FlowVerifyInfo]
                    dicBtnContext.Add("FlowStepAssignToList", Util.getJSON(oAssDic));
                    dicBtnContext.Add("FlowStepOpinion", strFlowStepOpinion);
                    dicBtnContext.Add("FlowVerifyJS", strShowPopBtnJS);
                    Session["FlowVerifyInfo"] = dicBtnContext;
                    //因為 Ajax Page 無法使用Server.Transfer,故 CustVerifyURL 改用 Response.Redirect()執行
                    //設定 CustVerifyURL
                    string strVerifyURL = string.Format("{0}?FlowID={1}&FlowLogID={2}", oFlow.FlowCurrStepCustVerifyURL, oFlow.FlowID, oFlow.FlowLogID);
                    for (int i = 0; i < oFlow.FlowKeyFieldList.Count(); i++)
                    {
                        if (oFlow.FlowKeyFieldList[i].ToUpper() != "_AUTONO")
                        {
                            strVerifyURL += string.Format("&{0}={1}", oFlow.FlowKeyFieldList[i], oFlow.FlowKeyValueList[i]);
                        }
                    }
                    Response.Redirect(strVerifyURL);
                }
                else
                {
                    labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, string.Format(RS.Resources.Msg_NotExist1, oFlow.FlowCurrStepCustVerifyURL));
                }
                return;
            }

            //==無自訂審核URL==
            //處理[新增子流程]
            if (!string.IsNullOrEmpty(strFlowStepBtnAddSubFlowID) && !string.IsNullOrEmpty(strFlowStepBtnAddSubFlowStepBtnID))
            {
                //檢查是否自動新增子流程
                FlowExpress oSubFlow = new FlowExpress(strFlowStepBtnAddSubFlowID, null, false, false);
                //該子流程需符合以下條件才能自動新增:
                //01.子流程與父流程名稱不同
                //  子流程的 KeyFieldList 需只比主流程多出 _AutoNo 欄位 
                //  子流程的 KeyFieldsList 需與主流程的 KeyShowFieldList 相同
                //02.子流程與父流程名稱相同(遞迴)
                //  KeyFieldList 最後一欄需為 _AutoNo 欄位 
                if (oFlow.FlowID != strFlowStepBtnAddSubFlowID)
                {
                    //01.子流程與父流程名稱不同
                    string[] diffList = Util.getCompareList(oFlow.FlowKeyFieldList, oSubFlow.FlowKeyFieldList, Util.ListCompareMode.Diff);
                    if (diffList.Count() == 1 && diffList[0].ToUpper() == "_AUTONO")
                    {
                        if (Util.getCompareList(oFlow.FlowShowFieldList, oSubFlow.FlowShowFieldList, Util.ListCompareMode.Diff).Count() == 0)
                        {
                            IsNeedAddSubFlow = true;
                            if (strFlowStepBtnIsAddMultiSubFlow == "Y")
                            {
                                Dictionary <string, string> oTmpAss = new Dictionary <string, string>();
                                //每個指派對象都產生獨立子流程(只要其中一個子流程新增失敗,就自動中斷)
                                IsAddSubFlowSucceed = true;
                                foreach (var pair in oAssDic)
                                {
                                    oTmpAss.Clear();
                                    oTmpAss.Add(pair.Key, pair.Value);
                                    if (IsAddSubFlowSucceed)
                                    {
                                        if (FlowExpress.IsFlowInsVerify(oSubFlow.FlowID, oFlow.FlowKeyValueList, oFlow.FlowShowValueList, strFlowStepBtnAddSubFlowStepBtnID, oTmpAss, strFlowStepOpinion, oFlow.FlowID, oFlow.FlowLogID))
                                        {
                                            IsAddSubFlowSucceed    = true;
                                            labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Succeed, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowSucceed);
                                        }
                                        else
                                        {
                                            IsAddSubFlowSucceed    = false;
                                            labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowError);
                                        }
                                    }
                                }
                            }
                            else
                            {
                                //所有指派對象只產生一個子流程
                                if (FlowExpress.IsFlowInsVerify(oSubFlow.FlowID, oFlow.FlowKeyValueList, oFlow.FlowShowValueList, strFlowStepBtnAddSubFlowStepBtnID, oAssDic, strFlowStepOpinion, oFlow.FlowID, oFlow.FlowLogID))
                                {
                                    IsAddSubFlowSucceed    = true;
                                    labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Succeed, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowSucceed);
                                }
                                else
                                {
                                    IsAddSubFlowSucceed    = false;
                                    labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowError);
                                }
                            }
                        }
                    }
                }
                else
                {
                    //02.子流程與父流程名稱相同(遞迴)
                    if (oFlow.FlowKeyFieldList[oFlow.FlowKeyFieldList.Count() - 1].ToUpper() == "_AUTONO")
                    {
                        IsNeedAddSubFlow = true;
                        //組合子流程的 KeyValueList
                        string[] subKeyValueList = new string[oFlow.FlowKeyFieldList.Count() - 1];
                        for (int i = 0; i < subKeyValueList.Count(); i++)
                        {
                            subKeyValueList[i] = oFlow.FlowKeyValueList[i];
                        }

                        if (strFlowStepBtnIsAddMultiSubFlow == "Y")
                        {
                            Dictionary <string, string> oTmpAss = new Dictionary <string, string>();
                            //每個指派對象都產生獨立子流程(只要其中一個子流程新增失敗,就自動中斷)
                            IsAddSubFlowSucceed = true;
                            foreach (var pair in oAssDic)
                            {
                                oTmpAss.Clear();
                                oTmpAss.Add(pair.Key, pair.Value);
                                if (IsAddSubFlowSucceed)
                                {
                                    if (FlowExpress.IsFlowInsVerify(oSubFlow.FlowID, subKeyValueList, oFlow.FlowShowValueList, strFlowStepBtnAddSubFlowStepBtnID, oTmpAss, strFlowStepOpinion, oFlow.FlowID, oFlow.FlowLogID))
                                    {
                                        IsAddSubFlowSucceed    = true;
                                        labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Succeed, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowSucceed);
                                    }
                                    else
                                    {
                                        IsAddSubFlowSucceed    = false;
                                        labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowError);
                                    }
                                }
                            }
                        }
                        else
                        {
                            //所有指派對象只產生一個子流程
                            if (FlowExpress.IsFlowInsVerify(oSubFlow.FlowID, subKeyValueList, oFlow.FlowShowValueList, strFlowStepBtnAddSubFlowStepBtnID, oAssDic, strFlowStepOpinion, oFlow.FlowID, oFlow.FlowLogID))
                            {
                                IsAddSubFlowSucceed    = true;
                                labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Succeed, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowSucceed);
                            }
                            else
                            {
                                IsAddSubFlowSucceed    = false;
                                labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowError);
                            }
                        }
                    }
                }
            }

            //處理[主流程審核]
            if (IsNeedAddSubFlow)
            {
                //需先[新增子流程]
                if (IsAddSubFlowSucceed)
                {
                    //若[新增子流程]成功
                    //當[FlowStepBtnAssignToList]有值,才執行主流程的[一般審核]  2015.08.26 優化
                    oAssDic.Clear();
                    oAssDic = Util.getDictionary(dicBtnContext["FlowStepBtnAssignToList"].ToString());
                    if (oAssDic != null && oAssDic.Count > 0)
                    {
                        if (FlowExpress.IsFlowVerify(oFlow.FlowID, oFlow.FlowLogID, strFlowStepBtnID, oAssDic, strFlowStepOpinion))
                        {
                            labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Succeed, string.Format(WorkRS.Resources.FlowVerifyMsg_FlowVerifySucceed1, oFlow.FlowCaseHtmlInfo)); //2017.05.11 改顯示 FlowCaseHtmlInfo
                        }
                        else
                        {
                            labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, string.Format(WorkRS.Resources.FlowVerifyMsg_FlowVerifyError1, oFlow.FlowCaseHtmlInfo)); //2017.05.11 改顯示 FlowCaseHtmlInfo
                            //2014.11.27 顯示審核錯誤原因
                            DataTable dtError = FlowExpressTraceLog.getFlowExpressErrorLogData(oFlow.FlowID, oFlow.FlowCaseID, oFlow.FlowLogID);
                            if (dtError != null && dtError.Rows.Count > 0)
                            {
                                labFlowVerifyMsg.Text += "<ul>";
                                for (int i = 0; i < dtError.Rows.Count; i++)
                                {
                                    labFlowVerifyMsg.Text += string.Format("<li style='color:gray;'>{0}</li>", dtError.Rows[i]["LogDesc"].ToString().Trim());
                                }
                                labFlowVerifyMsg.Text += "</ul>";
                            }
                        }
                    }
                }
            }
            else
            {
                //一般審核
                if (FlowExpress.IsFlowVerify(oFlow.FlowID, oFlow.FlowLogID, strFlowStepBtnID, oAssDic, strFlowStepOpinion))
                {
                    labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Succeed, string.Format(WorkRS.Resources.FlowVerifyMsg_FlowVerifySucceed1, oFlow.FlowCaseHtmlInfo)); //2017.05.11 改顯示 FlowCaseHtmlInfo
                }
                else
                {
                    labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, string.Format(WorkRS.Resources.FlowVerifyMsg_FlowVerifyError1, oFlow.FlowCaseHtmlInfo)); //2017.05.11 改顯示 FlowCaseHtmlInfo
                    //2014.11.27 顯示審核錯誤原因
                    DataTable dtError = FlowExpressTraceLog.getFlowExpressErrorLogData(oFlow.FlowID, oFlow.FlowCaseID, oFlow.FlowLogID);
                    if (dtError != null && dtError.Rows.Count > 0)
                    {
                        labFlowVerifyMsg.Text += "<ul>";
                        for (int i = 0; i < dtError.Rows.Count; i++)
                        {
                            labFlowVerifyMsg.Text += string.Format("<li style='color:gray;'>{0}</li>", dtError.Rows[i]["LogDesc"].ToString().Trim());
                        }
                        labFlowVerifyMsg.Text += "</ul>";
                    }
                }
            }
        }
        else
        {
            labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, WorkRS.Resources.FlowVerifyMsg_AssignToNotFound);
        }
    }
Пример #6
0
    /// <summary>
    /// 按下開始審核
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnStartVerify_Click(object sender, EventArgs e)
    {
        //取得 UI 指派對象
        Dictionary <string, string> oAssDic = new Dictionary <string, string>();

        //單選指派
        if (oneVerify.Visible)
        {
            oAssDic.AddRange(Util.getDictionary(oneVerify.ucSelectedDictionary, false));
        }
        //複選指派
        if (muiVerify.Visible)
        {
            oAssDic.AddRange(Util.getDictionary(muiVerify.ucSelectedDictionary, false));
        }
        if (chkVerify.Visible)
        {
            oAssDic.AddRange(Util.getDictionary(chkVerify.ucSelectedDictionary, false));
        }
        //任意指派
        if (anyVerify.Visible && !string.IsNullOrEmpty(anyVerify.ucSelectedUserIDList))
        {
            for (int i = 0; i < anyVerify.ucSelectedUserIDList.Split(',').Count(); i++)
            {
                oAssDic.Add(anyVerify.ucSelectedUserIDList.Split(',')[i], UserInfo.findUserName(anyVerify.ucSelectedUserIDList.Split(',')[i]));
            }
        }
        //全部指派
        if (allVerify.Visible)
        {
            oAssDic.AddRange(Util.getDictionary(Util.getDictionary(allVerify.GetAllItems()), false));
        }

        DivVerifyBtnArea.Visible = false;
        DivVerifyMsgArea.Visible = true;
        labFlowVerifyMsg.Text    = "";

        string strShowPopBtnJS = "";

        strShowPopBtnJS += "var oClose = parent.document.getElementById('ucModalPopup1_btnClose');";
        strShowPopBtnJS += "if (oClose != null){oClose.style.display='';}";
        strShowPopBtnJS += "var oComplete = parent.document.getElementById('ucModalPopup1_btnComplete');";
        strShowPopBtnJS += "if (oComplete != null){oComplete.style.display='';}";
        Util.setJSContent(strShowPopBtnJS);

        //開始判斷
        if (oAssDic.Count <= 0)
        {
            labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, WorkRS.Resources.FlowVerifyMsg_AssignToNotFound);  //缺少指派對象
        }
        else
        {
            //指派對象有值,可進行審核
            Dictionary <string, string> dicPara = Util.getDictionary(Request.QueryString);
            if (dicPara.IsNullOrEmpty())
            {             //缺少流程參數
                Util.setJSContent("alert('" + WorkRS.Resources.FlowFullLogMsg_FlowParaError + "');");
                return;
            }

            Dictionary <string, string> dicBtnContext = _dicBtnContext;  //取出btn參數
            FlowExpress oFlow = new FlowExpress(_dicBtnContext["FlowID"], _dicBtnContext["FlowLogID"], true, false);

            string strFlowStepBtnID = dicBtnContext["FlowStepBtnID"].ToString().Trim();
            string strFlowStepBtnIsAddMultiSubFlow   = dicBtnContext["FlowStepBtnIsAddMultiSubFlow"].ToString().Trim().ToUpper();
            string strFlowStepBtnAddSubFlowID        = dicBtnContext["FlowStepBtnAddSubFlowID"].ToString().Trim();
            string strFlowStepBtnAddSubFlowStepBtnID = dicBtnContext["FlowStepBtnAddSubFlowStepBtnID"].ToString().Trim();
            string strFlowStepOpinion       = dicBtnContext["FlowStepOpinion"].ToString().Trim();
            string strFlowStepOpinionForSQL = strFlowStepOpinion.Replace("'", "''");        //預防 FlowStepOpinion 含有單引號 2017.04.28

            bool IsNeedAddSubFlow    = false;
            bool IsAddSubFlowSucceed = false;

            //檢查是否有按鈕停止條件 2017.05.25 新增
            string[] oStopReasonList;
            string   strStopResonMsg;
            if (FlowExpress.IsFlowStepButtonStop(oFlow, strFlowStepBtnID, out oStopReasonList))
            {
                strStopResonMsg = string.Format(WorkRS.Resources.FlowVerifyMsg_StopVerify1, oFlow.FlowCaseHtmlInfo);
                if (!oStopReasonList.IsNullOrEmpty())
                {
                    string strStopReasonTip = string.Format(" {0} \n", WorkRS.Resources.FlowVerifyMsg_StopReasonTipTitle);
                    for (int i = 0; i < oStopReasonList.Length; i++)
                    {
                        strStopReasonTip += string.Format(" ● {0}\n", oStopReasonList[i]);
                    }
                    strStopResonMsg = string.Format("<span title=\"{0}\">{1}</span>", strStopReasonTip, strStopResonMsg);
                }
                labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, strStopResonMsg);
                return;
            }

            //檢查是否有自訂審核URL
            if (!string.IsNullOrEmpty(oFlow.FlowCurrStepCustVerifyURL))
            {
                if (System.IO.File.Exists(Server.MapPath(oFlow.FlowCurrStepCustVerifyURL)))
                {
                    //==若有自訂審核URL==
                    //設定Session傳遞參數[FlowVerifyInfo]
                    dicBtnContext.TryAdd("FlowStepAssignToList", Util.getJSON(oAssDic));
                    dicBtnContext.TryAdd("FlowStepOpinion", strFlowStepOpinion);
                    dicBtnContext.TryAdd("FlowVerifyJS", strShowPopBtnJS);
                    Session["FlowVerifyInfo"] = dicBtnContext;

                    //因為 Ajax Page 無法使用Server.Transfer,故 CustVerifyURL 改用 Response.Redirect()執行
                    //設定 CustVerifyURL
                    string strVerifyURL = string.Format("{0}?FlowID={1}&FlowLogID={2}", oFlow.FlowCurrStepCustVerifyURL, oFlow.FlowID, oFlow.FlowLogID);
                    for (int i = 0; i < oFlow.FlowKeyFieldList.Count(); i++)
                    {
                        if (oFlow.FlowKeyFieldList[i].ToUpper() != "_AUTONO")
                        {
                            strVerifyURL += string.Format("&{0}={1}", oFlow.FlowKeyFieldList[i], oFlow.FlowKeyValueList[i]);
                        }
                    }
                    Response.Redirect(strVerifyURL);
                }
                else
                {
                    labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, string.Format(RS.Resources.Msg_NotExist1, oFlow.FlowCurrStepCustVerifyURL));
                }
                return;
            }

            //==無自訂審核URL==
            //處理[新增子流程]
            if (!string.IsNullOrEmpty(strFlowStepBtnAddSubFlowID) && !string.IsNullOrEmpty(strFlowStepBtnAddSubFlowStepBtnID))
            {
                //檢查是否自動新增子流程
                FlowExpress oSubFlow = new FlowExpress(strFlowStepBtnAddSubFlowID, null, false, false);
                //該子流程需符合以下條件才能自動新增:
                //01.子流程與父流程名稱不同
                //  子流程的 FlowKeyFieldList 需只比主流程 FlowKeyFieldList 多出 _AutoNo 欄位 
                //  子流程的 FlowShowFieldList 需與主流程的 FlowShowFieldList 相同
                //02.子流程與父流程名稱相同(遞迴)
                //  FlowKeyFieldList 最後一欄需為 _AutoNo 欄位 
                if (oFlow.FlowID != strFlowStepBtnAddSubFlowID)
                {
                    //01.子流程與父流程名稱不同
                    string[] diffList = Util.getCompareList(oFlow.FlowKeyFieldList, oSubFlow.FlowKeyFieldList, Util.ListCompareMode.Diff);
                    if (diffList.Count() == 1 && diffList[0].ToUpper() == "_AUTONO")
                    {
                        if (Util.getCompareList(oFlow.FlowShowFieldList, oSubFlow.FlowShowFieldList, Util.ListCompareMode.Diff).Count() == 0)
                        {
                            IsNeedAddSubFlow = true;
                            if (strFlowStepBtnIsAddMultiSubFlow == "Y")
                            {
                                Dictionary <string, string> oTmpAss = new Dictionary <string, string>();
                                //每個指派對象都產生獨立子流程(只要其中一個子流程新增失敗,就自動中斷)
                                IsAddSubFlowSucceed = true;
                                foreach (var pair in oAssDic)
                                {
                                    oTmpAss.Clear();
                                    oTmpAss.Add(pair.Key, pair.Value);
                                    if (IsAddSubFlowSucceed)
                                    {
                                        if (FlowExpress.IsFlowInsVerify(oSubFlow.FlowID, oFlow.FlowKeyValueList, oFlow.FlowShowValueList, strFlowStepBtnAddSubFlowStepBtnID, oTmpAss, strFlowStepOpinionForSQL, oFlow.FlowID, oFlow.FlowLogID))
                                        {
                                            IsAddSubFlowSucceed    = true;
                                            labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Succeed, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowSucceed);
                                        }
                                        else
                                        {
                                            IsAddSubFlowSucceed    = false;
                                            labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowError);
                                        }
                                    }
                                }
                            }
                            else
                            {
                                //所有指派對象只產生一個子流程
                                if (FlowExpress.IsFlowInsVerify(oSubFlow.FlowID, oFlow.FlowKeyValueList, oFlow.FlowShowValueList, strFlowStepBtnAddSubFlowStepBtnID, oAssDic, strFlowStepOpinionForSQL, oFlow.FlowID, oFlow.FlowLogID))
                                {
                                    IsAddSubFlowSucceed    = true;
                                    labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Succeed, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowSucceed);
                                }
                                else
                                {
                                    IsAddSubFlowSucceed    = false;
                                    labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowError);
                                }
                            }
                        }
                        else
                        {
                            //2017.05.03 強化錯誤訊息
                            IsAddSubFlowSucceed    = false;
                            labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, string.Format(RS.Resources.Msg_ParaError1, "FlowShowFieldList"));
                        }
                    }
                }
                else
                {
                    //02.子流程與父流程名稱相同(遞迴)
                    if (oFlow.FlowKeyFieldList[oFlow.FlowKeyFieldList.Count() - 1].ToUpper() == "_AUTONO")
                    {
                        IsNeedAddSubFlow = true;
                        //組合子流程的 KeyValueList
                        string[] subKeyValueList = new string[oFlow.FlowKeyFieldList.Count() - 1];
                        for (int i = 0; i < subKeyValueList.Count(); i++)
                        {
                            subKeyValueList[i] = oFlow.FlowKeyValueList[i];
                        }

                        if (strFlowStepBtnIsAddMultiSubFlow == "Y")
                        {
                            Dictionary <string, string> oTmpAss = new Dictionary <string, string>();
                            //每個指派對象都產生獨立子流程(只要其中一個子流程新增失敗,就自動中斷)
                            IsAddSubFlowSucceed = true;
                            foreach (var pair in oAssDic)
                            {
                                oTmpAss.Clear();
                                oTmpAss.Add(pair.Key, pair.Value);
                                if (IsAddSubFlowSucceed)
                                {
                                    if (FlowExpress.IsFlowInsVerify(oSubFlow.FlowID, subKeyValueList, oFlow.FlowShowValueList, strFlowStepBtnAddSubFlowStepBtnID, oTmpAss, strFlowStepOpinionForSQL, oFlow.FlowID, oFlow.FlowLogID))
                                    {
                                        IsAddSubFlowSucceed    = true;
                                        labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Succeed, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowSucceed);
                                    }
                                    else
                                    {
                                        IsAddSubFlowSucceed    = false;
                                        labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowError);
                                    }
                                }
                            }
                        }
                        else
                        {
                            //所有指派對象只產生一個子流程
                            if (FlowExpress.IsFlowInsVerify(oSubFlow.FlowID, subKeyValueList, oFlow.FlowShowValueList, strFlowStepBtnAddSubFlowStepBtnID, oAssDic, strFlowStepOpinionForSQL, oFlow.FlowID, oFlow.FlowLogID))
                            {
                                IsAddSubFlowSucceed    = true;
                                labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Succeed, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowSucceed);
                            }
                            else
                            {
                                IsAddSubFlowSucceed    = false;
                                labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, WorkRS.Resources.FlowVerifyMsg_FlowVerifyAddSubFlowError);
                            }
                        }
                    }
                }
            }

            //處理[主流程審核]
            if (IsNeedAddSubFlow)
            {
                if (IsAddSubFlowSucceed)
                {
                    //若[新增子流程]成功
                    //當[FlowStepBtnAssignToList]有值,才執行主流程的[一般審核]  2015.08.26 優化
                    oAssDic.Clear();
                    oAssDic = Util.getDictionary(dicBtnContext["FlowStepBtnAssignToList"].ToString());
                    if (oAssDic != null && oAssDic.Count > 0)
                    {
                        if (FlowExpress.IsFlowVerify(oFlow.FlowID, oFlow.FlowLogID, strFlowStepBtnID, oAssDic, strFlowStepOpinionForSQL))
                        {
                            labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Succeed, string.Format(WorkRS.Resources.FlowVerifyMsg_FlowVerifySucceed1, oFlow.FlowCaseHtmlInfo)); //2017.05.11 改顯示 FlowCaseHtmlInfo
                        }
                        else
                        {
                            labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, string.Format(WorkRS.Resources.FlowVerifyMsg_FlowVerifyError1, oFlow.FlowCaseHtmlInfo)); //2017.05.11 改顯示 FlowCaseHtmlInfo
                            //2014.11.27 顯示審核錯誤原因
                            DataTable dtError = FlowExpressTraceLog.getFlowExpressErrorLogData(oFlow.FlowID, oFlow.FlowCaseID, oFlow.FlowLogID);
                            if (dtError != null && dtError.Rows.Count > 0)
                            {
                                labFlowVerifyMsg.Text += "<ul>";
                                for (int i = 0; i < dtError.Rows.Count; i++)
                                {
                                    labFlowVerifyMsg.Text += string.Format("<li style='color:gray;'>{0}</li>", dtError.Rows[i]["LogDesc"].ToString().Trim());
                                }
                                labFlowVerifyMsg.Text += "</ul>";
                            }
                        }
                    }
                }
            }
            else
            {
                //一般審核
                if (FlowExpress.IsFlowVerify(oFlow.FlowID, oFlow.FlowLogID, strFlowStepBtnID, oAssDic, strFlowStepOpinionForSQL))
                {
                    labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Succeed, string.Format(WorkRS.Resources.FlowVerifyMsg_FlowVerifySucceed1, oFlow.FlowCaseHtmlInfo)); //2017.05.11 改顯示 FlowCaseHtmlInfo
                }
                else
                {
                    labFlowVerifyMsg.Text += Util.getHtmlMessage(Util.HtmlMessageKind.Error, string.Format(WorkRS.Resources.FlowVerifyMsg_FlowVerifyError1, oFlow.FlowCaseHtmlInfo)); //2017.05.11 改顯示 FlowCaseHtmlInfo
                    //2014.11.27 顯示審核錯誤原因
                    DataTable dtError = FlowExpressTraceLog.getFlowExpressErrorLogData(oFlow.FlowID, oFlow.FlowCaseID, oFlow.FlowLogID);
                    if (dtError != null && dtError.Rows.Count > 0)
                    {
                        labFlowVerifyMsg.Text += "<ul>";
                        for (int i = 0; i < dtError.Rows.Count; i++)
                        {
                            labFlowVerifyMsg.Text += string.Format("<li style='color:gray;'>{0}</li>", dtError.Rows[i]["LogDesc"].ToString().Trim());
                        }
                        labFlowVerifyMsg.Text += "</ul>";
                    }
                }
            }
        }
    }