This repo is archived. You can view files and clone it, but cannot push or open issues or pull requests.
SXS20240115/SRC/MESAgent/MESAutoRun/AutoRunLib/clsAutoRunLibrary.cs

1189 lines
48 KiB
C#
Raw Normal View History

2024-01-15 10:57:41 +08:00
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;
}
/// <summary>
/// 向資料庫取得使用TipTop時的ERP整合設定資訊。
/// </summary>
/// <returns></returns>
/// <remarks></remarks>
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;
}
}
/// <summary>
/// 取得ERP整合的設定資料
/// </summary>
/// <param name="ERPName"></param>
/// <param name="pTable"></param>
/// <returns></returns>
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 = "<host prod=\"" + drERPSetting[0]["MESProductName"].ToString() + "\" ver=\"" + drERPSetting[0]["MESProductVer"].ToString() + "\" ip=\"" + drERPSetting[0]["MESIP"].ToString() + "\" id=\"" + drERPSetting[0]["MESID"].ToString() + "\" acct=\"" + drERPSetting[0]["ERP_USER"].ToString() + "\" lang=\"" + drERPSetting[0]["ERP_LANG"].ToString() + "\" timestamp=\"" + Strings.Format(DateTime.Now, "yyyyMMddHHmmssfff") + "\"/>";
RequestHead += "<service prod=\"" + drERPSetting[0]["CalledProductName"].ToString() + "\" name=\"" + pServiceName + "\" ip=\"" + drERPSetting[0]["CalledIP"].ToString() + "\" id=\"" + drERPSetting[0]["CalledID"].ToString() + "\"/>";
string RequestDataKey = "<datakey><key name=\"EntId\">" + drERPSetting[0]["ERP_ENTID"].ToString() + "</key><key name=\"CompanyId\">" + drERPSetting[0]["ERP_ORG"].ToString() + "</key></datakey>";
string RequestXML_Body = Conversions.ToString((SCI_Object as iMESCIO.SCI.ERP.ERPResponseBase).ParseXml());
pRequestKey = modAutoRunLibrary.GetRequestKey(RequestHead);
string RequestHeader = "<request key=\"" + pRequestKey + "\" type=\"sync\">" + RequestHead + RequestDataKey + "<payload>" + RequestXML_Body + "</payload></request>";
// CDO to XML
CombineRequestXMLbyCDORet = RequestHeader;
}
catch (Exception ex)
{
throw;
}
}
while (false);
return CombineRequestXMLbyCDORet;
}
/// <summary>
/// EAI 檢核編碼(MD5)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
// 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
}
}