/// <summary> /// BY PLANT獲取DOA簽核人 /// </summary> /// <param name="sLogonId">申請人</param> /// <param name="sDOA">DOA資訊</param> /// <param name="dtHead">表頭</param> /// <param name="dtDetail">表身</param> /// <returns>DOA簽核人資訊</returns> public Model_DOAHandler GetStepHandler(string applicant, string sDOA, DataTable dtHead, DataTable dtDetail, bool startFormFlag) { Model_DOAHandler oDOAHandler = new Model_DOAHandler(); DataRow dr = dtHead.Rows[0]; oDOAHandler._sDOA = sDOA; oDOAHandler._sApplicant = applicant; oDOAHandler._sPlant = dr["WERKS"].ToString(); oDOAHandler._sDocYear = dr["MJAHR_A"].ToString(); oDOAHandler._sDocNo = dr["MBLNR_A"].ToString(); IDOA oDOA = GetDOA(oDOAHandler._sPlant); if (!startFormFlag) { oDOAHandler = oDOA.GetStepHandler(oDOAHandler, dtHead, dtDetail); } else { oDOAHandler = oDOA.GetStepHandler_StartForm(oDOAHandler, dtHead, dtDetail); } //檢查當前簽核角色是否多簽核人情形 if (oDOAHandler._ParallelFlag == false && oDOAHandler._sHandler.IndexOf(",") > 0) { DBIO.RecordParallelApprovalInfo(oDOAHandler); } return(oDOAHandler); }
/// <summary> ///更新並簽狀態 /// </summary> /// <param name="pDOAHandler"></param> /// <returns></returns> static public bool UpdateParallelApprovalStatus(Model_DOAHandler pDOAHandler) { bool flag = true; if (pDOAHandler._ParallelFlag == true) { sql = "UPDATE TB_GDS_ParallelApproval SET ActualCount=ActualCount+1 WHERE Plant = @Plant AND DocYear=@DocYear AND DocNo = @DocNo AND RoleCode = @RoleCode "; opc.Clear(); opc.Add(DataPara.CreateDataParameter("@Plant", SqlDbType.VarChar, pDOAHandler._sPlant)); opc.Add(DataPara.CreateDataParameter("@DocYear", SqlDbType.VarChar, pDOAHandler._sDocYear)); opc.Add(DataPara.CreateDataParameter("@DocNo", SqlDbType.VarChar, pDOAHandler._sDocNo)); opc.Add(DataPara.CreateDataParameter("@RoleCode", SqlDbType.VarChar, pDOAHandler._sRoleCode)); try { sdb.ExecuteNonQuery(sql, opc); } catch (Exception ex) { flag = false; throw new Exception("# Fail: db access error " + ex.Message); } } return(flag); }
/// <summary> /// 記錄簽核角色為並簽情形 /// </summary> /// <param name="pDOAHandler"></param> /// <returns></returns> static public bool RecordParallelApprovalInfo(Model_DOAHandler pDOAHandler) { bool flag = true; if (pDOAHandler._sEndFlag == "N") { string[] handlerList = pDOAHandler._sHandler.Split(','); if (handlerList.Length > 1) { sql = "INSERT INTO TB_GDS_ParallelApproval (Plant,DocYear,DocNo,RoleCode,TotalCount,ActualCount,UPDATE_TIME) VALUES (@Plant,@DocYear,@DocNo,@RoleCode,@TotalCount,0,getdate()) "; opc.Clear(); opc.Add(DataPara.CreateDataParameter("@Plant", SqlDbType.VarChar, pDOAHandler._sPlant)); opc.Add(DataPara.CreateDataParameter("@DocYear", SqlDbType.VarChar, pDOAHandler._sDocYear)); opc.Add(DataPara.CreateDataParameter("@DocNo", SqlDbType.VarChar, pDOAHandler._sDocNo)); opc.Add(DataPara.CreateDataParameter("@RoleCode", SqlDbType.VarChar, pDOAHandler._sRoleCode)); opc.Add(DataPara.CreateDataParameter("@TotalCount", SqlDbType.Int, handlerList.Length)); try { sdb.ExecuteNonQuery(sql, opc); } catch (Exception ex) { flag = false; throw new Exception("# Fail: db access error " + ex.Message); } } } return(flag); }
/// <summary> /// 重載-檢查是否並簽 /// </summary> /// <param name="caseId"></param> /// <param name="roleName"></param> /// <returns></returns> protected override void ParallelApprovalCheck(Model_DOAHandler DOAHandler, string roleCode) { try { sql = "SELECT * FROM TB_GDS_ParallelApproval with(nolock) WHERE Plant = @Plant AND DocYear=@DocYear AND DocNo = @DocNo AND RoleCode = @RoleCode ORDER BY UPDATE_TIME DESC "; opc.Clear(); opc.Add(DataPara.CreateDataParameter("@RoleCode", SqlDbType.VarChar, roleCode)); opc.Add(DataPara.CreateDataParameter("@Plant", SqlDbType.VarChar, DOAHandler._sPlant)); opc.Add(DataPara.CreateDataParameter("@DocNo", SqlDbType.VarChar, DOAHandler._sDocNo)); opc.Add(DataPara.CreateDataParameter("@DocYear", SqlDbType.VarChar, DOAHandler._sDocYear)); DataTable dt = sdb.GetDataTable(sql, opc); if (dt.Rows.Count > 0) { DataRow dr = dt.Rows[0]; oDOAHandler._ParallelFlag = true; int totalCount = int.Parse(dr["totalCount"].ToString()); int actualcount = int.Parse(dr["actualcount"].ToString()); switch (roleCode) { case "CE01-DEPT01": case "CE01-DEPT02": case "CE01-IPQC01": case "CE01-IQC01": //case "CE01-PC01": //任意一個人簽就跳關 oDOAHandler._FinalFlag = true; break; default: //全部簽就跳關 if (totalCount - 1 > actualcount) { oDOAHandler._FinalFlag = false; } else { oDOAHandler._FinalFlag = true; } break; } } else { oDOAHandler._ParallelFlag = false; oDOAHandler._FinalFlag = false; } } catch (Exception) { throw new Exception(" DB Access fail,pls contact sys administrator"); } }
/// <summary> /// 起單時獲取第一個簽核人獲取DOA簽核人 /// </summary> /// <param name="sLogonId">申請人</param> /// <param name="sDOA">DOA資訊</param> /// <param name="dtHead">單據表頭</param> /// <param name="dtDetail">單據DATA</param> /// <returns></returns> public Model_DOAHandler GetStepHandler_StartForm(Model_DOAHandler pDOAHandler, DataTable dtHead, DataTable dtDetail) { oDOAHandler = pDOAHandler; oDOAHandler._ParallelFlag = false; oDOAHandler._FinalFlag = false; do { StepCheck(dtHead, dtDetail);//CAL FUNCTION 抓取關卡簽核人直至該關卡非跳關狀態 }while (oDOAHandler._sJump == "Y"); return(oDOAHandler); }
/// <summary> /// 記錄追溯LOG /// </summary> /// <param name="log"></param> /// <param name="handleType"></param> public static void RecordTraceLog(string handleType, string status, Model_DOAHandler oDOAHandler) { string log = string.Empty; switch (handleType) { case "A": if (oDOAHandler._sEndFlag == "Y") { log = string.Format("DOA end {0} ", status); } else { log = string.Format("Get Hanlder {0},Role={1},handler={2} ", status, oDOAHandler._sRoleCode, oDOAHandler._sHandler); } break; case "B": if (oDOAHandler._sEndFlag == "Y") { log = string.Format("Update DOA {0}", status); } else { log = string.Format("Update DOA {0},Role={1},handler={2} ", status, oDOAHandler._sRoleCode, oDOAHandler._sHandler); } break; case "C": log = string.Format("Add queue {0} ", status); break; case "D": if (oDOAHandler._sEndFlag == "N") { log = string.Format("Prepare RoutingVariable {0}:spm_Jump DOA({1}) ", status, oDOAHandler._sHandler); } else { log = string.Format("Prepare RoutingVariable {0}:spm_Jump End ", status); } break; case "E": log = string.Format("DOA Jump ,ErrMsg:{0},DOA string:{1}", status, oDOAHandler._sDOA); break; } DBIO.WriteTraceLog(log, oDOAHandler); }
/// <summary> /// write Trace log to database /// </summary> /// <param name="logString">log</param> /// <param name="appName">程序名稱</param> static public void WriteTraceLog(string logString, Model_DOAHandler DOAHandler) { sql = "INSERT INTO TB_GDS_LOG (Application, LogTime, Message,Plant,DocNo,DocYear) VALUES (@APP, @LOGTIME, @MESSAGE, @Plant, @DocNo, @DocYear)"; opc.Clear(); opc.Add(DataPara.CreateDataParameter("@APP", SqlDbType.VarChar, "DOA Trace")); opc.Add(DataPara.CreateDataParameter("@LOGTIME", SqlDbType.DateTime, DateTime.Now)); opc.Add(DataPara.CreateDataParameter("@MESSAGE", SqlDbType.VarChar, logString)); opc.Add(DataPara.CreateDataParameter("@Plant", SqlDbType.VarChar, DOAHandler._sPlant)); opc.Add(DataPara.CreateDataParameter("@DocNo", SqlDbType.VarChar, DOAHandler._sDocNo)); opc.Add(DataPara.CreateDataParameter("@DocYear", SqlDbType.VarChar, DOAHandler._sDocYear)); try { sdb.ExecuteNonQuery(sql, opc); } catch (Exception ex) { throw new Exception("# Fail: db access error " + ex.Message); } }
/// <summary> /// 獲取DOA簽核人 /// </summary> /// <param name="sLogonId">申請人</param> /// <param name="sDOA">DOA資訊</param> /// <param name="dtHead">單據表頭</param> /// <param name="dtDetail">單據DATA</param> /// <returns></returns> public Model_DOAHandler GetStepHandler(Model_DOAHandler pDOAHandler, DataTable dtHead, DataTable dtDetail) { oDOAHandler = pDOAHandler; //獲取當前簽核角色 string currentRole = SPMAppLine.GetCurrentApprover(oDOAHandler._sDOA).Replace("{", "").Replace("}", ""); //並簽檢查 ParallelApprovalCheck(oDOAHandler, currentRole); oDOAHandler._sRoleCode = currentRole; //檢查是否最后一關簽核角色 string nextRole = SPMAppLine.GetNextStep(oDOAHandler._sDOA); if (nextRole != "*") { //當前非最後一關簽核角色 //檢查當前簽核角色是否並簽,是否最後一個並簽人員 if (oDOAHandler._ParallelFlag == true && oDOAHandler._FinalFlag == false) { //並簽,非最後一個人,將關卡打入下一關即END,觸發SPM並簽控制機制 oDOAHandler._sEndFlag = "Y"; //設置更新並簽FLAG為TRUE oDOAHandler._UpdateParallelFlag = true; } else { //非並簽或並簽且為最後一個人 //對DOA XML進行跳關處理 try { oDOAHandler._sDOA = SPMAppLine.GetApproveXML(oDOAHandler._sDOA); } catch (Exception ex) { DBIO.RecordTraceLog("E", ex.Message, oDOAHandler); throw new Exception("Server or network is busy now,pls try again"); } do { //獲取當前簽核角色 currentRole = SPMAppLine.GetCurrentApprover(oDOAHandler._sDOA).Replace("{", "").Replace("}", ""); //並簽檢查 ParallelApprovalCheck(oDOAHandler, currentRole); //CAL FUNCTION 抓取關卡簽核人直至該關卡非跳關狀態 StepCheck(dtHead, dtDetail); //防止最後一個簽核角色為選簽時,前置條件不足陷於死循環 string currentStep = SPMAppLine.GetCurrentStep(oDOAHandler._sDOA); if (currentStep == "*") { oDOAHandler._sJump = "N"; oDOAHandler._sEndFlag = "Y"; } }while (oDOAHandler._sJump == "Y"); } } else { //當前為最後一關簽核角色 //檢查當前簽核角色是否並簽 if (oDOAHandler._ParallelFlag == true) { //並簽,且為最後一個人 if (oDOAHandler._FinalFlag == true) { //對DOA XML進行跳關處理 oDOAHandler._sEndFlag = "Y"; try { oDOAHandler._sDOA = SPMAppLine.GetApproveXML(oDOAHandler._sDOA); } catch (Exception ex) { DBIO.RecordTraceLog("E", ex.Message, oDOAHandler); throw new Exception("Server or network is busy now,pls try again"); } } else { //並簽,非最後一個人,將關卡打入下一關即END,觸發SPM並簽控制機制 oDOAHandler._sEndFlag = "Y"; } //設置更新並簽FLAG為TRUE oDOAHandler._UpdateParallelFlag = true; } else { //非並簽,對DOA XML進行跳關處理 oDOAHandler._sEndFlag = "Y"; try { oDOAHandler._sDOA = SPMAppLine.GetApproveXML(oDOAHandler._sDOA); } catch (Exception ex) { DBIO.RecordTraceLog("E", ex.Message, oDOAHandler); throw new Exception("Server or network is busy now,pls try again"); } } } return(oDOAHandler); }