using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Data.OracleClient; using System.Data.SqlClient; using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Xml; using iMESCIO.SCI.ERP.Request; using iMESCIO.SCI.ERP.Response; using iMESCIO.SCI.ERP.Request_E10ICD; using iMESCIO.SCI.ERP.Response_E10ICD; using iMESCIO.SCI.Base; using Microsoft.VisualBasic; using Microsoft.VisualBasic.CompilerServices; using iMESCore.Settings; using static iMESCore.DataBase.iMESSql; using static iMESCore.Base.iMESComXML; using static iMESCore.Base.iMESConst; using static iMESCore.Base.iMESComSubroutine; using System.Data.Common; namespace AutoRunLib_C { public class clsAutoRunLibrary { // 2016/06/23 YF, 原呼叫標準各模組的WebService, 改統一呼叫wsInvoke public enum ERPName { TIPTOP = 0, Workflow = 1, T100 = 2, HMI = 3, APS = 4 } private DataTable dtERPSetting = null; private IDbCommand cmmTemp; private string strDataBaseType; // DataBase Type:oracle, mysql, access private string strConnectionString; // Connection string private string strReportDataBaseType; private string strReportConnectionString; // Report DB Connection string private string strMQType; // MessageQueue Type:TIBCO, MQSeries, MSMQ private IDbCommand cmmTempERP; private string strERPconnectionString; private string strERPDataBaseType; private string strERPReportConnectionString; private string strERPCreator = "ERP"; // 取得Config設定之defCreator. private string strDefLanguage; // 取得Config設定之LanguageMode. private string strLanguage_T100; // MES對應ERP T100語系 private AppSettings objSetting = new AppSettings(); private clsDBCom objDBcom = new clsDBCom(); public string strComputerName, strERPUnitNo; public string strAppPath; public string gERPUser; // ERP使用者名稱 public string gERPPassword; // ERP密碼 public string gERPWSURL; // ERP Web服務網址 public string gERPOraganization; // ERP營運中心代碼 public string gERPLanguage; // ERP語系 public string gERPVersion; // ERP版本 // //Web Service相關變數 private XmlDocument XmlDoc = new XmlDocument(); private StringReader tmpStringReader; private string InXml, OutXml, strIdentity, strParameter, XmlData, XmlSchema; private string ExceptionXML; // ===== private string ERP_EntID; private string ERP_Site; private string ERP_URL; private string results; private string strLanguageMode = "zh-cht"; private string strResourceDir = "Resources"; // Dim objkcWIP As New kcWIP.clsOperatorState '宣告Sys的物件 // //Initial Object-------------------------------------------------------------------------------------------------------------------------------- public clsAutoRunLibrary() { // //Get database type strDataBaseType = objSetting.GetDataBaseType(); // //Get connection string strConnectionString = objSetting.GetConnectionString(strDataBaseType); // //Get Message Queue Type strMQType = objSetting.GetMQType(); strReportDataBaseType = objSetting.GetReportDataBaseType(); // //Get connection string strReportConnectionString = objSetting.GetReportConnectionString(strReportDataBaseType); // ERP // //Get ERP database type strERPDataBaseType = objSetting.GetDataBaseType_ERP(); // //Get ERP connection string strERPconnectionString = objSetting.GetConnectionString_ERP(strERPDataBaseType); try { strResourceDir = objSetting["ResourceDir"].ToString(); } catch (Exception) { } try { strLanguageMode = objSetting["LanguageMode"].ToString(); } catch (Exception) { } // T100 整合項目增加, 取得 Web.Config 設定項目, 2015/12/15 Add. try { // 從Web.config取出目前的DatabaseType strERPCreator = System.Configuration.ConfigurationSettings.AppSettings.Get("defCreator"); // 2016-03-09, Joe, 取出預設ERP單位屬性編號 strERPUnitNo = System.Configuration.ConfigurationSettings.AppSettings.Get("defERPUnitNoProperty"); // 2016-03-02, Joe, 取出預設語系並轉換成ERP對應語系,後續T100多語系資料需用到 strDefLanguage = System.Configuration.ConfigurationSettings.AppSettings.Get("LanguageMode"); switch (strDefLanguage.ToUpper() ?? "") { case "ZH-CHS": { strLanguage_T100 = "zh_CN"; break; } case "EN": { strLanguage_T100 = "en_US"; break; } default: { strLanguage_T100 = "zh_TW"; break; } } } catch (Exception ex) { // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 } } // //Property-------------------------------------------------------------------------------------------------------------------------------- public string ConnectionString { get { return strConnectionString; } } public string DataBaseType { get { return strDataBaseType; } } // Public ReadOnly Property ERPConnectionString() // Get // ERPConnectionString = strERPconnectionString // End Get // End Property // Public ReadOnly Property ERPDataBaseType() // Get // ERPDataBaseType = strERPDataBaseType // End Get // End Property public string MQType { get { return strMQType; } } // //Function-------------------------------------------------------------------------------------------------------------------------------- #region 共用的function (不可刪除) // //Public function---------------------------------------------------------------------------------------------------- public string ExecuteFunction(string FunctionName, Collection colParameters = null) { string ExecuteFunctionRet = default(string); // 此 Function 將執行傳入之FunctionName // 傳入值: FunctionName,colParameters // 傳回值: DataSet(成功), nothing(失敗) // colParameters的資料範例如下 // colParameters.Add("C1", "CustomerNo") // colParameters.Add("P1", "ProductNo") int i; try { // 2019/07/26 OwenLiu, Mantis:0060463, AutoRunService 支持行業包共用架構 // -------------------------------------------------------------------------------------------------- // 半導體芯片製造行業包(SEMI_WAFER):S, AutoRunLib_SEMI_WAFER.dll, Job Function固定以 fun_S_ 開頭 // 半導體芯片測試行業包(IC_CP_PKG):P, AutoRunLib_IC_CP_PKG.dll, Job Function固定以 fun_P_ 開頭 // 集成電路封測行業包(IC_FT_PKG):I, AutoRunLib_IC_FT_PKG.dll, Job Function固定以 fun_I_ 開頭 // 分立器件封測行業包(DISCRETE_PKG):D, AutoRunLib_DISCRETE_PKG.dll, Job Function固定以 fun_D_ 開頭 // LED封測行業包(LED_PKG):L, AutoRunLib_LED_PKG.dll, Job Function固定以 fun_L_ 開頭 // 序號組裝行業包(ASM):A, AutoRunLib_ASM.dll, Job Function固定以 fun_A_ 開頭 // -------------------------------------------------------------------------------------------------- // 1.處理 FunctionName 大小寫問題 // 本機執行:將DLL放在執行檔編譯後的位置底下(AutoRunService) string strFilePath = AppDomain.CurrentDomain.BaseDirectory + @"\"; string strLibFileName = ""; string strLibraryName = ""; if (FunctionName.ToUpper().StartsWith("FUN_S_")) // SEMI_WAFER { strLibFileName = "AutoRunLib_SEMI_WAFER.dll"; } else if (FunctionName.ToUpper().StartsWith("FUN_P_")) // IC_CP_PKG { strLibFileName = "AutoRunLib_IC_CP_PKG.dll"; } else if (FunctionName.ToUpper().StartsWith("FUN_I_")) // IC_FT_PKG { strLibFileName = "AutoRunLib_IC_FT_PKG.dll"; } else if (FunctionName.ToUpper().StartsWith("FUN_D_")) // DISCRETE_PKG { strLibFileName = "AutoRunLib_DISCRETE_PKG.dll"; } else if (FunctionName.ToUpper().StartsWith("FUN_L_")) // LED_PKG { strLibFileName = "AutoRunLib_LED_PKG.dll"; } else if (FunctionName.ToUpper().StartsWith("FUN_A_")) // ASM { strLibFileName = "AutoRunLib_ASM.dll"; } else if (FunctionName.ToUpper().StartsWith("FUN_C_")) // 個案 { strLibFileName = "AutoRunLib_C.dll"; } else { strLibFileName = "AutoRunLib.dll"; } strLibraryName = strLibFileName.Substring(0, strLibFileName.LastIndexOf(".dll")) + ".clsAutoRunLibrary"; strFilePath += strLibFileName; var mainAssembly = System.Reflection.Assembly.LoadFrom(strFilePath); System.Reflection.MethodInfo[] MyMethodInfos = mainAssembly.GetType(strLibraryName).GetMethods(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); // 取出Private的Function var loopTo = MyMethodInfos.Length - 1; for (i = 0; i <= loopTo; i++) { if ((MyMethodInfos[i].Name.ToUpper() ?? "") == (FunctionName.ToUpper() ?? "")) { FunctionName = MyMethodInfos[i].Name; break; } } // 2.執行Private Function,傳出DataSet object objArgs = new object[] { colParameters }; string strClassName = "clsAutoRunLibrary"; Type t; System.Reflection.MethodInfo mi; Type[] argumentTypes; System.Reflection.ConstructorInfo ctor; object obj; try { t = mainAssembly.GetType(mainAssembly.GetName().Name + "." + strClassName, true, true); } catch (Exception ex) { throw; } argumentTypes = Type.EmptyTypes; ctor = t.GetConstructor(argumentTypes); obj = ctor.Invoke(new object[] { }); mi = t.GetMethod(FunctionName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); ExecuteFunctionRet = Conversions.ToString(mi.Invoke(obj, (object[])objArgs)); } catch (Exception e1) { // 2016-08-25, Joe, 加.InnerException將exception傳出 if (e1.InnerException == null) { ExecuteFunctionRet = "fail;" + e1.Message; } else { ExecuteFunctionRet = "fail;" + e1.InnerException.Message; } } finally { } return ExecuteFunctionRet; } private string SendMultiEmailNonGroup(ref string EmailSubject, string EmailBody = defString, string EmailAddress = defString, string AttachFileName = defString, byte[] AttachFile = null, string EmailAddressCC = defString) { string SendMultiEmailNonGroupRet = default(string); // 將發Mail給非群組收件者 多人可用 , 隔開 string[] aryAddress, aryAddressCC; string tmpXML = default(string), tmpXMLCC = default(string); aryAddress = Strings.Split(EmailAddress, ","); // 子收件者包幾個child tag foreach (string StrTemp in aryAddress) { string argTagName = "address"; string argValue = CombineXMLValue(argTagName, StrTemp); tmpXML += CombineXMLValueTag(argValue); } if ((EmailAddressCC ?? "") != defString && !string.IsNullOrEmpty(EmailAddressCC)) { aryAddressCC = Strings.Split(EmailAddressCC, ","); foreach (string StrTemp in aryAddressCC) { string argTagName1 = "address"; string argValue1 = CombineXMLValue(argTagName1, StrTemp); tmpXMLCC += CombineXMLValueTag(argValue1); } } try { string argCurUserNo = "AUTORUN"; string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, argCurUserNo, argSendTime); string argvalue_name = "emailaddress"; string argname = "EmailAddress"; string argtype = "String"; string argdesc = ""; strParameter = CombineXMLParameterMultiValue(argvalue_name, argname, argtype, tmpXML, argdesc); string argvalue_name1 = "emailsubject"; string argname1 = "EmailSubject"; string argtype1 = "String"; string argdesc1 = ""; strParameter += CombineXMLParameter(argvalue_name1, argname1, argtype1, EmailSubject, argdesc1); string argvalue_name2 = "emailbody"; string argname2 = "EmailBody"; string argtype2 = "String"; string argvalue = CInput(EmailBody); string argdesc2 = ""; strParameter += CombineXMLParameter(argvalue_name2, argname2, argtype2, argvalue, argdesc2); if (!string.IsNullOrEmpty(tmpXMLCC)) { string argvalue_name3 = "emailaddresscc"; string argname3 = "EmailAddressCC"; string argtype3 = "String"; string argdesc3 = ""; strParameter += CombineXMLParameterMultiValue(argvalue_name3, argname3, argtype3, tmpXMLCC, argdesc3); } if ((AttachFileName ?? "") != defString) { string argvalue_name4 = "attachfilename"; string argname4 = "AttachFileName"; string argtype4 = "String"; string argdesc4 = ""; strParameter += CombineXMLParameter(argvalue_name4, argname4, argtype4, AttachFileName, argdesc4); } var XmlDoc = new XmlDocument(); InXml = CombineXMLRequest(strIdentity, strParameter); if ((AttachFileName ?? "") != defString) { OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.SendMultiEmailAndAttachFile", InXml, AttachFile); } else { OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.SendMultiEmail", InXml); } XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) // 找出Exception訊並顯示出來 { SendMultiEmailNonGroupRet = "success"; } else { // 20220901,13871,0118251: 【度亘】描述性语言报表,排程执行失败,調整錯誤訊息 SendMultiEmailNonGroupRet = "fail;" + GetExceptionMesMsg(XmlDoc) + ";" + GetExceptionSysMsg(XmlDoc); } XmlDoc = null; } catch (Exception ex) { SendMultiEmailNonGroupRet = "fail;" + ex.Message; } return SendMultiEmailNonGroupRet; } private void SendJobFailEmail(Collection colParameters) { // 發送Email前置作業, 可判別群組與非群組寄送 var dsGroup = new DataSet(); var strGroupBasis = default(string); string[] aryEmailAddress; string strEmailAddress, strNonGroup = default(string), strGroup = default(string), strEmailBody, strEmailTitle; // EmailInfo // 取出參數EmailAddress 取不到則不發送 // 2013/10/18, Hank, 修改若無EmailAddress欄位會crash if (colParameters.Contains("EmailAddress") == false || colParameters["EmailAddress"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["EmailAddress"])))) { return; } else { strEmailAddress = Strings.Trim(Conversions.ToString(colParameters["EmailAddress"])); } strEmailTitle = "MES AutoRun-" + Strings.Trim(Conversions.ToString(colParameters["JobNo"])) + " Fail"; strEmailBody = Strings.Trim(Conversions.ToString(colParameters["EmailBody"])); LoadGroupBasis(ref dsGroup); // 切出 有效群組與非群組 aryEmailAddress = Strings.Split(strEmailAddress, ","); for (int i = 0, loopTo = aryEmailAddress.Length - 1; i <= loopTo; i++) { if (System.Text.RegularExpressions.Regex.Matches(aryEmailAddress[i], "@").Count == 1) // Non Group { strNonGroup += Strings.Trim(aryEmailAddress[i]) + ","; } else if (dsGroup.Tables[strGroupBasis].Select("GroupNo ='" + Strings.Trim(aryEmailAddress[i]) + "'").Length > 0) // Group { strGroup += Strings.Trim(aryEmailAddress[i]) + ","; } } // 去掉最後字元為 , if (Strings.Right(strGroup, 1) == ",") strGroup = Strings.Mid(strGroup, 1, Strings.Len(strGroup) - 1); if (Strings.Right(strNonGroup, 1) == ",") strNonGroup = Strings.Mid(strNonGroup, 1, Strings.Len(strNonGroup) - 1); // 群組寄送 if (!string.IsNullOrEmpty(strGroup)) { string argFileName = "N/A"; modAutoRunLibrary.SendMultiEmail(ref argFileName, ref strEmailTitle, strEmailBody, strGroup); } // 非群組寄送 if (!string.IsNullOrEmpty(strNonGroup)) { SendMultiEmailNonGroup(ref strEmailTitle, strEmailBody, strNonGroup); } } private string ChgTranslateName(Collection ColSaveControl, string LanguageMode = "en") { // 目的: // 將 Collection 上所有的 Object 都做語系切換 // 語系檔命名為 MESResource.XX.Resx // zh-CHS(簡體)、zh-CHT(繁體)、en(英文) string strResourceFile; if (string.IsNullOrEmpty(LanguageMode)) { return default(string); } else { strResourceFile = "MESResource." + LanguageMode; } string strResourcePath; strResourcePath = AppDomain.CurrentDomain.BaseDirectory + "Resources"; // 檢查檔案是否存在 if (string.IsNullOrEmpty(FileSystem.Dir(strResourcePath + @"\" + strResourceFile + ".resources"))) // File not exist { return default(string); } var rm = System.Resources.ResourceManager.CreateFileBasedResourceManager(strResourceFile, strResourcePath, null); string TmpString; int i; foreach (var objControl in ColSaveControl) { if (objControl is iMESUltraGrid.iMESUltraGridControl) { TmpString = Conversions.ToString((objControl as iMESUltraGrid.iMESUltraGridControl).Name.Substring(3, (Strings.Len((objControl as iMESUltraGrid.iMESUltraGridControl).Name) - 3))); TmpString = rm.GetString(TmpString.ToUpper()); if (Conversions.ToBoolean(Operators.AndObject(!string.IsNullOrEmpty(TmpString), Operators.ConditionalCompareObjectNotEqual((objControl as iMESUltraGrid.iMESUltraGridControl).iMESUltraGrid.Text, "", false)))) { (objControl as iMESUltraGrid.iMESUltraGridControl).iMESUltraGrid.Text = TmpString; } } else if (objControl is Infragistics.Win.UltraWinGrid.UltraGrid) { int bandCount; int colCount; var loopTo = ((Infragistics.Win.UltraWinGrid.UltraGrid)objControl).DisplayLayout.Bands.Count - 1; for (bandCount = 0; bandCount <= loopTo; bandCount++) { var loopTo1 = ((Infragistics.Win.UltraWinGrid.UltraGrid)objControl).DisplayLayout.Bands[bandCount].Columns.Count - 1; for (colCount = 0; colCount <= loopTo1; colCount++) ((Infragistics.Win.UltraWinGrid.UltraGrid)objControl).DisplayLayout.Bands[bandCount].Columns[colCount].Header.Caption = Conversions.ToString(Interaction.IIf(string.IsNullOrEmpty(rm.GetString(((Infragistics.Win.UltraWinGrid.UltraGrid)objControl).DisplayLayout.Bands[bandCount].Columns[colCount].Key.ToUpper())), ((Infragistics.Win.UltraWinGrid.UltraGrid)objControl).DisplayLayout.Bands[bandCount].Columns[colCount].Header.Caption, rm.GetString(((Infragistics.Win.UltraWinGrid.UltraGrid)objControl).DisplayLayout.Bands[bandCount].Columns[colCount].Key.ToUpper()))); // 20120911, Aaron, Group By Box } ((Infragistics.Win.UltraWinGrid.UltraGrid)objControl).DisplayLayout.GroupByBox.ResetPrompt(); TmpString = ((Infragistics.Win.UltraWinGrid.UltraGrid)objControl).DisplayLayout.GroupByBox.Prompt; TmpString = rm.GetString(TmpString.ToUpper()); if (!string.IsNullOrEmpty(TmpString)) { ((Infragistics.Win.UltraWinGrid.UltraGrid)objControl).DisplayLayout.GroupByBox.Prompt = TmpString; } } TmpString = ""; } return default(string); } public string ChgTranslateName_Content(string ErrorName) { string ChgTranslateName_ContentRet = default(string); // 1.Check LanguageMode string strMsgFile, strGenFile; if (string.IsNullOrEmpty(modWIN.gLanguageMode)) { strMsgFile = "msg_name" + "en"; strGenFile = "mesresource" + "en"; } else { strMsgFile = "msg_name." + modWIN.gLanguageMode; strGenFile = "mesresource." + modWIN.gLanguageMode; } // 2.Get File Path string strResourcePath = AppDomain.CurrentDomain.BaseDirectory + "Resources"; // 檢查檔案是否存在 if (string.IsNullOrEmpty(FileSystem.Dir(strResourcePath + @"\" + strMsgFile + ".resources"))) // File not exist { ChgTranslateName_ContentRet = ErrorName; return ChgTranslateName_ContentRet; } if (string.IsNullOrEmpty(FileSystem.Dir(strResourcePath + @"\" + strGenFile + ".resources"))) // File not exist { ChgTranslateName_ContentRet = ErrorName; return ChgTranslateName_ContentRet; } // 4.Replace原始訊息. string strErrName_Rep = ""; if (Strings.InStr(ErrorName, "[%", CompareMethod.Text) > 0) { // Replace[%%] var rmGen = System.Resources.ResourceManager.CreateFileBasedResourceManager(strGenFile, strResourcePath, null); string strKey, strKeyValue; int intStart, j, k, l; intStart = 1; j = 1; while (j != 0) { j = Strings.InStr(intStart, ErrorName, "[%", CompareMethod.Text); if (j == 0) { strErrName_Rep += Strings.Mid(ErrorName, intStart); } else { k = Strings.InStr(j + 2, ErrorName, "%]", CompareMethod.Text); if (k == 0) { // 找不到對應的結束字元. strErrName_Rep += Strings.Mid(ErrorName, intStart); j = 0; } else { // 檢查是否有不對稱的情況. l = Strings.InStr(j + 2, ErrorName, "[%", CompareMethod.Text); if (l == 0 || l > k) { strErrName_Rep += Strings.Mid(ErrorName, intStart, j - intStart); strKey = Strings.Mid(ErrorName, j + 2, k - j - 2); // 將Key執行語系轉換 try { strKeyValue = rmGen.GetString(strKey.ToUpper()); } catch (Exception ex) { strKeyValue = strKey; } if (string.IsNullOrEmpty(strKeyValue)) { strErrName_Rep += strKey; } else { strErrName_Rep += strKeyValue; } // 下次截取字串的起始位置 intStart = k + 2; } else { // 不對稱,找到最內層的[%%] int m; // 在前面的條件下,一定找得到. m = Strings.InStrRev(ErrorName, "[%", k, CompareMethod.Text); // 擷出不轉換的字串. strErrName_Rep += Strings.Mid(ErrorName, intStart, m - intStart); strKey = Strings.Mid(ErrorName, m + 2, k - m - 2); // 將Key執行語系轉換 try { strKeyValue = rmGen.GetString(strKey.ToUpper()); } catch (Exception ex) { strKeyValue = strKey; } if (string.IsNullOrEmpty(strKeyValue)) { strErrName_Rep += strKey; } else { strErrName_Rep += strKeyValue; } // 下次截取字串的起始位置 intStart = k + 2; } } } } rmGen = null; } // 5.Final Message. string strFinalMsg; // 原始訊息 if (string.IsNullOrEmpty(strErrName_Rep)) { strFinalMsg = ErrorName; } else { strFinalMsg = strErrName_Rep; } ChgTranslateName_ContentRet = strFinalMsg; return ChgTranslateName_ContentRet; } ~clsAutoRunLibrary() { if (objSetting != null) objSetting = null; } /// /// 向資料庫取得使用TipTop時的ERP整合設定資訊。 /// /// /// public void funGetERPSetting(string pERPName) { // Gary Lu 20120614:ERP整合設定統一由此函數取得 StringReader tmpStringReader; // 將字串轉換成可讀入DataSet的物件 string strERPSettingTableName; string InXml, OutXml, strIdentity, strParameter, XmlData, XmlSchema; // 呼叫WS的字串參數 var XmlDoc = new XmlDocument(); try { var dsERPSetting_TP = new DataSet(); // 組InXml string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); string argvalue_name = "erpname"; string argname = "ERPName"; string argtype = "String"; string argdesc = ""; strParameter = CombineXMLParameter(argvalue_name, argname, argtype, pERPName, argdesc); InXml = CombineXMLRequest(strIdentity, strParameter); // 呼叫Web服務執行 OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.LoadERPSetting", InXml); // 解讀Web服務的執行結果 XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { // 讀取取出資料表的名稱 strERPSettingTableName = XmlDoc.GetElementsByTagName("returnvalue").Item(0).SelectNodes("loaderpsetting").Item(0).SelectNodes("name").Item(0).InnerXml; // 取出Schema,dataset讀取Schema可防止Null Field及DateTime的問題 XmlSchema = XmlDoc.DocumentElement.GetElementsByTagName("loaderpsetting").Item(0).SelectNodes("schema").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlSchema)) { // 將XML讀入String Reader object中,因為Dataset讀入XML時必須透過String Reader物件 tmpStringReader = new StringReader(XmlSchema); dsERPSetting_TP.ReadXmlSchema(tmpStringReader); tmpStringReader.Close(); } // 取出Data XmlData = XmlDoc.DocumentElement.GetElementsByTagName("loaderpsetting").Item(0).SelectNodes("value").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlData)) { tmpStringReader = new StringReader(XmlData); dsERPSetting_TP.ReadXml(tmpStringReader, XmlReadMode.InferSchema); tmpStringReader.Close(); } if (dsERPSetting_TP.Tables[strERPSettingTableName].Rows.Count > 0) { gERPUser = dsERPSetting_TP.Tables[strERPSettingTableName].Rows[0]["ERP_USER"].ToString(); gERPPassword = dsERPSetting_TP.Tables[strERPSettingTableName].Rows[0]["ERP_PWD"].ToString(); gERPWSURL = dsERPSetting_TP.Tables[strERPSettingTableName].Rows[0]["ERP_WSURL"].ToString(); gERPOraganization = dsERPSetting_TP.Tables[strERPSettingTableName].Rows[0]["ERP_ORG"].ToString(); gERPLanguage = dsERPSetting_TP.Tables[strERPSettingTableName].Rows[0]["ERP_LANG"].ToString(); gERPVersion = dsERPSetting_TP.Tables[strERPSettingTableName].Rows[0]["ERP_VERSION"].ToString(); } else { throw new Exception("[%ERPWSURL%] not found!"); } } else { throw new Exception("[%ERPWSURL%] not found!"); } } catch (Exception ex) { throw; } } /// /// 取得ERP整合的設定資料 /// /// /// /// private bool GetERPSetting(ref DataTable pTable, string pERPName = defString, int pEAIType = 0) { bool blnResult = false; var XmlDoc = new XmlDocument(); var dsTemp = new DataSet(); try { // 組InXml string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); strParameter = ""; if ((pERPName ?? "") != defString) { string argvalue_name = "erpname"; string argname = "ERPName"; string argtype = "String"; string argdesc = ""; strParameter += CombineXMLParameter(argvalue_name, argname, argtype, pERPName, argdesc); } if (pEAIType != 0) { string argstrAdditional = CombineAddXML_Condition("EAI_Type = " + pEAIType); strParameter += CombineXMLAdditional(argstrAdditional); } InXml = CombineXMLRequest(strIdentity, strParameter); // 呼叫Web服務執行 OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.LoadERPSetting", InXml); // 解讀Web服務的執行結果 XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { XmlSchema = XmlDoc.DocumentElement.GetElementsByTagName("loaderpsetting").Item(0).SelectNodes("schema").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlSchema)) { // 將XML讀入String Reader object中,因為Dataset讀入XML時必須透過String Reader物件 tmpStringReader = new StringReader(XmlSchema); dsTemp.ReadXmlSchema(tmpStringReader); tmpStringReader.Close(); } XmlData = XmlDoc.DocumentElement.GetElementsByTagName("loaderpsetting").Item(0).SelectNodes("value").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlData)) { tmpStringReader = new StringReader(XmlData); dsTemp.ReadXml(tmpStringReader, XmlReadMode.InferSchema); tmpStringReader.Close(); } if (dsTemp.Tables.Count > 0 && dsTemp.Tables[0].Rows.Count > 0) { pTable = dsTemp.Tables[0].Copy(); blnResult = true; } else { throw new Exception("[%GetERPSetting%] not found!"); } dtERPSetting = dsTemp.Tables[0]; var row = dtERPSetting.Rows[0]; ERP_EntID = row["ERP_ENTID"].ToString(); ERP_Site = row["ERP_ORG"].ToString(); ERP_URL = row["ERP_WSURL"].ToString(); } else { throw new Exception("[%GetERPSetting%] not found!"); } } catch (Exception ex) { throw; } finally { XmlDoc = null; dsTemp = null; } return blnResult; } #region ProcessAbout private int[] GetProcessID(string Str_ProcessName) { int[] GetProcessIDRet = default(int[]); int[] IntArray; int i; Process[] allRelationalProcs = Process.GetProcessesByName(Str_ProcessName); i = 0; IntArray = new int[1]; foreach (var thisProcess in allRelationalProcs) { try { Array.Resize(ref IntArray, i + 1); IntArray[i] = thisProcess.Id; i += 1; } catch (Exception ex) { // MessageBox.Show(ex.GetBaseException.ToString, "GetProcessID Error", MessageBoxButtons.OK, MessageBoxIcon.Error) } } GetProcessIDRet = IntArray; return GetProcessIDRet; } private int[] GetNewPID(int[] OldPID, int[] AllPID) { int[] GetNewPIDRet = default(int[]); int i, j, k; int[] IntArray; j = 0; IntArray = new int[1]; var loopTo = Information.UBound(AllPID); for (i = 0; i <= loopTo; i++) { k = Array.IndexOf(OldPID, AllPID[i]); if (k == -1) { Array.Resize(ref IntArray, j + 1); IntArray[j] = AllPID[i]; j += 1; } } GetNewPIDRet = IntArray; return GetNewPIDRet; } private bool KillProcess(int Str_ProcessID) { try { var Process = System.Diagnostics.Process.GetProcessById(Str_ProcessID); if (Conversions.ToBoolean(!Process.CloseMainWindow())) { Process.Kill(); } } catch (Exception ex) { // MessageBox.Show(ex.GetBaseException.ToString, "Close Process Error", MessageBoxButtons.OK, MessageBoxIcon.Error) } return default(Boolean); } #endregion private void LoadGroupBasis(ref DataSet dsGroup) { // 讀取使用者群組主檔 var strGroupBasis = default(string); // 先判斷是否dataset中已有equipmenttype之datatable,若有,需先remove否則會有錯誤 if (!(dsGroup.Tables[strGroupBasis] == null)) { dsGroup.Tables.Remove(strGroupBasis); } // 組InXml的字串 string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); // 加上IssueState要求取出所有資料 string argvalue_name = "issuestate"; string argname = "issuestate"; string argtype = "Integer"; string argvalue = defInteger.ToString(); string argdesc = ""; strParameter = CombineXMLParameter(argvalue_name, argname, argtype, argvalue, argdesc); int modAutoRundefTmp = defInteger; modAutoRundefTmp = Conversions.ToInteger(argvalue); InXml = CombineXMLRequest(strIdentity, strParameter); try { // OutXml = wsUSR.LoadGroupBasis(InXml) OutXml = modAutoRunLibrary.InvokeSrv("wsUSR.LoadGroupBasis", InXml); // 利用XmlDoc物件處理ReturnValue XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { strGroupBasis = XmlDoc.GetElementsByTagName("returnvalue").Item(0).SelectNodes("loadgroupbasis").Item(0).SelectNodes("name").Item(0).InnerXml; // 取出Schema,dataset讀取Schema可防止Null Field及DateTime的問題 XmlSchema = XmlDoc.DocumentElement.GetElementsByTagName("loadgroupbasis").Item(0).SelectNodes("schema").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlSchema)) { // 將XML讀入String Reader object中,因為Dataset讀入XML時必須透過String Reader物件 tmpStringReader = new StringReader(XmlSchema); dsGroup.ReadXmlSchema(tmpStringReader); tmpStringReader.Close(); } // 取出Data XmlData = XmlDoc.DocumentElement.GetElementsByTagName("loadgroupbasis").Item(0).SelectNodes("value").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlData)) { tmpStringReader = new StringReader(XmlData); dsGroup.ReadXml(tmpStringReader); tmpStringReader.Close(); } else { throw new Exception(GetExceptionSysMsg(XmlDoc)); } } } catch (Exception ex) { throw; } } public string CombineRequestXMLbyCDO(ref object SCI_Object, string pService, string pUserNo, string pServiceName, string pCalledID = defString, string pRequestKey = defString) { string CombineRequestXMLbyCDORet = default(string); DataRow[] drERPSetting; string strFilter = ""; do { try { strFilter = "ERP_Name ='" + pService + "' "; if ((pCalledID ?? "") != defString && string.IsNullOrEmpty(pCalledID) == false) strFilter += " And CalledID ='" + pCalledID + "' "; // 取得服務資訊 drERPSetting = dtERPSetting.Select(strFilter); if (drERPSetting == null) break; if (drERPSetting.Length != 1) break; if ((pCalledID ?? "") == defString) { pCalledID = drERPSetting[0]["CalledID"].ToString(); } // 2017-03-17, Joe, 加Parameter for E10 (SCI_Object as iMESCIO.SCI.ERP.ERPRequestBase).enterprise_no = drERPSetting[0]["ERP_ENTID"].ToString(); (SCI_Object as iMESCIO.SCI.ERP.ERPRequestBase).site_no = drERPSetting[0]["ERP_ORG"].ToString(); // 轉XML string RequestHead = ""; RequestHead += ""; string RequestDataKey = "" + drERPSetting[0]["ERP_ENTID"].ToString() + "" + drERPSetting[0]["ERP_ORG"].ToString() + ""; string RequestXML_Body = Conversions.ToString((SCI_Object as iMESCIO.SCI.ERP.ERPResponseBase).ParseXml()); pRequestKey = modAutoRunLibrary.GetRequestKey(RequestHead); string RequestHeader = "" + RequestHead + RequestDataKey + "" + RequestXML_Body + ""; // CDO to XML CombineRequestXMLbyCDORet = RequestHeader; } catch (Exception ex) { throw; } } while (false); return CombineRequestXMLbyCDORet; } /// /// EAI 檢核編碼(MD5) /// /// /// // Private Function GetRequestKey(ByVal input As String) As String // Const ID As String = "28682266" ' 鼎新統編 // Dim key As String = "" // Dim md5Hasher As MD5 = MD5.Create() ' 建立MD5物件 // Try // input += ID // ' 將input轉換成MD5,並且以Bytes傳回,由於ComputeHash只接受Bytes型別參數,所以要先轉型別為Bytes // Dim data As Byte() = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(input)) // ' 建立StringBuilder物件 // Dim sb As New StringBuilder() // ' 將Bytes轉型別為String,並且以16進位存放 // For i As Integer = 0 To data.Length - 1 // sb.Append(data(i).ToString("x2")) // Next i // key = sb.ToString // Catch ex As Exception // Throw // Finally // md5Hasher = Nothing // End Try // Return key // End Function #endregion #region 客製JobName #endregion #region 測試用JobName // Add by Martin 2009/03/03 for testing the Url get by using gMESWebServiceHost and GetAppSettings mathod. // Private Function funTestFuncton(Optional ByVal colParameters As Collection = Nothing) As String // Dim cnnTemp As OleDb.OleDbConnection // Dim drTemp As OleDb.OleDbDataReader // Dim wsSPC As New wsSPC.wsSPC // wsSPC.Url = LocalizeWebService(wsSPC.Url.ToString) // wsSPC.EnableDecompression = True // strIdentity = CombineXMLIdentity("Autorun", "Autorun", Now) // InXml = CombineXMLRequest(strIdentity, strParameter) // Try // '開始執行 // OutXml = wsSPC.LoadOQCForm(InXml) // 'MsgBox(OutXml, , "Test Function Response!") '2012/08/21,Even,由於該msgbox造成錯誤(程式不允許auto 回復為msgbox形式) // funTestFuncton = "success" // Catch e1 As Exception // funTestFuncton = "fail;" & e1.Message // '發生錯誤時丟回本身的Function Name及系統錯誤訊息 // 'Throw New Exception("clsAutoRunLibary.funTestFuncton: " & e1.Message) // '2013/02/05, Hank, Send Email // colParameters.Add(funTestFuncton, "EmailBody") // SendJobFailEmail(colParameters) // Finally // Call objSetting.CloseConnection(cnnTemp) // If Not wsSPC Is Nothing Then wsSPC.Dispose() // End Try // End Function #endregion } }