This repo is archived. You can view files and clone it, but cannot push or open issues or pull requests.
SXS20240115/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/modAutoLoader.cs
2024-01-23 14:01:04 +08:00

457 lines
20 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.Diagnostics;
using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Microsoft.VisualBasic;
using Microsoft.VisualBasic.CompilerServices;
using iMESCore.Settings;
using static iMESCore.DataBase.iMESSql;
using static iMESCore.Base.iMESComXML;
namespace AutoLoaderService_Base
{
static class modAutoLoader
{
private static AppSettings objSetting = new AppSettings();
public const int defInteger = -999; // 宣告整數使用的常數用以辨識參數是否有傳入Function中。
public const string defString = "Null"; // 宣告字串使用的常數用以辨識參數是否有傳入Function中。
public static DateTime defDateTime = DateTime.Parse("1900-12-31"); // 宣告日期使用的常數用以辨識參數是否有傳入Function中。
static string GetConnectionString_ConnectionString()
{
var argstrDataBaseType = "Null";
return objSetting.GetConnectionString(strDataBaseType: argstrDataBaseType);
}
public static string ConnectionString = GetConnectionString_ConnectionString();
public static void funProcessJob(object State)
{
SomeStateType strJob = (SomeStateType)State;
string strJobExecutionFile = strJob.strJobExecutionFile; // 來源DLL
string strJobNo = strJob.strJobNo;
string strJobName = strJob.strCommandName;
string strSourcePath = strJob.strSourcePath; // 來源路徑
string strDestinationPath = strJob.strDestinationPath; // 目的路徑
string strQueuePath = strJob.strQueuePath; // Queue
string strFailPath = strJob.strFailPath; // Fail
string strLogFilePath = strJob.strLogFilePath;
long lngSplitFileSize = 10485760L;
long lbgSplitRecordsLimit = 5000L;
string strJobFunction = strJob.strJobFunction;
string strParameter1 = strJob.strParameter1; // 輸入參數1
string strParameter2 = strJob.strParameter2; // 輸入參數2
string strParameter3 = strJob.strParameter3; // 輸入參數3
string strParameter4 = strJob.strParameter4; // 輸入參數4
string strParameter5 = strJob.strParameter5; // 輸入參數5
string strParameter6 = strJob.strParameter6; // 輸入參數5
string strParameter7 = strJob.strParameter7; // 輸入參數5
string strParameter8 = strJob.strParameter8; // 輸入參數5
string strParameter9 = strJob.strParameter9; // 輸入參數5
string strParameter10 = strJob.strParameter10; // 輸入參數5
var StartTime = DateTime.Now;
string strStatus = "Fail"; // 回傳狀況先設定為Fail
string strReturnMsg = string.Empty;
string strMemo = "";
string errorCode = "0000-999999";
// 2019/12/10 yenru, 建立AutoLoader Base 可動態呼叫行業包AutoLoader特定DLL
// Dim objAutoRun As New AutoLoaderLib.clsAutoLoaderLibrary
try
{
var colParameters = new Collection();
colParameters.Add(strJobNo, "JobNo");
colParameters.Add(strSourcePath, "SourcePath");
colParameters.Add(strDestinationPath, "DestinationPath");
colParameters.Add(strQueuePath, "QueuePath");
colParameters.Add(strFailPath, "FailPath");
colParameters.Add(lngSplitFileSize, "SplitFileSize");
colParameters.Add(lbgSplitRecordsLimit, "SplitRecordsLimit");
colParameters.Add(strJobName, "JobName");
colParameters.Add(strJobFunction, "JobFunction");
colParameters.Add(strParameter1, "Parameter1");
colParameters.Add(strParameter2, "Parameter2");
colParameters.Add(strParameter3, "Parameter3");
colParameters.Add(strParameter4, "Parameter4");
colParameters.Add(strParameter5, "Parameter5");
colParameters.Add(strParameter6, "Parameter6");
colParameters.Add(strParameter7, "Parameter7");
colParameters.Add(strParameter8, "Parameter8");
colParameters.Add(strParameter9, "Parameter9");
colParameters.Add(strParameter10, "Parameter10");
// strReturnMsg = objAutoRun.ExecuteFunction(strJobName, colParameters)
string strBasePath = AppDomain.CurrentDomain.BaseDirectory;
string strFilePath = strBasePath + "/" + strJobExecutionFile + ".dll";
// Dll CreateInstance
var mainAssembly = System.Reflection.Assembly.LoadFrom(strFilePath);
var objBRClass = new object();
object objArgs = new object[] { strJobName, colParameters };
objBRClass = mainAssembly.CreateInstance(strJobExecutionFile + ".clsAutoLoaderLibrary");
strReturnMsg = objBRClass.GetType().InvokeMember("ExecuteFunction", System.Reflection.BindingFlags.InvokeMethod, null, objBRClass, (object[])objArgs).ToString();
}
catch (Exception ex)
{
// // Error Message
strReturnMsg = ex.Message;
strMemo = "funProcessJob Error : " + ex.Message;
}
finally
{
// //Return Fail
if (strReturnMsg != "success")
{
modWIN.WriteLog("JobNo:"+ strJobNo + "fail"+ strMemo, iMESLog.iMESLogLevel.Trace);
// 取得ErrorCode
if (strReturnMsg.Substring(0, 10) == "ErrorCode:")
{
strReturnMsg = strReturnMsg.Remove(0, 10); // 移除"ErrorCode:"
string[] temp = Strings.Split(strReturnMsg, ";");
if (temp[0].Length == 11)
{
errorCode = temp[0];
}
}
// Job完成後的後續動作:
// 刪除已經執行完畢之工作 (最先做, 減少執行完畢而未刪的情形)
// 註記最後執行時間
// 增加log
string computerNameTmp = System.Windows.Forms.SystemInformation.ComputerName;
funEndProcessJob(strJobNo, strStatus, CInput(ref strReturnMsg),
CInput(ref computerNameTmp), StartTime, DateTime.Now,
Convert.ToInt32(DateAndTime.DateDiff(DateInterval.Second, StartTime, DateTime.Now)),
strMemo, errorCode, "AutoLoader");
// //發生錯誤將Log記錄下來
// Call objAutoRun.AddErrorLog("MESAutoLoader", "AutoLoader", "JobNo(JobName)", strJobNo & "(" & strJobName & ")", , strReturnMsg, My.Computer.Name)
// //將Error Log存入檔案
// WriteLogFile(strLogFilePath, "[" + Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + "]" + strReturnMsg + Constants.vbCrLf);
}
}
}
/// <summary>
/// 執行Job完成後的後續動作
/// </summary>
private static int funEndProcessJob(string JobNo, string Status = defString, string ReturnMsg = defString, string ServerName = defString, DateTime StartTime = default(DateTime), DateTime EndTime = default(DateTime), int RunTime = defInteger, string Memo = defString, string ErrorCode = "0000-999999", string LogClass = defString)
{
int funEndProcessJobRet = default(int);
// 刪除已經執行完畢之工作 (最先做, 減少執行完畢而未刪的情形)
// 註記最後執行時間
// 增加log
funEndProcessJobRet = -1;
// //Web Service相關變數
var XmlDoc = new System.Xml.XmlDocument();
string InXml, OutXml, strIdentity, strParameter;
try
{
// 將傳入參數組成XML字串
// 定義Identity
string argSendTime = Conversions.ToString(DateTime.Now);
strIdentity = modWIN.CombineXMLIdentity(ref modWIN.gComputerName, ref modWIN.gUserNo, ref argSendTime);
// 定義Parameter
strParameter = string.Empty;
string argvalue_name = "jobno";
string argname = "JobNo";
string argtype = "String";
string argdesc = "";
strParameter = modWIN.CombineXMLParameter(ref argvalue_name, ref argname, ref argtype, ref JobNo, ref argdesc);
if ((Status ?? "") != defString)
{
string argvalue_name1 = "status";
string argname1 = "Status";
string argtype1 = "String";
string argdesc1 = "";
strParameter += modWIN.CombineXMLParameter(ref argvalue_name1, ref argname1, ref argtype1, ref Status, ref argdesc1);
}
if ((ReturnMsg ?? "") != defString)
{
string argvalue_name2 = "returnmsg";
string argname2 = "ReturnMsg";
string argtype2 = "String";
string argdesc2 = "";
strParameter += modWIN.CombineXMLParameter(ref argvalue_name2, ref argname2, ref argtype2, ref ReturnMsg, ref argdesc2);
}
if ((ServerName ?? "") != defString)
{
string argvalue_name3 = "servername";
string argname3 = "ServerName";
string argtype3 = "String";
string argdesc3 = "";
strParameter += modWIN.CombineXMLParameter(ref argvalue_name3, ref argname3, ref argtype3, ref ServerName, ref argdesc3);
}
if (StartTime != defDateTime)
{
string argvalue_name4 = "starttime";
string argname4 = "StartTime";
string argtype4 = "DateTime";
string argvalue = Strings.Format(StartTime, "yyyy/MM/dd HH:mm:ss");
string argdesc4 = "";
strParameter += modWIN.CombineXMLParameter(ref argvalue_name4, ref argname4, ref argtype4, ref argvalue, ref argdesc4);
} // 2016-11-09, Joe, Format日期格式
if (EndTime != defDateTime)
{
string argvalue_name5 = "endtime";
string argname5 = "EndTime";
string argtype5 = "DateTime";
string argvalue1 = Strings.Format(EndTime, "yyyy/MM/dd HH:mm:ss");
string argdesc5 = "";
strParameter += modWIN.CombineXMLParameter(ref argvalue_name5, ref argname5, ref argtype5, ref argvalue1, ref argdesc5);
} // 2016-11-09, Joe, Format日期格式
if (RunTime != defInteger)
{
string argvalue_name6 = "runtime";
string argname6 = "RunTime";
string argtype6 = "Integer";
string argvalue2 = RunTime.ToString();
string argdesc6 = "";
strParameter += modWIN.CombineXMLParameter(ref argvalue_name6, ref argname6, ref argtype6, ref argvalue2, ref argdesc6);
RunTime = Conversions.ToInteger(argvalue2);
}
if ((Memo ?? "") != defString)
{
string argvalue_name7 = "memo";
string argname7 = "Memo";
string argtype7 = "String";
string argdesc7 = "";
strParameter += modWIN.CombineXMLParameter(ref argvalue_name7, ref argname7, ref argtype7, ref Memo, ref argdesc7);
}
if ((LogClass ?? "") != defString)
{
string argvalue_name8 = "logclass";
string argname8 = "LogClass";
string argtype8 = "String";
string argdesc8 = "";
strParameter += modWIN.CombineXMLParameter(ref argvalue_name8, ref argname8, ref argtype8, ref LogClass, ref argdesc8);
}
string argvalue_name9 = "errorcode";
string argname9 = "ErrorCode";
string argtype9 = "String";
string argdesc9 = "";
strParameter += modWIN.CombineXMLParameter(ref argvalue_name9, ref argname9, ref argtype9, ref ErrorCode, ref argdesc9);
// request XML字串
InXml = modWIN.CombineXMLRequest(ref strIdentity, ref strParameter);
OutXml = InvokeSrv("wsAUT.funEndProcessJob_ErrorCode", InXml);
XmlDoc.LoadXml(OutXml);
if (!modWIN.chkExecutionSuccess(ref XmlDoc))
{
throw new Exception(modWIN.GetExceptionSysMsg(ref XmlDoc) + '\r' + modWIN.GetExceptionMesMsg(ref XmlDoc));
}
funEndProcessJobRet = 0;
}
catch (Exception e1)
{
// funWriteTxtFile("funEndProcessJob (JobNo : " & JobNo & ") Error : " & e1.Message)
// funWriteToAnEventLog("funEndProcessJob (JobNo : " & JobNo & ") Error : " & e1.Message, EventLogEntryType.Error, 9000)
}
return funEndProcessJobRet;
}
/// <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>
public static string InvokeSrv(string Method, string InXml, bool Customize = false)
{
object result;
try
{
using (var ws = new AutoLoaderLib_Base.wsInvoke.wsInvoke())
{
ws.Url = modWIN.LocalizeWebService(ws.Url.ToString());
ws.EnableDecompression = true;
result = ws.invokeSrv(Method, new object[] { InXml });
}
}
catch (Exception ex)
{
throw;
}
return Conversions.ToString(result);
}
public static void funInitProcess(object State)
{
string strReturnMsg = string.Empty;
// Dim objAutoRun As New AutoLoaderLib.clsAutoLoaderLibrary
try
{
// //
var colParameters = new Collection();
colParameters.Add(Environment.MachineName, "ComputerName");
}
// //Init Binning
// strReturnMsg = objAutoRun.ExecuteFunction("funInitBinning", colParameters)
catch (Exception ex)
{
// // Error Message
strReturnMsg = ex.Message;
}
finally
{
// // Release Object
// objAutoRun = Nothing
}
}
public class SomeStateType
{
public string strJobExecutionFile;
public string strJobNo;
public string strCommandName;
public string strSourcePath;
public string strDestinationPath;
public string strQueuePath;
public string strFailPath;
public string strLogFilePath;
public long SplitFileSize;
public long SplitRecordsLimit;
public string strJobName;
public string strJobFunction;
public string strParameter1;
public string strParameter2;
public string strParameter3;
public string strParameter4;
public string strParameter5;
public string strParameter6;
public string strParameter7;
public string strParameter8;
public string strParameter9;
public string strParameter10;
public void SomeState(string strJE, string strJN, string strCN, string strSP, string strDP, string strQP, string strFP, string strLF, long lngSplitFileSize, long lngSplitRecordsLimit, string str_JobName, string strJob_Function, string strPara1, string strPara2, string strPara3, string strPara4, string strPara5, string strPara6, string strPara7, string strPara8, string strPara9, string strPara10)
{
strJobExecutionFile = strJE;
strJobNo = strJN;
strCommandName = strCN;
strSourcePath = strSP;
strDestinationPath = strDP;
strQueuePath = strQP;
strFailPath = strFP;
strLogFilePath = strLF;
SplitFileSize = lngSplitFileSize;
SplitRecordsLimit = lngSplitRecordsLimit;
strJobName = str_JobName;
strJobFunction = strJob_Function;
strParameter1 = strPara1;
strParameter2 = strPara2;
strParameter3 = strPara3;
strParameter4 = strPara4;
strParameter5 = strPara5;
strParameter6 = strPara6;
strParameter7 = strPara7;
strParameter8 = strPara8;
strParameter9 = strPara9;
strParameter10 = strPara10;
}
}
public static bool PrevInstance()
{
if (Information.UBound(Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName)) > 0)
{
return true;
}
else
{
return false;
}
}
public static string CInput(ref string strInput)
{
string CInputRet = default(string);
// 將傳入值內的單引號轉換為可存入資料庫的格式
// 2. 將傳入值內的 &, >, < 三個特殊字元轉換為XmlDocument可解譯之代替符號
// 傳入值: strInput包含特殊字元的字串
// 傳回值: 將特殊字元變更為代替符號的字串
// 轉換 ' 為 '' (單引號轉為兩個單引號)
CInputRet = Strings.Replace(strInput, "'", "''");
// 轉換 & 為 &amp;
CInputRet = Strings.Replace(CInputRet, "&", "&amp;");
// CInput = Replace(CInput, """", "''") 'AddFlow的Xml字串不可將雙引號轉為兩個單引號,XMLToFlow會Error
// 轉換 > 為 &gt;
CInputRet = Strings.Replace(CInputRet, ">", "&gt;");
// 轉換 < 為 &lt;
CInputRet = Strings.Replace(CInputRet, "<", "&lt;");
return CInputRet;
}
public static void WriteLogFile(string dir, string WriteTxt)
{
try
{
string path = Path.Combine(dir, Strings.Format(DateTime.Now, "yyyyMMdd").ToString() + ".log");
if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
Directory.CreateDirectory(dir);
using (StreamWriter sw = new StreamWriter(path, true))
{
sw.WriteLine(WriteTxt);
}
}
catch (Exception ex2)
{
}
}
}
}