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/modAutoRunLibrary.cs
2024-01-15 10:57:41 +08:00

712 lines
28 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Resources;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Xml;
using Microsoft.VisualBasic;
using Microsoft.VisualBasic.CompilerServices;
using static iMESCore.Base.iMESComXML;
using static iMESCore.Base.iMESConst;
namespace AutoRunLib_C
{
static class modAutoRunLibrary
{
public enum GroupType
{
UserGroup = 0, // 使用者群組
IssueGroup = 1, // 簽核群組
EquipmentGroup = 2, // 設備工程師群組
InventoryGroup = 3, // 庫房工程師群組
ReportGroup = 4, // 報表使用群組
ERFDispositionGroup = 5, // 異常處理群組
ERFMailccGroup = 6 // 附件收件人群組
}
private static string InXml, OutXml, strIdentity, strParameter, XmlData, XmlSchema;
#region Invoke
/// <summary>
/// 叫用Web Service, 並回傳Response XML
/// </summary>
/// <param name="Method">要呼叫哪一個WebService的方法, ex: wsWIP.LoadLotBasis</param>
/// <param name="InXml">InXml</param>
/// <param name="Customize">是否客製的WebService</param>
/// <returns></returns>
/// <remarks>
/// 2019/08/22 OwenLiu, Mantis:0061402, 修正WS加上CI/CO執行時間紀錄 運作邏輯後AutoRun Servive呼叫WS失敗的問題
/// </remarks>
public static string InvokeSrv(string Method, string InXml, bool Customize = false, int TimeOut = defInteger, bool LogOn = false)
{
object result;
try
{
using (var ws = new wsInvoke.wsInvoke())
{
ws.Url = modWIN.LocalizeWebService(ws.Url.ToString(), Customize);
ws.EnableDecompression = true;
if (TimeOut != defInteger)
{
ws.Timeout = TimeOut;
}
result = ws.invokeSrv(Method, new object[] { InXml, LogOn });
}
}
catch (Exception ex)
{
throw;
}
return Conversions.ToString(result);
}
/// <summary>
/// 叫用Web Service, 回傳Response XML
/// </summary>
/// <param name="Method">要呼叫哪一個WebService的方法, ex: wsWIP.LoadLotBasis</param>
/// <param name="InXml">InXml</param>
/// <param name="buffer">用來取回byte資料或傳入byte資料</param>
/// <param name="Customize">是否客製的WebService</param>
/// <remarks>
/// 2019/08/22 OwenLiu, Mantis:0061402, 修正WS加上CI/CO執行時間紀錄 運作邏輯後AutoRun Servive呼叫WS失敗的問題
/// </remarks>
public static string InvokeSrv(string Method, string InXml, byte[] buffer, bool Customize = false, int TimeOut = defInteger, bool LogOn = false)
{
object result;
try
{
using (var ws = new wsInvoke.wsInvoke())
{
ws.Url = modWIN.LocalizeWebService(ws.Url.ToString(), Customize);
ws.EnableDecompression = true;
if (TimeOut != defInteger)
{
ws.Timeout = TimeOut;
}
result = ws.invokeSrv(Method, new object[] { InXml, buffer, LogOn });
}
}
catch (Exception ex)
{
throw;
}
return Conversions.ToString(result);
}
/// <summary>
/// 叫用Web Service, 並回傳Response XML
/// </summary>
/// <param name="Method">要呼叫哪一個WebService的方法, ex: wsWIP.LoadLotBasis</param>
/// <param name="InXml">InXml</param>
/// <param name="pDataSet">接收結果的DataSet</param>
/// <param name="Customize">是否客製的WebService</param>
/// <returns></returns>
public static string InvokeSrv(string Method, string InXml, ref DataSet pDataSet, bool Customize = false)
{
object result;
try
{
using (var ws = new wsInvoke.wsInvoke())
{
ws.Url = modWIN.LocalizeWebService(ws.Url.ToString(), Customize);
ws.EnableDecompression = true;
result = ws.invokeSrv_DataSet(Method, InXml, ref pDataSet);
}
}
catch (Exception ex)
{
throw;
}
return Conversions.ToString(result);
}
public static string InvokeSrv_GuardServer(bool Customize = false)
{
object result;
try
{
using (var ws = new wsInvoke.wsInvoke())
{
ws.Url = modWIN.LocalizeWebService(ws.Url.ToString(), Customize);
ws.EnableDecompression = true;
result = ws.Invoke_GuardServer_Process();
}
}
catch (Exception ex)
{
throw;
}
return Conversions.ToString(result);
}
#endregion
/// <summary>
/// EAI 檢核編碼(MD5)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string GetRequestKey(string input)
{
const string ID = "28682266"; // 鼎新統編
string key = "";
var md5Hasher = MD5.Create(); // 建立MD5物件
try
{
input += ID;
// 將input轉換成MD5並且以Bytes傳回由於ComputeHash只接受Bytes型別參數所以要先轉型別為Bytes
byte[] data = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(input));
// 建立StringBuilder物件
var sb = new StringBuilder();
// 將Bytes轉型別為String並且以16進位存放
for (int i = 0, loopTo = data.Length - 1; i <= loopTo; i++)
sb.Append(data[i].ToString("x2"));
key = sb.ToString();
}
catch (Exception ex)
{
throw;
}
finally
{
md5Hasher = null;
}
return key;
}
/// <summary>
/// 紀錄Transaction
/// </summary>
/// <param name="InXml"></param>
/// <param name="OutXml"></param>
/// <param name="ModuleID"></param>
/// <param name="FunctionID"></param>
/// <param name="Result"></param>
/// <param name="KeyValue"></param>
/// <returns></returns>
/// <remarks></remarks>
public static bool addTransactionLog(string InXml, string OutXml, string TransactionID, string ModuleID, string FunctionID, string ComputerName, string CurUserNo, string SendTime, string Result, string KeyValue, string ExceptionFun, string strException = null)
{
bool addTransactionLogRet = default(bool);
try
{
using (var wsERP = new wsERP_MES.wsMES())
{
wsERP.Url = modWIN.LocalizeWebService_ERP(wsERP.Url.ToString());
wsERP.EnableDecompression = true;
if (wsERP.addTransactionLog(InXml, OutXml, TransactionID, ModuleID, FunctionID, ComputerName, CurUserNo, SendTime, Result, KeyValue, ExceptionFun, ref strException) == true)
{
addTransactionLogRet = true;
}
else
{
addTransactionLogRet = false;
}
}
}
catch (Exception ex)
{
addTransactionLogRet = false;
}
return addTransactionLogRet;
}
/// <summary>
/// 紀錄Transaction
/// </summary>
public static bool addTransactionLog_ErrorCode(string InXml, string OutXml, string TransactionID, string ModuleID, string FunctionID, string ComputerName, string CurUserNo, string SendTime, string Result, string KeyValue, string ExceptionFun, string strException = null, string ErrorCode = "0000-999999", string LogClass = null)
{
bool addTransactionLog_ErrorCodeRet = default(bool);
try
{
using (var wsERP = new wsERP_MES.wsMES())
{
wsERP.Url = modWIN.LocalizeWebService_ERP(wsERP.Url.ToString());
wsERP.EnableDecompression = true;
if (wsERP.addTransactionLog_ErrorCode(InXml, OutXml, TransactionID, ModuleID, FunctionID, ComputerName, CurUserNo, SendTime, Result, KeyValue, ExceptionFun, ref strException, ErrorCode, LogClass) == true)
{
addTransactionLog_ErrorCodeRet = true;
}
else
{
addTransactionLog_ErrorCodeRet = false;
}
}
}
catch (Exception ex)
{
addTransactionLog_ErrorCodeRet = false;
}
return addTransactionLog_ErrorCodeRet;
}
// =====Elvis ,0091128: [605][CP+FT] E10ICD整合問題_AutoRun主檔拋轉的ERP交易紀錄exception時紀錄不正確
#region --- Combine (Exception, Message) ---
public static bool ChgTranslateException(ref List<ArrayList> Exception, ref string strExceptionSysmsg, ref string strExceptionMesmsg, ref string strExceptionStack)
{
bool ChgTranslateExceptionRet = default(bool);
try
{
foreach (ArrayList al in Exception)
{
// If strExceptionSysmsg <> String.Empty Then strExceptionSysmsg += Chr(10)
if (string.IsNullOrEmpty(Conversions.ToString(al[1])) == false)
strExceptionSysmsg += al[1].ToString();
// If String.IsNullOrEmpty(strExceptionMesmsg) = False Then strExceptionMesmsg += Chr(10)
if (string.IsNullOrEmpty(Conversions.ToString(al[2])) == false)
{
// 翻譯錯誤訊息
string strErrName_Rep = "";
string ErrorName = al[2].ToString();
if (Strings.InStr(ErrorName, "[%", CompareMethod.Text) > 0)
{
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 = "";
}
// strKeyValue = Resources.Resource.ResourceManager.GetString(strKey)
catch (Exception ex)
{
strKeyValue = strKey;
}
if (string.IsNullOrEmpty(strKeyValue))
{
strErrName_Rep += strKey;
}
else
{
strErrName_Rep += strKeyValue;
} // & "(" & strKey & ")"
// 下次截取字串的起始位置
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 = "";
}
// strKeyValue = Resources.Resource.ResourceManager.GetString(strKey)
catch (Exception ex)
{
strKeyValue = strKey;
}
if (string.IsNullOrEmpty(strKeyValue))
{
strErrName_Rep += strKey;
}
else
{
strErrName_Rep += strKeyValue;
} // & "(" & strKey & ")"
// 下次截取字串的起始位置
intStart = k + 2;
}
}
}
}
}
// strExceptionMesmsg += Chr(9) & Chr(9) & Chr(9) & Resources.Resource.ResourceManager.GetString(al.Item(2).ToString) & "(" & al.Item(2).ToString & ")"
strExceptionMesmsg += strErrName_Rep;
}
// If strExceptionStack <> String.Empty Then strExceptionStack += Chr(10)
if (string.IsNullOrEmpty(Conversions.ToString(al[3])) == false)
strExceptionStack += al[3].ToString();
}
ChgTranslateExceptionRet = true;
}
catch (Exception e1)
{
throw;
ChgTranslateExceptionRet = false;
}
return ChgTranslateExceptionRet;
}
public static string CombineXMLResponse(string Identity, string ReturnValue = null, List<ArrayList> Exception = null, string Result = null, List<ArrayList> Message = null)
{
string CombineXMLResponseRet = default(string);
try
{
// <response>
CombineXMLResponseRet = "<response>";
// <identity>
if (string.IsNullOrEmpty(Identity))
{
CombineXMLResponseRet += "<identity></identity>";
}
else
{
CombineXMLResponseRet += "<identity>";
CombineXMLResponseRet += Identity;
CombineXMLResponseRet += "</identity>";
}
// <returnvalue>
if (string.IsNullOrEmpty(ReturnValue))
{
CombineXMLResponseRet += "<returnvalue></returnvalue>";
}
else
{
CombineXMLResponseRet += "<returnvalue>";
CombineXMLResponseRet += ReturnValue;
CombineXMLResponseRet += "</returnvalue>";
}
// <result>
if (string.IsNullOrEmpty(Result))
{
CombineXMLResponseRet += "<result></result>";
}
else
{
CombineXMLResponseRet += "<result>" + Result + "</result>";
}
// <exception>
string strExceptionSysmsg = string.Empty;
string strExceptionMesmsg = string.Empty;
string strExceptionStack = string.Empty;
if (Exception.Count == 0)
{
CombineXMLResponseRet += "<exception></exception>";
}
else
{
// 2016-12-01, Joe, Exception轉語系
ChgTranslateException(ref Exception, ref strExceptionSysmsg, ref strExceptionMesmsg, ref strExceptionStack);
CombineXMLResponseRet += "<exception>";
CombineXMLResponseRet += "<code></code>";
if (string.IsNullOrEmpty(strExceptionSysmsg) == true)
{
CombineXMLResponseRet += "<sysmsg></sysmsg>";
}
else
{
CombineXMLResponseRet += "<sysmsg>" + strExceptionSysmsg + '\n' + "</sysmsg>" + '\n';
}
if (string.IsNullOrEmpty(strExceptionMesmsg) == true)
{
CombineXMLResponseRet += "<mesmsg>" + strExceptionMesmsg + "</mesmsg>" + '\n';
}
else
{
CombineXMLResponseRet += "<mesmsg>" + strExceptionMesmsg + "</mesmsg>" + '\n';
}
if (string.IsNullOrEmpty(strExceptionStack))
{
CombineXMLResponseRet += "<stack></stack>";
}
else
{
// CombineXMLResponse += Chr(9) & Chr(9) & "<stack>" & Chr(10) & strExceptionStack & Chr(10) & Chr(9) & Chr(9) & "</stack>" & Chr(10)
CombineXMLResponseRet += "<stack></stack>";
}
CombineXMLResponseRet += '\t' + "</exception>" + '\n';
}
// <message>
string strMmsg = string.Empty;
if (Message.Count == 0)
{
CombineXMLResponseRet += '\t' + "<message></message>" + '\n';
}
else
{
CombineXMLResponseRet += '\t' + "<message>" + '\n';
// 2016-12-01, Joe, Message轉語系
// Call ChgTranslateMessage(Message, strMmsg)
CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "<mcode></mcode>" + '\n';
CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "<mtype></mtype>" + '\n';
CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "<mmsg>" + strMmsg + "</mmsg>" + '\n';
CombineXMLResponseRet += '\t' + "</message>" + '\n';
}
CombineXMLResponseRet += "</response>" + '\n';
}
catch (Exception e1)
{
// 發生錯誤時丟回本身的Function Name及系統錯誤訊息
// Throw 'New Exception("modWS.CombineXMLResponse: " & e1.Message)
CombineXMLResponseRet = "<response>" + '\n';
CombineXMLResponseRet += '\t' + "<identity></identity>" + '\n';
CombineXMLResponseRet += '\t' + "<exception>" + '\n';
CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "<code></code>" + '\n';
CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "<sysmsg>" + '\n';
CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + '\t' + e1.Message + '\n';
CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "</sysmsg>" + '\n';
CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "<mesmsg>" + '\n';
CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + '\t' + "CombineXMLResponse;Fail" + '\n';
CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "</mesmsg>" + '\n';
CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "<stack>" + '\n';
CombineXMLResponseRet += e1.StackTrace + '\n';
CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "</stack>" + '\n';
CombineXMLResponseRet += '\t' + "</exception>" + '\n';
CombineXMLResponseRet += '\t' + "<message></message>" + '\n';
CombineXMLResponseRet += "</response>";
}
return CombineXMLResponseRet;
}
public static bool combineException(ref List<ArrayList> arrException, string code = null, string sysmsg = null, string mesmsg = null, string stack = null)
{
bool result = false;
try
{
var al = new ArrayList();
al.Add(code);
al.Add(sysmsg);
al.Add(mesmsg);
al.Add(stack);
arrException.Add(al);
result = true;
}
catch (Exception ex)
{
result = false;
}
return default(Boolean);
}
// Public Function combineMessage(
// ByRef strMessage As List(Of ArrayList),
// Optional ByVal mcode As String = Nothing,
// Optional ByVal mtype As String = Nothing,
// Optional ByVal mmsg As String = Nothing
// ) As Boolean
// Dim result As Boolean = False
// Try
// Dim al As New ArrayList
// al.Add(mcode)
// al.Add(mtype)
// al.Add(mmsg)
// strMessage.Add(al)
// result = True
// Catch ex As Exception
// result = False
// End Try
// End Function
#endregion
// =====
// 發Mail功能 非群組與群組發送
public static string SendMultiEmail(ref string FileName, ref string EmailSubject, string EmailBody = defString, string GroupNo = defString, byte[] AttachFile = null, GroupType GroupType = GroupType.UserGroup)
{
string SendMultiEmailRet = default(string);
// GroupType
// 0:User Group (使用者群組)
// 1:Issue Group (簽核群組)
// 2:Equipment Group(設備工程師群組)
// 3:Inventory Group(庫房工程師群組)
// 4:Report Group(報表使用群組)
// 5:ERF Disposition Group(異常處理群組)
// 6:ERF Mail ccGroup(附件收件人群組)
try
{
strIdentity = CombineXMLIdentity(modWIN.gComputerName, "AUTORUN", DateTime.Now.ToString());
strParameter = CombineXMLParameter("groupno", "GroupNo", "String", CInput(GroupNo), "");
strParameter = strParameter + CombineXMLParameter("emailsubject", "EmailSubject", "String", EmailSubject, "");
strParameter = strParameter + CombineXMLParameter("emailbody", "EmailBody", "String", EmailBody, "");
strParameter = strParameter + CombineXMLParameter("grouptype", "GroupType", "Integer", GroupType.ToString(), "");
strParameter = strParameter + CombineXMLParameter("attachfilename", "AttachFileName", "String", FileName, "");
var XmlDoc = new XmlDocument();
InXml = CombineXMLRequest(strIdentity, strParameter);
// OutXml = wsWIP.SendEmailAndAttachFileToGroup(InXml, AttachFile)
OutXml = InvokeSrv("wsWIP.SendEmailAndAttachFileToGroup", InXml, AttachFile);
XmlDoc.LoadXml(OutXml);
if (chkExecutionSuccess(XmlDoc)) // 找出Exception訊並顯示出來
{
SendMultiEmailRet = "success";
}
else
{
SendMultiEmailRet = "fail";
}
XmlDoc = null;
}
catch (Exception ex)
{
SendMultiEmailRet = "fail;" + ex.Message;
}
return SendMultiEmailRet;
}
#region --- ---
public static bool funChkNumericIsValid(string pSourceText, bool AllowFloat = true, bool AllowContainsDot = true, bool AllowZeroValue = true, bool AllowMinus = true)
{
bool blnExecResult = false;
decimal decInputValue = 0m;
try
{
if (!Information.IsNumeric(pSourceText))
{
blnExecResult = false;
return blnExecResult;
}
decInputValue = Convert.ToDecimal(pSourceText);
if (!AllowMinus && decInputValue < 0m)
{
blnExecResult = false;
return blnExecResult;
}
if (!AllowZeroValue && decInputValue == 0m)
{
blnExecResult = false;
return blnExecResult;
}
if (!AllowFloat)
{
if (decInputValue % 1m > 0m)
{
blnExecResult = false;
return blnExecResult;
}
}
if (!AllowContainsDot && !pSourceText.IndexOf(".").Equals(-1))
{
blnExecResult = false;
return blnExecResult;
}
blnExecResult = true;
}
catch (Exception ex)
{
throw;
}
return blnExecResult;
}
#endregion
}
}