From cecb662375a2a413ccc36fb9f8cb5943b46ca9a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=83=AD=5Cxg?= <18321862510@139.com> Date: Fri, 31 Jul 2026 15:42:16 +0800 Subject: [PATCH] 1 --- MESEAI/.vs/MESEAI/v16/.suo | Bin 0 -> 80384 bytes MESEAI/EAICws/EAICws/EAIws_C.csproj | 186 + MESEAI/EAICws/EAICws/EAIws_C.csproj.user | 6 + .../EAICws/My Project/Application.Designer.cs | 11 + .../EAICws/My Project/Application.myapp | 10 + .../EAICws/EAICws/My Project/AssemblyInfo.cs | 35 + .../EAICws/EAICws/My Project/Resources.resx | 117 + .../EAICws/My Project/Settings.Designer.cs | 88 + .../EAICws/My Project/Settings.settings | 7 + MESEAI/EAICws/EAICws/modEAP.cs | 1221 ++ MESEAI/EAICws/EAICws/modERP.cs | 4495 ++++++ MESEAI/EAICws/EAICws/modERPIntegrate.cs | 16 + MESEAI/EAICws/EAICws/modKMI.cs | 37 + MESEAI/EAICws/EAICws/modWS.cs | 1494 ++ ...ework,Version=v4.6.2.AssemblyAttributes.cs | 4 + ...gnTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 7257 bytes .../EAIws_C.csproj.AssemblyReference.cache | Bin 0 -> 4613 bytes MESEAI/EAICws/EAICws/packages.config | 4 + MESEAI/EAItc/EAItc_C.csproj | 275 + MESEAI/EAItc/EAItc_C.csproj.user | 6 + .../EAItc/My Project/Application.Designer.cs | 11 + MESEAI/EAItc/My Project/Application.myapp | 10 + MESEAI/EAItc/My Project/AssemblyInfo.cs | 35 + MESEAI/EAItc/My Project/Resources.resx | 117 + MESEAI/EAItc/My Project/Settings.Designer.cs | 88 + MESEAI/EAItc/My Project/Settings.settings | 7 + MESEAI/EAItc/clsCom.cs | 340 + MESEAI/EAItc/clsEAP.cs | 12080 ++++++++++++++++ MESEAI/EAItc/clsERP.cs | 4172 ++++++ MESEAI/EAItc/clsMDS.cs | 25 + MESEAI/EAItc/clsOE.cs | 2987 ++++ MESEAI/EAItc/clsSPC.cs | 62 + ...ework,Version=v4.6.2.AssemblyAttributes.cs | 4 + ...gnTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 6879 bytes .../EAItc_C.csproj.AssemblyReference.cache | Bin 0 -> 5925 bytes MESEAI/MESEAI.sln | 194 + .../BouncyCastle.1.8.9/.signature.p7s | Bin 0 -> 9494 bytes .../BouncyCastle.1.8.9.nupkg | Bin 0 -> 902592 bytes MESEAI/packages/BouncyCastle.1.8.9/README.md | 30 + 39 files changed, 28174 insertions(+) create mode 100644 MESEAI/.vs/MESEAI/v16/.suo create mode 100644 MESEAI/EAICws/EAICws/EAIws_C.csproj create mode 100644 MESEAI/EAICws/EAICws/EAIws_C.csproj.user create mode 100644 MESEAI/EAICws/EAICws/My Project/Application.Designer.cs create mode 100644 MESEAI/EAICws/EAICws/My Project/Application.myapp create mode 100644 MESEAI/EAICws/EAICws/My Project/AssemblyInfo.cs create mode 100644 MESEAI/EAICws/EAICws/My Project/Resources.resx create mode 100644 MESEAI/EAICws/EAICws/My Project/Settings.Designer.cs create mode 100644 MESEAI/EAICws/EAICws/My Project/Settings.settings create mode 100644 MESEAI/EAICws/EAICws/modEAP.cs create mode 100644 MESEAI/EAICws/EAICws/modERP.cs create mode 100644 MESEAI/EAICws/EAICws/modERPIntegrate.cs create mode 100644 MESEAI/EAICws/EAICws/modKMI.cs create mode 100644 MESEAI/EAICws/EAICws/modWS.cs create mode 100644 MESEAI/EAICws/EAICws/obj/Debug/.NETFramework,Version=v4.6.2.AssemblyAttributes.cs create mode 100644 MESEAI/EAICws/EAICws/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache create mode 100644 MESEAI/EAICws/EAICws/obj/Debug/EAIws_C.csproj.AssemblyReference.cache create mode 100644 MESEAI/EAICws/EAICws/packages.config create mode 100644 MESEAI/EAItc/EAItc_C.csproj create mode 100644 MESEAI/EAItc/EAItc_C.csproj.user create mode 100644 MESEAI/EAItc/My Project/Application.Designer.cs create mode 100644 MESEAI/EAItc/My Project/Application.myapp create mode 100644 MESEAI/EAItc/My Project/AssemblyInfo.cs create mode 100644 MESEAI/EAItc/My Project/Resources.resx create mode 100644 MESEAI/EAItc/My Project/Settings.Designer.cs create mode 100644 MESEAI/EAItc/My Project/Settings.settings create mode 100644 MESEAI/EAItc/clsCom.cs create mode 100644 MESEAI/EAItc/clsEAP.cs create mode 100644 MESEAI/EAItc/clsERP.cs create mode 100644 MESEAI/EAItc/clsMDS.cs create mode 100644 MESEAI/EAItc/clsOE.cs create mode 100644 MESEAI/EAItc/clsSPC.cs create mode 100644 MESEAI/EAItc/obj/Debug/.NETFramework,Version=v4.6.2.AssemblyAttributes.cs create mode 100644 MESEAI/EAItc/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache create mode 100644 MESEAI/EAItc/obj/Debug/EAItc_C.csproj.AssemblyReference.cache create mode 100644 MESEAI/MESEAI.sln create mode 100644 MESEAI/packages/BouncyCastle.1.8.9/.signature.p7s create mode 100644 MESEAI/packages/BouncyCastle.1.8.9/BouncyCastle.1.8.9.nupkg create mode 100644 MESEAI/packages/BouncyCastle.1.8.9/README.md diff --git a/MESEAI/.vs/MESEAI/v16/.suo b/MESEAI/.vs/MESEAI/v16/.suo new file mode 100644 index 0000000000000000000000000000000000000000..590b7dc8e1411ba646c742c703e9bfe650498019 GIT binary patch literal 80384 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 U1zPd!ELo^p-0ttPjaBddA4i^I+yDRo literal 0 HcmV?d00001 diff --git a/MESEAI/EAICws/EAICws/EAIws_C.csproj b/MESEAI/EAICws/EAICws/EAIws_C.csproj new file mode 100644 index 0000000..e1fa295 --- /dev/null +++ b/MESEAI/EAICws/EAICws/EAIws_C.csproj @@ -0,0 +1,186 @@ + + + + + Debug + AnyCPU + {74B7676A-6420-0784-301F-696024D2A8D7} + Library + EAIws_C + EAIws_C + 512 + Windows + v4.6.2 + SAK + SAK + SAK + SAK + + $(DefaultItemExcludes);$(ProjectDir)**\*.vb + + + true + full + true + true + ..\..\..\MES_S_DLL\ + ..\..\..\MES_S_DLL\EAIws_C.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + false + + + pdbonly + false + true + true + bin\Release\ + bin\Release\EAIws_C.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + false + + + On + + + Binary + + + Off + + + On + + + + False + ..\..\..\MES_S_DLL\Apache.NMS.dll + False + + + False + ..\..\..\MES_S_DLL\Apache.NMS.ActiveMQ.dll + False + + + ..\..\..\..\..\..\项目环境\SHLQ_C20260316\DefaultSite\MESws_API\bin\API_Base.dll + + + False + ..\..\..\MES_S_DLL\BouncyCastle.Crypto.dll + + + False + ..\..\..\MES_S_DLL\EAIws.dll + + + False + ..\..\..\MES_S_DLL\EAIws_C.dll + + + False + ..\..\..\MES_S_DLL\iMESAppSetting.dll + False + + + False + ..\..\..\MES_S_DLL\iMESCIOC.dll + + + False + ..\..\..\MES_S_DLL\iMESConst.dll + False + + + False + ..\..\..\..\..\环境\MESws_EAI\bin\kcMTL.dll + + + False + ..\..\..\..\..\环境\MESws_EAI\bin\kcOE.dll + + + False + ..\..\..\..\..\环境\MESws_EAI\bin\kcPRD.dll + + + + False + ..\..\..\MES_S_DLL\iMESCIO.dll + False + + + False + ..\..\..\MES_S_DLL\iMESException.dll + + + False + ..\..\..\MES_S_DLL\Newtonsoft.Json.dll + False + + + + + + + + + + + + + False + ..\..\..\MES_S_DLL\tcEAI.dll + + + False + ..\..\..\MES_S_DLL\tcEAI_C.dll + + + + + + + + + + + + + + + + + + + + + True + Application.myapp + + + True + Settings.settings + True + + + + + MyApplicationCodeGenerator + Application.Designer.cs + + + SettingsSingleFileGenerator + EAIws_C.My + Settings.Designer.cs + + + + + + \ No newline at end of file diff --git a/MESEAI/EAICws/EAICws/EAIws_C.csproj.user b/MESEAI/EAICws/EAICws/EAIws_C.csproj.user new file mode 100644 index 0000000..23e78fe --- /dev/null +++ b/MESEAI/EAICws/EAICws/EAIws_C.csproj.user @@ -0,0 +1,6 @@ + + + + D:\iMES\LQ\环境\DefaultSite\MESws_API\bin\ + + \ No newline at end of file diff --git a/MESEAI/EAICws/EAICws/My Project/Application.Designer.cs b/MESEAI/EAICws/EAICws/My Project/Application.Designer.cs new file mode 100644 index 0000000..299bbe3 --- /dev/null +++ b/MESEAI/EAICws/EAICws/My Project/Application.Designer.cs @@ -0,0 +1,11 @@ +// ------------------------------------------------------------------------------ +// +// 這段程式碼是由工具產生的。 +// 執行階段版本:4.0.30319.42000 +// +// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼, +// 變更將會遺失。 +// +// ------------------------------------------------------------------------------ + + diff --git a/MESEAI/EAICws/EAICws/My Project/Application.myapp b/MESEAI/EAICws/EAICws/My Project/Application.myapp new file mode 100644 index 0000000..758895d --- /dev/null +++ b/MESEAI/EAICws/EAICws/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 1 + true + diff --git a/MESEAI/EAICws/EAICws/My Project/AssemblyInfo.cs b/MESEAI/EAICws/EAICws/My Project/AssemblyInfo.cs new file mode 100644 index 0000000..eca4b74 --- /dev/null +++ b/MESEAI/EAICws/EAICws/My Project/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System; +using System.Reflection; +using System.Runtime.InteropServices; + +// 組件的一般資訊是由下列的屬性集控制。 +// 變更這些屬性的值即可修改組件的相關 +// 資訊。 + +// 檢閱組件屬性的值 + +[assembly: AssemblyTitle("EAIws_C")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("EAICws")] +[assembly: AssemblyCopyright("Copyright © 2018")] +[assembly: AssemblyTrademark("")] + +[assembly: ComVisible(false)] + +// 下列 GUID 為專案公開 (Expose) 至 COM 時所要使用的 typelib ID +[assembly: Guid("968ccd3c-116a-41ae-97a1-bd5dafb45d36")] + +// 組件的版本資訊由下列四個值所組成: +// +// 主要版本 +// 次要版本 +// 組建編號 +// 修訂編號 +// +// 您可以指定所有的值,也可以依照以下的方式,使用 '*' 將組建和修訂編號 +// 指定為預設值: +// + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/MESEAI/EAICws/EAICws/My Project/Resources.resx b/MESEAI/EAICws/EAICws/My Project/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/MESEAI/EAICws/EAICws/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/MESEAI/EAICws/EAICws/My Project/Settings.Designer.cs b/MESEAI/EAICws/EAICws/My Project/Settings.Designer.cs new file mode 100644 index 0000000..e8b6167 --- /dev/null +++ b/MESEAI/EAICws/EAICws/My Project/Settings.Designer.cs @@ -0,0 +1,88 @@ +// ------------------------------------------------------------------------------ +// +// 這段程式碼是由工具產生的。 +// 執行階段版本:4.0.30319.42000 +// +// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼, +// 變更將會遺失。 +// +// ------------------------------------------------------------------------------ + +using System.Diagnostics; +using Microsoft.VisualBasic; + + +namespace EAIws_C.My +{ + + [System.Runtime.CompilerServices.CompilerGenerated()] + [System.CodeDom.Compiler.GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Advanced)] + internal sealed partial class MySettings : System.Configuration.ApplicationSettingsBase + { + + private static MySettings defaultInstance = (MySettings)Synchronized(new MySettings()); + + #region My.Settings 自動儲存功能 + /* TODO ERROR: Skipped IfDirectiveTrivia + #If _MyType = "WindowsForms" Then + *//* TODO ERROR: Skipped DisabledTextTrivia + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub + *//* TODO ERROR: Skipped EndIfDirectiveTrivia + #End If + */ + #endregion + + public static MySettings Default + { + get + { + + /* TODO ERROR: Skipped IfDirectiveTrivia + #If _MyType = "WindowsForms" Then + *//* TODO ERROR: Skipped DisabledTextTrivia + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If + *//* TODO ERROR: Skipped EndIfDirectiveTrivia + #End If + */ + return defaultInstance; + } + } + } +} + +namespace EAIws_C.My +{ + + [HideModuleName()] + [DebuggerNonUserCode()] + [System.Runtime.CompilerServices.CompilerGenerated()] + internal static class MySettingsProperty + { + + [System.ComponentModel.Design.HelpKeyword("My.Settings")] + internal static MySettings Settings + { + get + { + return MySettings.Default; + } + } + } +} \ No newline at end of file diff --git a/MESEAI/EAICws/EAICws/My Project/Settings.settings b/MESEAI/EAICws/EAICws/My Project/Settings.settings new file mode 100644 index 0000000..85b890b --- /dev/null +++ b/MESEAI/EAICws/EAICws/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/MESEAI/EAICws/EAICws/modEAP.cs b/MESEAI/EAICws/EAICws/modEAP.cs new file mode 100644 index 0000000..e78bae7 --- /dev/null +++ b/MESEAI/EAICws/EAICws/modEAP.cs @@ -0,0 +1,1221 @@ +using System; +using System.Collections.Generic; +using System.Collections; +using System.Xml; +using iMESCIOC.Request.WMS_Request; +using iMESCIOC.Response.WMS_Response; +using Microsoft.VisualBasic; +using Newtonsoft.Json; +using tcEAI_C; +using iMESCIOC.Request.EAP; +using Microsoft.VisualBasic.ApplicationServices; +using EAIws; +using System.Data; +using Newtonsoft.Json.Linq; +using iMESCIOC.Response.EAP; +using Microsoft.VisualBasic.CompilerServices; +using API_Base; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json; +using iMESCIOC.Request.WMS_Request; +using iMESCIOC.Response.WMS_Response; +using iMESCIOC.Request.EAP; +using iMESCIOC.Response.EAP; + +namespace EAIws_C +{ + + static class modEAP + { + + private static XmlDocument xmlDoc = new XmlDocument(); // 用以讀取Xml字串 + private static DateTime ArriveTime; // 送達時間 + private static string strIdentity; // Identity XML字串 + private static string strReturnValue; // ReturnValue XML字串 + private static string strException; // Exception XML字串 + private static string strResult; // Result XML字串 + private static string strMessage; // Message XML字串 + private static object strServiceName = "modEAP"; + private static int i = 0; + + + + #region "测试工序进出站" + private static string funCheckJson(object parameters) + { + string result = ""; + string transactionid = ""; + string moduleid = ""; + string functionid = ""; + string computername = ""; + string curuserno = "DS"; + string curusrpwd = "";//新增用户密码 SM2加密 + string sendtime = ""; + string languagemode = ""; + string outXml = ""; + string Json = ""; + + string ContentType = ""; + string SourceSystem = ""; + string TargetSystem = ""; + string Authorization = ""; + try + { + //转换为数组 + if (parameters is object[] paramArray && paramArray.Length >= 2) + { + if (paramArray[1] is API_Base.ServiceInfo serviceInfo) + { + Json = serviceInfo.InJson; + string headerText = serviceInfo.httpRequest.ToString(); + + // 解析逻辑 + var lines = headerText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + Dictionary headers = new Dictionary(); + foreach (var line in lines) + { + int index = line.IndexOf(':'); + if (index > 0) + { + string key = line.Substring(0, index).Trim(); + string value = line.Substring(index + 1).Trim(); + headers[key] = value; + } + } + // 结果 + //curuserno = headers.TryGetValue("curuserno", out var no) ? no : ""; + //curusrpwd = headers.TryGetValue("curusrpwd", out var pwd) ? pwd : ""; + + + ContentType = headers.TryGetValue("Content-Type", out var contp) ? contp : ""; + SourceSystem = headers.TryGetValue("Source-System", out var sous) ? sous : ""; + TargetSystem = headers.TryGetValue("Target-System", out var tars) ? tars : ""; + Authorization = headers.TryGetValue("Authorization", out var auth) ? auth : ""; + + curusrpwd = Authorization; + } + } + + tcEAI_C.clsERP.funCheckUser(curuserno, curusrpwd); + + } + catch (Exception ex) + { + throw ex; + } + return Json; + } + public static string funTrackIn_Inquiry_CS(object parameters) + { + string funTrackIn_Inquiry_CS = default(string); + // 0102096: [6.0.5] EAP自動報工架構_SDD210906_05-01/ Execute_CI_LOT + string strReturnValue = "fail"; + string unitid = ""; + string eqp_id = ""; + string socketid = ""; + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + var aryMessage = new List(); + string LanguageMode = "zh-cht"; // 預設繁中 + string strMsg = ""; //返回信息 + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResult = ""; //返回结果 + + try + { + //获取进站报文 + strRequestJson = funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + unitid = result.unitid; + socketid = result.socketid; + eqp_id = result.eqp_id; + if (eqp_id =="") + { + throw new iMESException.MESException("0000-200002", "[%EquipmentNo%] [%NOT FOUND%]"); + } + + var jObj = JObject.Parse(strRequestJson); + Dictionary dicPars = jObj.ToObject>(); + + var dicPars_Tables = default(Dictionary); + + DataTable dt = new DataTable("lotattrib"); + dt.Columns.Add("row_count", typeof(int)); + dt.Columns.Add("attribno", typeof(string)); + dt.Columns.Add("attribvalue", typeof(string)); + + DataRow dr = dt.NewRow(); + dr["row_count"] = 1; + dr["attribno"] = "socketid"; + dr["attribvalue"] = socketid ; + dt.Rows.Add(dr); + + dicPars_Tables = new Dictionary + { + { "lotattrib", dt } + }; + + // 2.執行tcEAI + var obj = new tcEAI_C.clsEAP(); + strReturnValue = obj.Execute_CI_LOT(dicPars, dicPars_Tables, "DS", LanguageMode, ref aryMessage); + strResult = "success"; + } + + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + } + finally + { + //组装返回JOSN + TrackIn_Inquiry_CS_Response response = null; + + if (strResult == "success") + { + response = new TrackIn_Inquiry_CS_Response + { + code = "0000", + message = "TrackIn_Inquiry_CS successfully", + time = DateTime .Now + }; + } + else + { + // 失败逻辑 + response = new TrackIn_Inquiry_CS_Response + { + code = "1111", + message = "TrackIn_Inquiry :异常信息:"+ strMsg, + time = DateTime.Now + }; + } + + //resModel 转成JOSN返回 + strResponseJson = JsonConvert.SerializeObject(response); + funTrackIn_Inquiry_CS = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "EAP", "funTrackIn_Inquiry_CS", + "EAP", "EAP", DateTime.Now.ToString(), + strResult, "", strMessage, strException, strRequestJson, strResponseJson, "funTrackIn_Inquiry_CS", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "EAP"); + } + + return funTrackIn_Inquiry_CS; + } + + public static string TrackOut_Inquiry_CS(object parameters) + { + string Execute_CO_LOTRet = default(string); + + string strReturnValue = "fail"; + string unitid = ""; + string eqp_id = ""; + string result_c = ""; + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + var aryMessage = new List(); + string LanguageMode = "zh-cht"; // 預設繁中 + string strMsg = ""; //返回信息 + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResult = ""; //返回结果 + + try + { + strReturnValue = ""; + + //获取进站报文 + strRequestJson = funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + unitid = result.unitid; + result_c = result.result; + eqp_id = result.eqp_id; + if (eqp_id == "") + { + throw new iMESException.MESException("0000-200002", "[%EquipmentNo%] [%NOT FOUND%]"); + } + + var jObj = JObject.Parse(strRequestJson); + Dictionary dicPars = jObj.ToObject>(); + + var dicPars_Tables = new Dictionary(); + + // 2.執行tcEAI + var obj = new tcEAI_C.clsEAP(); + strReturnValue = obj.Execute_CO_LOT(dicPars, dicPars_Tables, "DS", LanguageMode, ref aryMessage); + strResult = "success"; + } + + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + } + finally + { + //组装返回JOSN + TrackIn_Inquiry_CS_Response response = null; + + if (strResult == "success") + { + response = new TrackIn_Inquiry_CS_Response + { + code = "0000", + message = "TrackOut_Inquiry_CS successfully", + time = DateTime.Now + }; + } + else + { + // 失败逻辑 + response = new TrackIn_Inquiry_CS_Response + { + code = "1111", + message = "TrackOut_Inquiry :异常信息:" + strMsg, + time = DateTime.Now + }; + } + + //resModel 转成JOSN返回 + strResponseJson = JsonConvert.SerializeObject(response); + Execute_CO_LOTRet = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "EAP", "funTrackOut_Inquiry_CS", + "EAP", "EAP", DateTime.Now.ToString(), + strResult, "", strMessage, strException, strRequestJson, strResponseJson, "funTrackOut_Inquiry_CS", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "EAP"); + } + + return Execute_CO_LOTRet; + } + #endregion + + + #region EAP 客制接口 + /// + /// 接口断点测试 + /// + /// + /// + public static string funEAPTEST(object parameters) + { + string funEAPTEST = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + + + try + { + + + + strResult = "success"; + + + + exitFun: + ; + } + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + + } + finally + { + + } + return funEAPTEST; + } + + + /// + /// 首站-进站接口 + /// + /// + /// + public static string funTrackIn_Inquiry(object parameters) + { + string funTrackIn_Inquiry = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + bool bolclsEAP = false; + + try + { + //获取进站报文 + strRequestJson = modERP.funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + //检查mono和eqp_id是否都传 + + if (result.mono == null || result.eqp_id == null) + { + throw new Exception("[%工单编号和设备编号都必须传入!%]"); + } + + //判空 + if (result.mono == "" || result.eqp_id == "") + { + throw new Exception("[%工单编号或者设备编号不能为空!%]"); + } + + + bolclsEAP = clsEAP.funTrackIn_Inquiry(ref strMessage, ref strException, MONO: result.mono, EQPID: result.eqp_id); + if (bolclsEAP == false) + { + //说明有提示 + modWS.ChgTranslateMessage(ref strMessage, ref strMsg); + throw new Exception(strMsg); + } + + strResult = "success"; + + + + exitFun: + ; + } + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + + } + finally + { + //组装返回JOSN + var resModel = new EAP_funTrackInOut_Inquiry_Response(); + if (strResult == "success") + { + resModel.Code = 0000; + resModel.Message = "TrackIn_Inquiry successfully"; + } + else + { + // 失败逻辑 + resModel.Code = 1111; + resModel.Message = "TrackIn_Inquiry :" + strMsg; + } + + //resModel 转成JOSN返回 + strResponseJson = JsonConvert.SerializeObject(resModel); + funTrackIn_Inquiry = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "WIP", "funTrackIn_Inquiry", + "EAP", "EAP", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "TrackIn_Inquiry", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "EAP"); + + } + return funTrackIn_Inquiry; + } + + /// + /// 首站-出站接口 + /// + /// + /// + /// + /// 首站-出站接口 + /// + /// + /// + public static string funTrackOut_Inquiry(object parameters) + { + string funTrackOut_Inquiry = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + bool bolclsEAP = false; + + + try + { + //获取进站报文 + strRequestJson = modERP.funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + //检查mono和eqp_id是否都传 + + if (result.mono == null || result.eqp_id == null || result.panleid == null || result.qty == null || result.column == null || result.line == null) + { + throw new Exception("[%工单编号,设备编号,panleid,数量,行数,列数都必须传入!%]"); + } + + + + //判空 + if (result.mono == "" || result.eqp_id == "" || result.panleid == "" || result.qty == "" || result.column == "" || result.line == "") + { + throw new Exception("[%工单编号,设备编号,panleid,数量,行数,列数都必须传入!%]"); + } + + //数量不能为0或者负数 + if (Convert.ToDecimal(result.qty) <= 0) + { + throw new Exception("[%数量不能为0或者负数!%]"); + } + + + bolclsEAP = clsEAP.funTrackOut_Inquiry(ref strMessage, ref strException, MONO: result.mono, EQPID: result.eqp_id, PanleId: result.panleid, Column: result.column, Line: result.line, carrierId: result.carrier_id, Qty: Convert.ToDecimal(result.qty), MapData: result.mapdata); + if (bolclsEAP == false) + { + //说明有提示 + modWS.ChgTranslateMessage(ref strMessage, ref strMsg); + throw new Exception(strMsg); + } + + strResult = "success"; + + + + exitFun: + ; + } + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + + } + finally + { + //组装返回JOSN + var resModel = new EAP_funTrackInOut_Inquiry_Response(); + if (strResult == "success") + { + resModel.Code = 0; + resModel.Message = "TrackOut_Inquiry successfully"; + } + else + { + // 失败逻辑 + resModel.Code = 1111; + resModel.Message = "TrackOut_Inquiry :" + strMsg; + } + + //resModel 转成JOSN返回 + strResponseJson = JsonConvert.SerializeObject(resModel); + funTrackOut_Inquiry = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "WIP", "funTrackOut_Inquiry", + "EAP", "EAP", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "TrackOut_Inquiry", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "EAP"); + + } + return funTrackOut_Inquiry; + } + + + + /// + /// 进站接口 + /// + /// + /// + public static string funTrackIn_Inquiry_LQ(object parameters) + { + string funTrackIn_Inquiry = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + bool bolclsEAP = false; + + try + { + //获取进站报文 + strRequestJson = modERP.funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + //检查mono和eqp_id是否都传 + + if ( result.eqp_id == null) + { + throw new Exception("[%设备编号必须传入!%]"); + } + + //判空 + if ( result.eqp_id == "") + { + throw new Exception("[%type或者设备编号不能为空!%]"); + } + + if (result.ID == null) + { + throw new Exception("[%ID必须传入!%]"); + } + + //判空 + if (result.ID == "") + { + throw new Exception("[%ID编号不能为空!%]"); + } + + bolclsEAP = clsEAP.funTrackIn_Inquiry_LQ(ref strMessage, ref strException, EQPID: result.eqp_id, result.ID,result.remark); + if (bolclsEAP == false) + { + //说明有提示 + modWS.ChgTranslateMessage(ref strMessage, ref strMsg); + throw new Exception(strMsg); + } + + strResult = "success"; + + + + exitFun: + ; + } + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + + } + finally + { + //组装返回JOSN + var resModel = new EAP_funTrackInOut_Inquiry_Response(); + if (strResult == "success") + { + resModel.Code = 0000; + resModel.Message = "TrackIn_Inquiry_LQ successfully"; + } + else + { + // 失败逻辑 + resModel.Code = 1111; + resModel.Message = "TrackIn_Inquiry_LQ :" + strMsg; + } + + //resModel 转成JOSN返回 + strResponseJson = JsonConvert.SerializeObject(resModel); + funTrackIn_Inquiry = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "WIP", "funTrackIn_Inquiry_LQ", + "EAP", "EAP", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "TrackIn_Inquiry_LQ", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "EAP"); + + } + return funTrackIn_Inquiry; + } + + public static string funTrackOut_Inquiry_LQ(object parameters) + { + string funTrackOut_Inquiry = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + bool bolclsEAP = false; + + + try + { + //获取进站报文 + strRequestJson = modERP.funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + //检查mono和eqp_id是否都传 + + if (result.eqp_id == null) + { + throw new Exception("[%设备编号必须传入!%]"); + } + + //判空 + if (result.eqp_id == "") + { + throw new Exception("[%type或者设备编号不能为空!%]"); + } + + if (result.ID == null) + { + throw new Exception("[%ID必须传入!%]"); + } + + //判空 + if (result.ID == "") + { + throw new Exception("[%ID编号不能为空!%]"); + } + + + bolclsEAP = clsEAP.funTrackOut_Inquiry_LQ(ref strMessage, ref strException, result.eqp_id, result.ID, result.remark); + if (bolclsEAP == false) + { + //说明有提示 + modWS.ChgTranslateMessage(ref strMessage, ref strMsg); + throw new Exception(strMsg); + } + + strResult = "success"; + + + + exitFun: + ; + } + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + + } + finally + { + //组装返回JOSN + var resModel = new EAP_funTrackInOut_Inquiry_Response(); + if (strResult == "success") + { + resModel.Code = 0; + resModel.Message = "TrackOut_Inquiry_LQ successfully"; + } + else + { + // 失败逻辑 + resModel.Code = 1111; + resModel.Message = "TrackOut_Inquiry_LQ :" + strMsg; + } + + //resModel 转成JOSN返回 + strResponseJson = JsonConvert.SerializeObject(resModel); + funTrackOut_Inquiry = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "WIP", "funTrackOut_Inquiry_LQ", + "EAP", "EAP", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "TrackOut_Inquiry_LQ", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "EAP"); + + } + return funTrackOut_Inquiry; + } + #endregion + #region"Mapping反转方向接口" + /// + /// 计量 + /// + /// + /// + public static string PrdMapping(object parameters) + { + string GetJLSPCData = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + + //调 clsERP 传入参数 + string Productid = ""; + string Eqp_id = ""; + + var listTest = new List(); + int REVERSALMETHOD = -1; + try + { + + strRequestJson = funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + //要因 没有值,则给 * + Productid = GetSafeString(result.Productid); + Eqp_id = GetSafeString(result.Eqp_id); + + bool bolclsERP = clsERP.funGetPrdMapping(ref strMessage, ref strException, Productid, Eqp_id, ref REVERSALMETHOD); + + if (bolclsERP == true) + { + strResult = "success"; + } + else + { + strResult = "fail"; + } + } + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + + } + finally + { + //组装返回JOSN + + + MappingResponse response = null; + + if (strResult == "success") + { + ResponseData data = new ResponseData(); + if (REVERSALMETHOD == 0) + { + data.REVERSALMETHOD = "上下反转"; + } + else if (REVERSALMETHOD == 1) + { + data.REVERSALMETHOD = "左右反转"; + } + else if (REVERSALMETHOD == 2) + { + data.REVERSALMETHOD = "上下左右反转"; + } + else + { + data.REVERSALMETHOD = "无反转"; + } + response = new MappingResponse + { + code = "0000", + message = "成功", + time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + data = data, + extras = null, + logId = "", + requestId = DateTime.Now.ToString("yyyyMMddHHmmssss") + }; + } + else + { + // 失败逻辑 + response = new MappingResponse + { + code = "1111", + message = strMsg, + time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + data = null, + extras = null, + logId = "", + requestId = DateTime.Now.ToString("yyyyMMddHHmmssss") + }; + } + + //resModel 转成JOSN返回 + strResponseJson = JsonConvert.SerializeObject(response); + GetJLSPCData = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "WIP", "PrdMapping", + "ERP", "ERP", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "PrdMapping", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "ERP"); + } + + return GetJLSPCData; + } + public static string GetSafeString(string value, string defaultValue = "*") + { + return string.IsNullOrEmpty(value) ? defaultValue : value; + } + #endregion + + #region "MakingCode明码查询接口" + /// + /// 明码查询接口 + /// + /// + /// + public static string MakingCode(object parameters) + { + string GetMakingCode = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JSON + string strRequestJson = ""; //传入JSON + + //返回数据 + string strMAKINGCODE = ""; + string strUNITSN = ""; + + try + { + strRequestJson = funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + string PanelSN = GetSafeString(result.PanelSN, ""); + string EQPID = GetSafeString(result.EQPID, ""); + + if (string.IsNullOrEmpty(PanelSN)) + { + throw new Exception("[%PanelSN不能为空!%]"); + } + if (string.IsNullOrEmpty(EQPID)) + { + throw new Exception("[%EQPID不能为空!%]"); + } + + bool bolclsEAP = clsEAP.funMakingCode(ref strMessage, ref strException, PanelSN, EQPID, ref strMAKINGCODE, ref strUNITSN); + + if (bolclsEAP == true) + { + strResult = "success"; + } + else + { + strResult = "fail"; + modWS.ChgTranslateMessage(ref strMessage, ref strMsg); + } + } + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + } + finally + { + //组装返回JSON + MakingCodeResponse response = null; + + if (strResult == "success") + { + var data = new MakingCodeResponseData + { + MAKINGCODE = strMAKINGCODE, + UNITSN = strUNITSN + }; + response = new MakingCodeResponse + { + code = "0000", + message = "MakingCode successfully", + time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + data = data, + extras = new Dictionary(), + logId = "", + requestId = DateTime.Now.ToString("yyyyMMddHHmmssss") + }; + } + else + { + response = new MakingCodeResponse + { + code = "1111", + message = "MakingCode :" + strMsg, + time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + data = new MakingCodeResponseData(), + extras = new Dictionary(), + logId = "", + requestId = DateTime.Now.ToString("yyyyMMddHHmmssss") + }; + } + + //resModel 转成JSON返回 + strResponseJson = JsonConvert.SerializeObject(response); + GetMakingCode = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "WIP", "MakingCode", + "EAP", "EAP", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "MakingCode", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "EAP"); + } + + return GetMakingCode; + } + #endregion + + #region "LotMessage批次信息查询接口" + /// + /// 批次信息查询接口 + /// + /// + /// + public static string LotMessage(object parameters) + { + string GetLotMessage = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JSON + string strRequestJson = ""; //传入JSON + + //返回数据 + string strLOTNO = ""; + string strPROCESSNO = ""; + string strOPNO = ""; + string strPRODUCTNO = ""; + string strCUSTOMERNO = ""; + + try + { + strRequestJson = funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + string PanelSN = GetSafeString(result.PanelSN, ""); + string EQPID = GetSafeString(result.EQPID, ""); + + if (string.IsNullOrEmpty(PanelSN)) + { + throw new Exception("[%PanelSN不能为空!%]"); + } + if (string.IsNullOrEmpty(EQPID)) + { + throw new Exception("[%EQPID不能为空!%]"); + } + + bool bolclsEAP = clsEAP.funLotMessage(ref strMessage, ref strException, PanelSN, EQPID, + ref strLOTNO, ref strPROCESSNO, ref strOPNO, ref strPRODUCTNO, ref strCUSTOMERNO); + + if (bolclsEAP == true) + { + strResult = "success"; + } + else + { + strResult = "fail"; + modWS.ChgTranslateMessage(ref strMessage, ref strMsg); + } + } + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + } + finally + { + //组装返回JSON + LotMessageResponse response = null; + + if (strResult == "success") + { + var data = new LotMessageResponseData + { + LOTNO = strLOTNO, + PROCESSNO = strPROCESSNO, + OPNO = strOPNO, + PRODUCTNO = strPRODUCTNO, + CUSTOMERNO = strCUSTOMERNO + }; + response = new LotMessageResponse + { + code = "0000", + message = "LotMessage successfully", + time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + data = data, + extras = new Dictionary(), + logId = "", + requestId = DateTime.Now.ToString("yyyyMMddHHmmssss") + }; + } + else + { + response = new LotMessageResponse + { + code = "1111", + message = "LotMessage :" + strMsg, + time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + data = new LotMessageResponseData(), + extras = new Dictionary(), + logId = "", + requestId = DateTime.Now.ToString("yyyyMMddHHmmssss") + }; + } + + //resModel 转成JSON返回 + strResponseJson = JsonConvert.SerializeObject(response); + GetLotMessage = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "WIP", "LotMessage", + "EAP", "EAP", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "LotMessage", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "EAP"); + } + + return GetLotMessage; + } + #endregion + + #region "MACBLUE MAC&蓝牙地址生成接口" + /// + /// MAC&蓝牙地址生成接口 + /// + public static string MACBLUE(object parameters) + { + string GetMACBLUE = default(string); + string strResult = ""; + string strMsg = ""; + string strKeyValue = ""; + var strException = new List(); + var strMessage = new List(); + string strResponseJson = ""; + string strRequestJson = ""; + + try + { + strRequestJson = funCheckJson(parameters); + string responseStr = clsEAP.funMACBLUE(strRequestJson); + + var responseJson = JsonConvert.DeserializeObject(responseStr); + if (responseJson.code == "0000") + { + strResult = "success"; + strResponseJson = responseStr; + } + else + { + strResult = "fail"; + strMsg = responseJson.message; + strResponseJson = responseStr; + } + } + catch (Exception ex) + { + strResult = "fail"; + strMsg = modWS.TranslateMsg(ex.Message); + } + finally + { + MACBLUEResponse response = null; + if (strResult == "success") + { + response = JsonConvert.DeserializeObject(strResponseJson); + } + else + { + response = new MACBLUEResponse + { + code = "1111", + message = "MACBLUE :" + strMsg, + time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + data = new MACBLUEResponseData(), + extras = new Dictionary(), + logId = "", + requestId = DateTime.Now.ToString("yyyyMMddHHmmssss") + }; + strResponseJson = JsonConvert.SerializeObject(response); + } + + GetMACBLUE = strResponseJson; + + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "WIP", "MACBLUE", + "EAP", "EAP", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "MACBLUE", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "EAP"); + } + + return GetMACBLUE; + } + #endregion + + + } +} \ No newline at end of file diff --git a/MESEAI/EAICws/EAICws/modERP.cs b/MESEAI/EAICws/EAICws/modERP.cs new file mode 100644 index 0000000..e371186 --- /dev/null +++ b/MESEAI/EAICws/EAICws/modERP.cs @@ -0,0 +1,4495 @@ +using API_Base; +using iMESCIOC.Request.EAP; +using iMESCIOC.Request.ERP; +using iMESCIOC.Request.WMS_Request; +using iMESCIOC.Response.EAP; +using iMESCIOC.Response.ERP; +using iMESCIOC.Response.WMS_Response; +using iMESCore.Settings; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Data; +using System.Linq; +using System.Net.Http.Headers; +using System.Reflection; +//using System.Web.Services; +using System.Xml; +using System.Xml; +using tcEAI_C; +using static iMESCore.Base.iMESConst; + +namespace EAIws_C +{ + + static class modERP + { + + public static string strService = "ERP"; + public static string strDataBaseType; + public static string strConnectionString; + + //public static string funCreateOperation(string InXml) + //{ + // string funCreateOperationRet = default(string); + // System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); // 用以讀取Xml字串 + // string OutXml = null; + + // string strIdentity = string.Empty; // Identity XML字串 + // string strResult = "fail"; // Result XML字串 + // List strException = new List(); // Exception XML字串 + // List strMessage = new List(); // Message XML字串 + // string strKeyValue = string.Empty; // TransactionLot KeyValue + // string strMode = string.Empty; // Mode + + // try + // { + // try + // { + // // 讀取InXml字串 + // xmlDoc.LoadXml(InXml); + // } + // catch (Exception ex) + // { + // clsERP.combineException(ref strException, null, ex.Message, "[%InXmlError%]", ex.StackTrace); + // goto exitFun; + // } + + // // 組Identity字串 + // try + // { + // strIdentity = modWS.CombineXMLIdentity(xmlDoc); + // } + // catch (Exception ex) + // { + // clsERP.combineException(ref strException, null, ex.Message, "[%IndentityError%]", ex.StackTrace); + // goto exitFun; + // } + + + // // 2019/05/09 OwenLiu, Mantis:0057304 作業站整合若資料已存在, + // // 且ERP未傳值的狀況, 不更新OPType, OPClass, OPShortName, OPOrder + // string OPNo = string.Empty; + // string OPName = string.Empty; + // string OPType = defString; + // string PSNo = defString; + // int OPClass = defInteger; // Default 0 : General OP + // string OPShortName = defString; + // int OPOrder = defInteger; // Default 0 + // string Description = string.Empty; + // string Creator = string.Empty; + // DateTime CreateDate = DateTime.Now; // Default Today + // int PrintOutOnRunCard = 1; // Default 1 + // double StdUnitRunTime = 0; // Default 0 + // long CountOpUnitQty = 1; // Default 1 + // double StdQueueTime = 0; // Default 0 + // decimal decStdUnitRunTime = defInteger; + // decimal decCountOpUnitQty = defInteger; + // decimal decStdQueueTime = defInteger; + // int OSOption = defInteger; + // int OSOptionTemp = defInteger; + // string ERPPDLineNo = defString; + // // Dim OldERPPDLineNo As String = defString '存放作業站修改前的群組資料 + + // // OPNo + // if (xmlDoc.DocumentElement.GetElementsByTagName("opno").Count > 0 && xmlDoc.GetElementsByTagName("opno").Item(0).SelectNodes("value").Count > 0) + // OPNo = modWS.CInput(xmlDoc.DocumentElement.GetElementsByTagName("opno").Item(0).SelectNodes("value").Item(0).InnerText); + + // // OPName + // if (xmlDoc.DocumentElement.GetElementsByTagName("opname").Count > 0 && xmlDoc.GetElementsByTagName("opname").Item(0).SelectNodes("value").Count > 0) + // OPName = modWS.CInput(xmlDoc.DocumentElement.GetElementsByTagName("opname").Item(0).SelectNodes("value").Item(0).InnerText); + + + + // // 判斷成功與否 + // if (strException.Count > 0) + // goto exitFun; + + // strResult = "success"; + + // exitFun: + // ; + // } + + // catch (Exception ex) + // { + // clsERP.combineException(ref strException, null, ex.Message, "[%CreateOPFail%]", ex.StackTrace); + // } + + // finally + // { + + // // 將各部份之XML字串組起來並傳出 + // OutXml = modWS.CombineXMLResponse(strIdentity, null, strException, strResult, strMessage); + + // funCreateOperationRet = OutXml; + // } + + // return funCreateOperationRet; + //} + + + #region --- SD_DSC_SI009 MO --- + public static string funAddMO(string InXml) + { + string funAddMORet = default(string); + + var xmlDoc = new XmlDocument(); // 用以讀取Xml字串 + XmlNodeList xmlList; + string OutXml = null; + + string strIdentity = string.Empty; // Identity XML字串 + string strResult = "fail"; // Result XML字串 + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strKeyValue = string.Empty; // TransactionLot KeyValue + var strAlert = new List(); + + try + { + + try + { + // 讀取InXml字串 + xmlDoc.LoadXml(InXml); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%InXmlError%]", stack: ex.StackTrace); + goto exitFun; + } + + // 組Identity字串 + try + { + strIdentity = modWS.CombineXMLIdentity(xmlDoc); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%IndentityError%]", stack: ex.StackTrace); + goto exitFun; + } + + string MONo = string.Empty; + string RONo = string.Empty; + string ItemNo = string.Empty; // RO ItemNo + string CustomerNo = string.Empty; + string CustomerLotNo = string.Empty; + string MOUnitNo = string.Empty; // MOUnitNo + string ProductNo = string.Empty; + string ProductVersion = string.Empty; + decimal MOQty = 0m; + int MOTypeNo = Conversions.ToInteger(ConfigurationManager.AppSettings["defMOTypeNo"]); + int Priority = Conversions.ToInteger(ConfigurationManager.AppSettings["defMOPriority"]); + var PlanFinishDate = DateAndTime.DateAdd(DateInterval.Day, Conversions.ToInteger(ConfigurationManager.AppSettings["defMOPlanFinishDate"]), DateTime.Now); + var PlanStartDate = DateAndTime.DateAdd(DateInterval.Day, Conversions.ToInteger(ConfigurationManager.AppSettings["defMOPlanStartDate"]), Convert.ToDateTime(Strings.Format(DateTime.Now, "yyyy/MM/dd"))); + string Creator = string.Empty; + var CreateDate = DateTime.Now; // Default Today + string Description = string.Empty; + string FactoryNo = string.Empty; + var MOProperty = new List(); + int MaterialLevel = defInteger; + int wipEntityId = defInteger; + string bomVersion = string.Empty; + string lcPlantype = string.Empty; + string faiFlag = string.Empty; + + string strERPMOLineNo = defString; + string strDeliveryMethod = defString; + + string SubstituteMaterialNo = string.Empty; + string MaterialNo = string.Empty; + string OPNO = string.Empty; + string Orgcode = string.Empty; + string OrgMono = string.Empty; + + if (xmlDoc.DocumentElement.GetElementsByTagName("orgcode").Count > 0 && xmlDoc.GetElementsByTagName("orgcode").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("orgcode").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput = xmlDoc.DocumentElement.GetElementsByTagName("orgcode").Item(0).SelectNodes("value").Item(0).InnerText; + Orgcode = modWS.CInput_Singlequotation(argstrInput); + xmlDoc.DocumentElement.GetElementsByTagName("orgcode").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput; + } + + if (xmlDoc.DocumentElement.GetElementsByTagName("orgmono").Count > 0 && xmlDoc.GetElementsByTagName("orgmono").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("orgmono").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput = xmlDoc.DocumentElement.GetElementsByTagName("orgmono").Item(0).SelectNodes("value").Item(0).InnerText; + OrgMono = modWS.CInput_Singlequotation(argstrInput); + xmlDoc.DocumentElement.GetElementsByTagName("orgmono").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput; + } + // MONo + if (xmlDoc.DocumentElement.GetElementsByTagName("mono").Count > 0 && xmlDoc.GetElementsByTagName("mono").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("mono").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput = xmlDoc.DocumentElement.GetElementsByTagName("mono").Item(0).SelectNodes("value").Item(0).InnerText; + MONo = modWS.CInput_Singlequotation(argstrInput); + xmlDoc.DocumentElement.GetElementsByTagName("mono").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput; + } + + // RONo + if (xmlDoc.DocumentElement.GetElementsByTagName("rono").Count > 0 && xmlDoc.GetElementsByTagName("rono").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("rono").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput1 = xmlDoc.DocumentElement.GetElementsByTagName("rono").Item(0).SelectNodes("value").Item(0).InnerText; + RONo = modWS.CInput_Singlequotation(argstrInput1); + xmlDoc.DocumentElement.GetElementsByTagName("rono").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput1; + } + + // ItemNo + if (xmlDoc.DocumentElement.GetElementsByTagName("itemno").Count > 0 && xmlDoc.GetElementsByTagName("itemno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("itemno").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput2 = xmlDoc.DocumentElement.GetElementsByTagName("itemno").Item(0).SelectNodes("value").Item(0).InnerText; + ItemNo = modWS.CInput_Singlequotation(argstrInput2); + xmlDoc.DocumentElement.GetElementsByTagName("itemno").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput2; + } + + // 如傳入的值為0001則轉換成1 + if (!string.IsNullOrEmpty(ItemNo)) + { + ItemNo = Conversions.ToInteger(ItemNo).ToString(); + } + + + // CustomerNo + if (xmlDoc.DocumentElement.GetElementsByTagName("customerno").Count > 0 && xmlDoc.GetElementsByTagName("customerno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("customerno").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput3 = xmlDoc.DocumentElement.GetElementsByTagName("customerno").Item(0).SelectNodes("value").Item(0).InnerText; + CustomerNo = modWS.CInput_Singlequotation(argstrInput3); + xmlDoc.DocumentElement.GetElementsByTagName("customerno").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput3; + } + + // CustomerLotNo + if (xmlDoc.DocumentElement.GetElementsByTagName("customerlotno").Count > 0 && xmlDoc.GetElementsByTagName("customerlotno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("customerlotno").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput3 = xmlDoc.DocumentElement.GetElementsByTagName("customerlotno").Item(0).SelectNodes("value").Item(0).InnerText; + CustomerLotNo = modWS.CInput_Singlequotation(argstrInput3); + xmlDoc.DocumentElement.GetElementsByTagName("customerlotno").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput3; + } + + // MOUnitNo + if (xmlDoc.DocumentElement.GetElementsByTagName("mounitno").Count > 0 && xmlDoc.GetElementsByTagName("mounitno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("mounitno").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput4 = xmlDoc.DocumentElement.GetElementsByTagName("mounitno").Item(0).SelectNodes("value").Item(0).InnerText; + MOUnitNo = modWS.CInput_Singlequotation(argstrInput4); + xmlDoc.DocumentElement.GetElementsByTagName("mounitno").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput4; + } + + // ProductNo + if (xmlDoc.DocumentElement.GetElementsByTagName("productno").Count > 0 && xmlDoc.GetElementsByTagName("productno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("productno").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput5 = xmlDoc.DocumentElement.GetElementsByTagName("productno").Item(0).SelectNodes("value").Item(0).InnerText; + ProductNo = modWS.CInput_Singlequotation(argstrInput5); + xmlDoc.DocumentElement.GetElementsByTagName("productno").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput5; + } + + // FactoryNo + if (xmlDoc.DocumentElement.GetElementsByTagName("factoryno").Count > 0 && xmlDoc.GetElementsByTagName("factoryno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("factoryno").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput6 = xmlDoc.DocumentElement.GetElementsByTagName("factoryno").Item(0).SelectNodes("value").Item(0).InnerText; + FactoryNo = modWS.CInput_Singlequotation(argstrInput6); + xmlDoc.DocumentElement.GetElementsByTagName("factoryno").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput6; + } + + // MOQty + if (xmlDoc.DocumentElement.GetElementsByTagName("moqty").Count > 0 && xmlDoc.GetElementsByTagName("moqty").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("moqty").Item(0).SelectNodes("value").Item(0).InnerText) && Information.IsNumeric(xmlDoc.DocumentElement.GetElementsByTagName("moqty").Item(0).SelectNodes("value").Item(0).InnerText) == true) + + + + MOQty = Convert.ToDecimal(xmlDoc.DocumentElement.GetElementsByTagName("moqty").Item(0).SelectNodes("value").Item(0).InnerText); + + // MOTypeNo + if (xmlDoc.DocumentElement.GetElementsByTagName("motypeno").Count > 0 && xmlDoc.GetElementsByTagName("motypeno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("motypeno").Item(0).SelectNodes("value").Item(0).InnerText) && Information.IsNumeric(xmlDoc.DocumentElement.GetElementsByTagName("motypeno").Item(0).SelectNodes("value").Item(0).InnerText) == true) + { + MOTypeNo = Conversions.ToInteger(xmlDoc.DocumentElement.GetElementsByTagName("motypeno").Item(0).SelectNodes("value").Item(0).InnerText); + } + else + { + clsERP.combineException(ref strException, mesmsg: "[%MOTypeError%]"); + } + // Priority + if (xmlDoc.DocumentElement.GetElementsByTagName("priority").Count > 0 && xmlDoc.GetElementsByTagName("priority").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("priority").Item(0).SelectNodes("value").Item(0).InnerText) && Information.IsNumeric(xmlDoc.DocumentElement.GetElementsByTagName("priority").Item(0).SelectNodes("value").Item(0).InnerText) == true) + + + + Priority = Conversions.ToInteger(xmlDoc.DocumentElement.GetElementsByTagName("priority").Item(0).SelectNodes("value").Item(0).InnerText); + + // PlanFinishDate + if (xmlDoc.DocumentElement.GetElementsByTagName("planfinishdate").Count > 0 && xmlDoc.GetElementsByTagName("planfinishdate").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("planfinishdate").Item(0).SelectNodes("value").Item(0).InnerText) && Information.IsDate(xmlDoc.DocumentElement.GetElementsByTagName("planfinishdate").Item(0).SelectNodes("value").Item(0).InnerText) == true) + + + + PlanFinishDate = Convert.ToDateTime(xmlDoc.DocumentElement.GetElementsByTagName("planfinishdate").Item(0).SelectNodes("value").Item(0).InnerText); + + // PlanStartDate + if (xmlDoc.DocumentElement.GetElementsByTagName("planstartdate").Count > 0 && xmlDoc.GetElementsByTagName("planstartdate").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("planstartdate").Item(0).SelectNodes("value").Item(0).InnerText) && Information.IsDate(xmlDoc.DocumentElement.GetElementsByTagName("planstartdate").Item(0).SelectNodes("value").Item(0).InnerText) == true) + + + + PlanStartDate = Convert.ToDateTime(xmlDoc.DocumentElement.GetElementsByTagName("planstartdate").Item(0).SelectNodes("value").Item(0).InnerText); + + // Creator + Creator = modWS.GetXMLIdentityNode(xmlDoc, "curuserno"); + + // Description + if (xmlDoc.DocumentElement.GetElementsByTagName("description").Count > 0 && xmlDoc.GetElementsByTagName("description").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("description").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput7 = xmlDoc.DocumentElement.GetElementsByTagName("description").Item(0).SelectNodes("value").Item(0).InnerText; + Description = modWS.CInput_Singlequotation(argstrInput7); + xmlDoc.DocumentElement.GetElementsByTagName("description").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput7; + } + + // 2018/3/19 Vick 新增欄位 ERPMOLineNo + if (xmlDoc.DocumentElement.GetElementsByTagName("erpmolineno").Count > 0 && xmlDoc.GetElementsByTagName("erpmolineno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("erpmolineno").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput8 = xmlDoc.DocumentElement.GetElementsByTagName("erpmolineno").Item(0).SelectNodes("value").Item(0).InnerText; + strERPMOLineNo = modWS.CInput_Singlequotation(argstrInput8); + xmlDoc.DocumentElement.GetElementsByTagName("erpmolineno").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput8; + } + + + if (xmlDoc.DocumentElement.GetElementsByTagName("wipentityid").Count > 0 && xmlDoc.GetElementsByTagName("wipentityid").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("wipentityid").Item(0).SelectNodes("value").Item(0).InnerText) && Information.IsNumeric(xmlDoc.DocumentElement.GetElementsByTagName("wipentityid").Item(0).SelectNodes("value").Item(0).InnerText) == true) + + + + wipEntityId = Conversions.ToInteger(xmlDoc.DocumentElement.GetElementsByTagName("wipentityid").Item(0).SelectNodes("value").Item(0).InnerText); + + + if (xmlDoc.DocumentElement.GetElementsByTagName("bomversion").Count > 0 && xmlDoc.GetElementsByTagName("bomversion").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("bomversion").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput8 = xmlDoc.DocumentElement.GetElementsByTagName("bomversion").Item(0).SelectNodes("value").Item(0).InnerText; + bomVersion = modWS.CInput_Singlequotation(argstrInput8); + xmlDoc.DocumentElement.GetElementsByTagName("bomversion").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput8; + } + + if (xmlDoc.DocumentElement.GetElementsByTagName("lcplantype").Count > 0 && xmlDoc.GetElementsByTagName("lcplantype").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("lcplantype").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput8 = xmlDoc.DocumentElement.GetElementsByTagName("lcplantype").Item(0).SelectNodes("value").Item(0).InnerText; + lcPlantype = modWS.CInput_Singlequotation(argstrInput8); + xmlDoc.DocumentElement.GetElementsByTagName("lcplantype").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput8; + } + + if (xmlDoc.DocumentElement.GetElementsByTagName("faiflag").Count > 0 && xmlDoc.GetElementsByTagName("faiflag").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("faiflag").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput8 = xmlDoc.DocumentElement.GetElementsByTagName("faiflag").Item(0).SelectNodes("value").Item(0).InnerText; + faiFlag = modWS.CInput_Singlequotation(argstrInput8); + xmlDoc.DocumentElement.GetElementsByTagName("faiflag").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput8; + } + + // 檢查必要性欄位 + if (string.IsNullOrEmpty(MONo)) + clsERP.combineException(ref strException, mesmsg: "[%MONoEmpty%]"); + if (string.IsNullOrEmpty(MOUnitNo)) + clsERP.combineException(ref strException, mesmsg: "[%MOUnitNoEmpty%]"); + if (string.IsNullOrEmpty(ProductNo)) + clsERP.combineException(ref strException, mesmsg: "[%ProductNoEmpty%]"); + if (string.IsNullOrEmpty(FactoryNo)) + clsERP.combineException(ref strException, mesmsg: "[%FactoryNoEmpty%]"); + if (MOQty <= 0m) + clsERP.combineException(ref strException, mesmsg: "[%MOQtyError%]"); + if (strException.Count > 0) + goto exitFun; + + // 2019/08/16 Grace 新增tblOEMOBasis.FromERP=1處理, 不需在Description填入"From ERP" + // '20180514 KevinChang 0046325: TIPTOP工單整合-工單刪除問題 + // Description = IIf(String.IsNullOrEmpty(Description), "From ERP", "From ERP," & Description) + + // ----- MO Detail ----- + var dtMTL = new DataTable("MOMaterialList"); + dtMTL.Columns.Add("MONo", Type.GetType("System.String")); + dtMTL.Columns.Add("MaterialNo", Type.GetType("System.String")); + dtMTL.Columns.Add("MaterialLevel", Type.GetType("System.Int16")); + dtMTL.Columns.Add("StdQty", Type.GetType("System.Decimal")); + dtMTL.Columns.Add("UnitNo", Type.GetType("System.String")); + dtMTL.Columns.Add("OPNo", Type.GetType("System.String")); + dtMTL.Columns.Add("PutInPlaceType", Type.GetType("System.Int16")); + dtMTL.Columns.Add("DecreaseRate", Type.GetType("System.Decimal")); + dtMTL.Columns.Add("Specified", Type.GetType("System.Int16")); + dtMTL.Columns.Add("MaterialType", Type.GetType("System.String")); + dtMTL.Columns.Add("CountWay", Type.GetType("System.Int16")); + dtMTL.Columns.Add("CheckLotNo", Type.GetType("System.Int16")); + dtMTL.Columns.Add("MaterialVersion", Type.GetType("System.String")); + dtMTL.Columns.Add("MaterialMONo", Type.GetType("System.String")); + dtMTL.Columns.Add("SubstituteMaterialNo", Type.GetType("System.String")); + dtMTL.Columns.Add("SubstituteMaterialLevel", Type.GetType("System.Int16")); // 2012/12/26,Even,新增替代物料及物料使用量 + dtMTL.Columns.Add("SubstituteStdQty", Type.GetType("System.Decimal")); // 2012/12/28,Even,新增替代料標準數 + dtMTL.Columns.Add("RequireQty", Type.GetType("System.Decimal")); + dtMTL.Columns.Add("DeliveryMethod", Type.GetType("System.String")); // 2019/09/26 Grace 新增"材料型態" + + dtMTL.Columns.Add("MainItem", Type.GetType("System.String")); //主料编号 + dtMTL.Columns.Add("PhantomItem", Type.GetType("System.String")); //虚拟件 + dtMTL.Columns.Add("LockRequirement", Type.GetType("System.String")); //是否锁定需求 + dtMTL.Columns.Add("OperationSeqnum", Type.GetType("System.String")); //工序 + if (xmlDoc.DocumentElement.GetElementsByTagName("momateriallist").Count > 0) + { + if (xmlDoc.GetElementsByTagName("momateriallist").Item(0).SelectNodes("value").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("momateriallist").Item(0).SelectNodes("value"); + if (xmlList.Count == 0) + { + clsERP.combineException(ref strMessage, mesmsg: "[%MOMaterialListNotExist%]"); + } + else + { + DataRow dr; + bool errorFlag = false; + for (int i = 0, loopTo = xmlList.Count - 1; i <= loopTo; i++) + { + OPNO = string.Empty; + errorFlag = false; + try + { + dr = dtMTL.NewRow(); + + // ----- MONo ----- + dr["MONo"] = MONo; + + // ----- MaterialMo ----- + if (xmlList[i].SelectNodes("materialno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("materialno").Item(0).InnerText)) + { + dr["MaterialNo"] = modWS.CInput_Singlequotation(xmlList[i].SelectNodes("materialno").Item(0).InnerText).ToString().ToUpper(); + MaterialNo = modWS.CInput_Singlequotation(xmlList[i].SelectNodes("materialno").Item(0).InnerText).ToString().ToUpper(); + } + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%MaterialListMaterialNoError%]"); + } + + // ----- MaterialLevel ----- + if (xmlList[i].SelectNodes("materiallevel").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("materiallevel").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("materiallevel").Item(0).InnerText) == true) + + { + MaterialLevel = Conversions.ToInteger(xmlList[i].SelectNodes("materiallevel").Item(0).InnerText); + } + else + { + // Default value + MaterialLevel = Conversions.ToInteger(ConfigurationManager.AppSettings["defMOListMaterialLevel"]); + } + dr["MaterialLevel"] = MaterialLevel; + + // ----- StdQty ----- + decimal dblStdQty = 0m; + + if (xmlList[i].SelectNodes("stdqty").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("stdqty").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("stdqty").Item(0).InnerText) == true) + + { + dr["StdQty"] = Convert.ToDecimal(xmlList[i].SelectNodes("stdqty").Item(0).InnerText); + + dblStdQty = Convert.ToDecimal(dr["StdQty"]); // 暫存StdQty + } + + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%MaterialListSTDQtyError%]"); + } + + // ----- UnitNo ----- + if (xmlList[i].SelectNodes("unitno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("unitno").Item(0).InnerText)) + { + string argstrInput9 = xmlList[i].SelectNodes("unitno").Item(0).InnerText; + dr["UnitNo"] = modWS.CInput_Singlequotation(argstrInput9); + xmlList[i].SelectNodes("unitno").Item(0).InnerText = argstrInput9; + } + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%MaterialListUnitNoError%]"); + } + + // ----- PutInPlaceType ----- + if (xmlList[i].SelectNodes("putinplacetype").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("putinplacetype").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("putinplacetype").Item(0).InnerText.ToUpper()) == true) + + { + dr["PutInPlaceType"] = Conversions.ToInteger(xmlList[i].SelectNodes("putinplacetype").Item(0).InnerText); + } + else + { + // Default value + dr["PutInPlaceType"] = Conversions.ToInteger(ConfigurationManager.AppSettings["defMOListPutInPlaceType"]); + } + + // ----- DecreaseRate ----- + if (xmlList[i].SelectNodes("decreaserate").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("decreaserate").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("decreaserate").Item(0).InnerText) == true) + + { + dr["DecreaseRate"] = Convert.ToDecimal(xmlList[i].SelectNodes("decreaserate").Item(0).InnerText); + } + else + { + // Default value + dr["DecreaseRate"] = Convert.ToDecimal(ConfigurationManager.AppSettings["defMOListDecreaseRate"]); + } + + // ----- Specified ----- + if (xmlList[i].SelectNodes("specified").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("specified").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("specified").Item(0).InnerText) == true) + + { + dr["Specified"] = Convert.ToDecimal(xmlList[i].SelectNodes("specified").Item(0).InnerText); + } + else + { + // Default value + dr["Specified"] = Convert.ToDecimal(ConfigurationManager.AppSettings["defMOListSpecified"]); + } + + // ----- MaterialType----- + if (xmlList[i].SelectNodes("materialtype").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("materialtype").Item(0).InnerText)) + + { + string argstrInput10 = xmlList[i].SelectNodes("materialtype").Item(0).InnerText; + dr["MaterialType"] = modWS.CInput_Singlequotation(argstrInput10); + xmlList[i].SelectNodes("materialtype").Item(0).InnerText = argstrInput10; + } + + // ----- CountWay ----- + if (xmlList[i].SelectNodes("countway").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("countway").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("countway").Item(0).InnerText) == true) + + { + dr["CountWay"] = Conversions.ToInteger(xmlList[i].SelectNodes("countway").Item(0).InnerText); + } + else + { + // Default value + dr["CountWay"] = Conversions.ToInteger(ConfigurationManager.AppSettings["defMOListCountWay"]); + } + + // ----- CheckLotNo ----- + if (xmlList[i].SelectNodes("checklotno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("checklotno").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("checklotno").Item(0).InnerText) == true) + + + dr["CheckLotNo"] = Conversions.ToInteger(xmlList[i].SelectNodes("checklotno").Item(0).InnerText); + + // ----- MaterialVersion ----- + if (xmlList[i].SelectNodes("materialversion").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("materialversion").Item(0).InnerText)) + + { + string argstrInput11 = xmlList[i].SelectNodes("materialversion").Item(0).InnerText; + dr["MaterialVersion"] = modWS.CInput_Singlequotation(argstrInput11); + xmlList[i].SelectNodes("materialversion").Item(0).InnerText = argstrInput11; + } + + // ----- SubstituteMaterialNo ----- + if (xmlList[i].SelectNodes("substitutematerialno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("substitutematerialno").Item(0).InnerText)) + { + dr["SubstituteMaterialNo"] = modWS.CInput_Singlequotation(xmlList[i].SelectNodes("substitutematerialno").Item(0).InnerText).ToString().ToUpper(); + SubstituteMaterialNo = modWS.CInput_Singlequotation(xmlList[i].SelectNodes("substitutematerialno").Item(0).InnerText).ToString().ToUpper(); + } + else + { + // Default value + dr["SubstituteMaterialNo"] = dr["materialno"].ToString().ToUpper(); + SubstituteMaterialNo = dr["materialno"].ToString().ToUpper(); + } + + // ----- OPNo ----- + // 若有傳入作業站資訊以傳入的資訊為主 + // 若沒有傳入作業站資訊,則優先以產品BOM上定義的作業站,若產品BOM無定義,以物料屬性 PutInPlace_OPNo 中的值為主 + // 若皆無傳入則以Config中定義的作業站為主 + if (xmlList[i].SelectNodes("opno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("opno").Item(0).InnerText)) + { + string argstrInput12 = xmlList[i].SelectNodes("opno").Item(0).InnerText; + dr["OPNo"] = modWS.CInput_Singlequotation(argstrInput12); + xmlList[i].SelectNodes("opno").Item(0).InnerText = argstrInput12; + } + else + { + // 檢查產品BOM是否有定義,若無繼續往下查找對應作業站資訊 + using (var objPRD = new kcPRD.clsProduct()) + { + try + { + ProductVersion = objPRD.GetProductCurVersion(ProductNo.ToUpper()); + } + catch (Exception ex) + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%GetProductVersionFail%]"); + } + + DataSet dsTemp_PRD; + if (SubstituteMaterialNo == MaterialNo) + { + dsTemp_PRD = objPRD.ShowBOM(ProductNo, ProductVersion, MaterialNo); + if (dsTemp_PRD.Tables["PRDBOM"].Rows.Count > 0) + { + OPNO = dsTemp_PRD.Tables["PRDBOM"].Rows[0]["OPNO"].ToString().ToUpper(); + dsTemp_PRD = null; + } + else + { + dsTemp_PRD = null; + } + } + else + { + dsTemp_PRD = objPRD.ShowBOMMaterialGroup(ProductNo, ProductVersion, MaterialNo, MaterialNo: SubstituteMaterialNo); + if (dsTemp_PRD.Tables["MaterialGroup"].Rows.Count > 0) + { + OPNO = dsTemp_PRD.Tables["MaterialGroup"].Rows[0]["OPNO"].ToString().ToUpper(); + dsTemp_PRD = null; + } + else + { + dsTemp_PRD = null; + } + } + + } + + if (string.IsNullOrEmpty(OPNO)) + { + // 檢查物料屬性是否有定義,若繼續往下查找對應作業站資訊 + DataSet dsTemp_MTL; + using (var objMTL = new kcMTL.clsMTLBasis()) + { + dsTemp_MTL = objMTL.ShowMaterialProperty(SubstituteMaterialNo, "PutInPlace_OPNo", 2); + if (dsTemp_MTL.Tables["MaterialProperty"].Rows.Count > 0) + { + OPNO = dsTemp_MTL.Tables["MaterialProperty"].Rows[0]["DEFAULTVALUE"].ToString().ToUpper(); + dsTemp_MTL = null; + } + else + { + dsTemp_MTL = null; + } + } + + if (string.IsNullOrEmpty(OPNO)) + { + // Default value + dr["OPNo"] = ConfigurationManager.AppSettings["defMOListOPNo"]; + } + else + { + dr["OPNo"] = OPNO; + } + } + else + { + dr["OPNo"] = OPNO; + } + + } + + // 2012/02/18,Even,新增替代物料等級、替代料標準數及物料使用量------- + // ----- SubstituteMaterialLevel ----- + if (xmlList[i].SelectNodes("substitutemateriallevel").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("substitutemateriallevel").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("substitutemateriallevel").Item(0).InnerText) == true) + + { + dr["SubstituteMaterialLevel"] = Conversions.ToInteger(xmlList[i].SelectNodes("substitutemateriallevel").Item(0).InnerText); + } + else + { + // Default value,未抓取到,抓取MaterialLevel + dr["SubstituteMaterialLevel"] = MaterialLevel; + } + // ----- SubstituteStdQty -- + if (xmlList[i].SelectNodes("substitutestdqty").Count > 0 && + !string.IsNullOrEmpty(xmlList[i].SelectNodes("substitutestdqty").Item(0).InnerText) && + Information.IsNumeric(xmlList[i].SelectNodes("substitutestdqty").Item(0).InnerText)) + { + dr["SubstituteStdQty"] = Convert.ToDecimal(xmlList[i].SelectNodes("substitutestdqty").Item(0).InnerText); + + if (dr["MaterialNo"].ToString() == dr["SubstituteMaterialNo"].ToString()) + { + if (Convert.ToDecimal(dr["stdqty"]) != Convert.ToDecimal(dr["substitutestdqty"])) + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: dr["MaterialNo"].ToString() + "[%StdQtyAndSubstituteStdQtyMustBeTheSame%]"); + } + } + } + else + { + // 2018/09/20 OwenLiu, 因為後端程式會重新計算,這邊取消預設值的指定 + // 'Default value,未抓取到,抓取則抓物料之標準數 + // dr("SubstituteStdQty") = dr("StdQty") + } + // ----- RequireQty--------若無資料則為工單數 * 標準數*(1+損耗率) + if (xmlList[i].SelectNodes("requireqty").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("requireqty").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("requireqty").Item(0).InnerText) == true) + + { + dr["RequireQty"] = Convert.ToDecimal(xmlList[i].SelectNodes("requireqty").Item(0).InnerText); + } + else + { + // 2018/09/20 OwenLiu, 因為後端程式會重新計算,這邊取消預設值的指定 + // 'Default value + // dr("RequireQty") = MOQty * dblStdQty * (1 + dr("DecreaseRate")) + } + + + // ----- DeliveryMethod ----- + // 2019/09/26 Grace 新增tagname, 材料型態:DeliveryMethod (Optional參數,非必傳) + if (xmlList[i].SelectNodes("deliverymethod").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("deliverymethod").Item(0).InnerText)) + + { + string argstrInput13 = xmlList[i].SelectNodes("deliverymethod").Item(0).InnerText; + dr["DeliveryMethod"] = modWS.CInput_Singlequotation(argstrInput13); + xmlList[i].SelectNodes("deliverymethod").Item(0).InnerText = argstrInput13; + } + + + if (xmlList[i].SelectNodes("mainitem").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("mainitem").Item(0).InnerText)) + + { + string argstrInput13 = xmlList[i].SelectNodes("mainitem").Item(0).InnerText; + dr["MainItem"] = modWS.CInput_Singlequotation(argstrInput13); + xmlList[i].SelectNodes("mainitem").Item(0).InnerText = argstrInput13; + } + + if (xmlList[i].SelectNodes("phantomitem").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("phantomitem").Item(0).InnerText)) + + { + string argstrInput13 = xmlList[i].SelectNodes("phantomitem").Item(0).InnerText; + dr["PhantomItem"] = modWS.CInput_Singlequotation(argstrInput13); + xmlList[i].SelectNodes("phantomitem").Item(0).InnerText = argstrInput13; + } + + if (xmlList[i].SelectNodes("lockrequirement").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("lockrequirement").Item(0).InnerText)) + + { + string argstrInput13 = xmlList[i].SelectNodes("lockrequirement").Item(0).InnerText; + dr["LockRequirement"] = modWS.CInput_Singlequotation(argstrInput13); + xmlList[i].SelectNodes("lockrequirement").Item(0).InnerText = argstrInput13; + } + + if (xmlList[i].SelectNodes("operationseqnum").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("operationseqnum").Item(0).InnerText)) + + { + string argstrInput13 = xmlList[i].SelectNodes("operationseqnum").Item(0).InnerText; + dr["OperationSeqnum"] = modWS.CInput_Singlequotation(argstrInput13); + xmlList[i].SelectNodes("operationseqnum").Item(0).InnerText = argstrInput13; + } + + if (errorFlag == false) + { + dtMTL.Rows.Add(dr); + } + } + + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%MOMaterialListError%]", stack: ex.StackTrace); + } + } + } + } + } + + // ----- MO Property ----- + var dtMOProperty = new DataTable("MOProperty"); + dtMOProperty.Columns.Add("MONo", Type.GetType("System.String")); + dtMOProperty.Columns.Add("PropertyNo", Type.GetType("System.String")); + dtMOProperty.Columns.Add("PropertyValue", Type.GetType("System.String")); + dtMOProperty.Columns.Add("DataType", Type.GetType("System.String")); // DataType: 0:Numeric, 1:String(default), 2:Percent, 3:DateTime, 4:Boolean + + // web.config裡預設的MOProperty (ERPUnitNo)(原本是寫在ArrayList裡,改寫在DataTable裡) + if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["defERPUnitNoProperty"])) + { + DataRow drP; + drP = dtMOProperty.NewRow(); + drP["MONo"] = MONo; + drP["PropertyNo"] = ConfigurationManager.AppSettings["defERPUnitNoProperty"]; + drP["PropertyValue"] = MOUnitNo; + drP["DataType"] = "String"; + dtMOProperty.Rows.Add(drP); + } + + // ERP拋過來的工單屬性 + if (xmlDoc.DocumentElement.GetElementsByTagName("property").Count > 0) + { + if (xmlDoc.GetElementsByTagName("property").Item(0).SelectNodes("value").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("property").Item(0).SelectNodes("value"); + if (xmlList.Count == 0) + { + } + // clsERP.combineMessage(strMessage, , , "[%MOPropertyNotExist%]") + else + { + DataRow dr; + bool errorFlag = false; + for (int i = 0, loopTo1 = xmlList.Count - 1; i <= loopTo1; i++) + { + errorFlag = false; + try + { + dr = dtMOProperty.NewRow(); + + // ----- MONo ----- + dr["MONo"] = MONo; + + // ----- PropertyNo ----- + if (xmlList[i].SelectNodes("name").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("name").Item(0).InnerText)) + { + string argstrInput14 = xmlList[i].SelectNodes("name").Item(0).InnerText; + dr["PropertyNo"] = modWS.CInput_Singlequotation(argstrInput14); + xmlList[i].SelectNodes("name").Item(0).InnerText = argstrInput14; + } + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%PropertyNoEmpty%]"); + } + + // ----- PropertyValue ----- + if (xmlList[i].SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("value").Item(0).InnerText)) + { + string argstrInput15 = xmlList[i].SelectNodes("value").Item(0).InnerText; + dr["PropertyValue"] = modWS.CInput_Singlequotation(argstrInput15); + xmlList[i].SelectNodes("value").Item(0).InnerText = argstrInput15; + } + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%PropertyValueEmpty%]"); + } + + // ----- DataType ----- + if (xmlList[i].SelectNodes("type").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("type").Item(0).InnerText)) + { + string argstrInput16 = xmlList[i].SelectNodes("type").Item(0).InnerText; + dr["DataType"] = modWS.CInput_Singlequotation(argstrInput16); + xmlList[i].SelectNodes("type").Item(0).InnerText = argstrInput16; + } + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%DataTypeEmpty%]"); + } + + if (errorFlag == false) + { + dtMOProperty.Rows.Add(dr); + } + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%MOPropertyError%]", stack: ex.StackTrace); + } + } + } + } + } + + if (strException.Count > 0) + goto exitFun; + + // KeyValue + strKeyValue = MONo; + + // '呼叫Dll執行 ----- UnitNo=UnitType=SystemUnit ----- + clsOE.addMO(Orgcode, OrgMono, MONo, MOUnitNo, ProductNo, MOQty, FactoryNo, RONo, ItemNo, CustomerNo, MOTypeNo, Priority, PlanFinishDate, Creator, CreateDate, Description, dtMTL, MOProperty, strMessage, strException, strAlert, dtMOProperty, strERPMOLineNo, CustomerLotNo, PlanStartDate, wipEntityId: wipEntityId, bomVersion: bomVersion, lcPlantype: lcPlantype, faiFlag: faiFlag); + + // 判斷成功與否 + if (strException.Count > 0) + goto exitFun; + + strResult = "success"; + + exitFun: + ; + } + + + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%AddMOFail%]", stack: ex.StackTrace); + } + + finally + { + + // 將各部份之XML字串組起來並傳出 + string argReturnValue = null; + OutXml = modWS.CombineXMLResponse(strIdentity, argReturnValue, strException, strResult, strMessage); + + // 紀錄Transaction Log + try + { + clsERP.addTransactionLog_ErrorCode(modWS.GetXMLIdentityNode(xmlDoc, "transactionid"), modWS.GetXMLIdentityNode(xmlDoc, "moduleid"), modWS.GetXMLIdentityNode(xmlDoc, "functionid"), modWS.GetXMLIdentityNode(xmlDoc, "computername"), modWS.GetXMLIdentityNode(xmlDoc, "curuserno"), modWS.GetXMLIdentityNode(xmlDoc, "sendtime"), strResult, strKeyValue, strMessage, strException, InXml, OutXml, "AddMO", Conversions.ToInteger(ConfigurationManager.AppSettings["keepLog"]), Conversions.ToInteger(ConfigurationManager.AppSettings["keepXML"]), LogClass: "ERP"); + } + catch (Exception ex) + { + string strMsg = ex.Message; + } + + + funAddMORet = OutXml; + + } + + return funAddMORet; + + } + + public static string funEditMO(string InXml) + { + string funEditMORet = default(string); + + var xmlDoc = new XmlDocument(); // 用以讀取Xml字串 + XmlNodeList xmlList; + string OutXml = null; + + string strIdentity = string.Empty; // Identity XML字串 + string strResult = "fail"; // Result XML字串 + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + var strAlert = new List(); + string strKeyValue = string.Empty; // TransactionLot KeyValue + + try + { + + try + { + // 讀取InXml字串 + xmlDoc.LoadXml(InXml); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%InXmlError%]", stack: ex.StackTrace); + goto exitFun; + } + + // 組Identity字串 + try + { + strIdentity = modWS.CombineXMLIdentity(xmlDoc); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%IndentityError%]", stack: ex.StackTrace); + goto exitFun; + } + + string MONo = string.Empty; + string RONo = string.Empty; + string ItemNo = string.Empty; // RO ItemNo + string CustomerNo = string.Empty; + string CustomerLotNo = string.Empty; //CustomerLotNo + decimal MOQty = 0m; + int MOTypeNo = Conversions.ToInteger(ConfigurationManager.AppSettings["defMOTypeNo"]); + int Priority = Conversions.ToInteger(ConfigurationManager.AppSettings["defMOPriority"]); + var PlanFinishDate = DateAndTime.DateAdd(DateInterval.Day, Conversions.ToInteger(ConfigurationManager.AppSettings["defMOPlanFinishDate"]), DateTime.Now); + var PlanStartDate = defDateTime; + string Creator = string.Empty; + var CreateDate = DateTime.Now; // Default Today + string Description = string.Empty; + string MOUnitNo = string.Empty; + int MaterialLevel = defInteger; + int wipEntityId = defInteger; + string bomVersion = string.Empty; + string lcPlantype = string.Empty; + string faiFlag = string.Empty; + + string strERPMOLineNo = defString; + + string ProductNo = string.Empty; + string ProductVersion = string.Empty; + string SubstituteMaterialNo = string.Empty; + string MaterialNo = string.Empty; + string OPNO = string.Empty; + + // MONo + if (xmlDoc.DocumentElement.GetElementsByTagName("mono").Count > 0 && xmlDoc.GetElementsByTagName("mono").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("mono").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput = xmlDoc.DocumentElement.GetElementsByTagName("mono").Item(0).SelectNodes("value").Item(0).InnerText; + MONo = modWS.CInput_Singlequotation(argstrInput); + xmlDoc.DocumentElement.GetElementsByTagName("mono").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput; + } + + // RONo + if (xmlDoc.DocumentElement.GetElementsByTagName("rono").Count > 0 && xmlDoc.GetElementsByTagName("rono").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("rono").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput1 = xmlDoc.DocumentElement.GetElementsByTagName("rono").Item(0).SelectNodes("value").Item(0).InnerText; + RONo = modWS.CInput_Singlequotation(argstrInput1); + xmlDoc.DocumentElement.GetElementsByTagName("rono").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput1; + } + + // ItemNo + if (xmlDoc.DocumentElement.GetElementsByTagName("itemno").Count > 0 && xmlDoc.GetElementsByTagName("itemno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("itemno").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput2 = xmlDoc.DocumentElement.GetElementsByTagName("itemno").Item(0).SelectNodes("value").Item(0).InnerText; + ItemNo = modWS.CInput_Singlequotation(argstrInput2); + xmlDoc.DocumentElement.GetElementsByTagName("itemno").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput2; + } + + // 如傳入的值為0001則轉換成1 + if (!string.IsNullOrEmpty(ItemNo)) + { + ItemNo = Conversions.ToInteger(ItemNo).ToString(); + } + + // CustomerNo + if (xmlDoc.DocumentElement.GetElementsByTagName("customerno").Count > 0 && xmlDoc.GetElementsByTagName("customerno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("customerno").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput3 = xmlDoc.DocumentElement.GetElementsByTagName("customerno").Item(0).SelectNodes("value").Item(0).InnerText; + CustomerNo = modWS.CInput_Singlequotation(argstrInput3); + xmlDoc.DocumentElement.GetElementsByTagName("customerno").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput3; + } + + // CustomerLotNo + if (xmlDoc.DocumentElement.GetElementsByTagName("customerlotno").Count > 0 && xmlDoc.GetElementsByTagName("customerlotno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("customerlotno").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput3 = xmlDoc.DocumentElement.GetElementsByTagName("customerlotno").Item(0).SelectNodes("value").Item(0).InnerText; + CustomerLotNo = modWS.CInput_Singlequotation(argstrInput3); + xmlDoc.DocumentElement.GetElementsByTagName("customerlotno").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput3; + } + + // MOQty + if (xmlDoc.DocumentElement.GetElementsByTagName("moqty").Count > 0 && xmlDoc.GetElementsByTagName("moqty").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("moqty").Item(0).SelectNodes("value").Item(0).InnerText) && Information.IsNumeric(xmlDoc.DocumentElement.GetElementsByTagName("moqty").Item(0).SelectNodes("value").Item(0).InnerText) == true) + + + + MOQty = Convert.ToDecimal(xmlDoc.DocumentElement.GetElementsByTagName("moqty").Item(0).SelectNodes("value").Item(0).InnerText); + + // MOTypeNo + if (xmlDoc.DocumentElement.GetElementsByTagName("motypeno").Count > 0 && xmlDoc.GetElementsByTagName("motypeno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("motypeno").Item(0).SelectNodes("value").Item(0).InnerText) && Information.IsNumeric(xmlDoc.DocumentElement.GetElementsByTagName("motypeno").Item(0).SelectNodes("value").Item(0).InnerText) == true) + + + + MOTypeNo = Conversions.ToInteger(xmlDoc.DocumentElement.GetElementsByTagName("motypeno").Item(0).SelectNodes("value").Item(0).InnerText); + + // Priority + if (xmlDoc.DocumentElement.GetElementsByTagName("priority").Count > 0 && xmlDoc.GetElementsByTagName("priority").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("priority").Item(0).SelectNodes("value").Item(0).InnerText) && Information.IsNumeric(xmlDoc.DocumentElement.GetElementsByTagName("priority").Item(0).SelectNodes("value").Item(0).InnerText) == true) + + + + Priority = Conversions.ToInteger(xmlDoc.DocumentElement.GetElementsByTagName("priority").Item(0).SelectNodes("value").Item(0).InnerText); + + // PlanFinishDate + if (xmlDoc.DocumentElement.GetElementsByTagName("planfinishdate").Count > 0 && xmlDoc.GetElementsByTagName("planfinishdate").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("planfinishdate").Item(0).SelectNodes("value").Item(0).InnerText) && Information.IsDate(xmlDoc.DocumentElement.GetElementsByTagName("planfinishdate").Item(0).SelectNodes("value").Item(0).InnerText) == true) + + + + PlanFinishDate = Convert.ToDateTime(xmlDoc.DocumentElement.GetElementsByTagName("planfinishdate").Item(0).SelectNodes("value").Item(0).InnerText); + + // PlanStartDate + if (xmlDoc.DocumentElement.GetElementsByTagName("planstartdate").Count > 0 && xmlDoc.GetElementsByTagName("planstartdate").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("planstartdate").Item(0).SelectNodes("value").Item(0).InnerText) && Information.IsDate(xmlDoc.DocumentElement.GetElementsByTagName("planstartdate").Item(0).SelectNodes("value").Item(0).InnerText) == true) + + + + PlanStartDate = Convert.ToDateTime(xmlDoc.DocumentElement.GetElementsByTagName("planstartdate").Item(0).SelectNodes("value").Item(0).InnerText); + + // Creator + Creator = modWS.GetXMLIdentityNode(xmlDoc, "curuserno"); + + // Description + if (xmlDoc.DocumentElement.GetElementsByTagName("description").Count > 0 && xmlDoc.GetElementsByTagName("description").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("description").Item(0).SelectNodes("value").Item(0).InnerText)) + + + Description = xmlDoc.DocumentElement.GetElementsByTagName("description").Item(0).SelectNodes("value").Item(0).InnerText; + + // MOUnitNo + if (xmlDoc.DocumentElement.GetElementsByTagName("mounitno").Count > 0 && xmlDoc.GetElementsByTagName("mounitno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("mounitno").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput4 = xmlDoc.DocumentElement.GetElementsByTagName("mounitno").Item(0).SelectNodes("value").Item(0).InnerText; + MOUnitNo = modWS.CInput_Singlequotation(argstrInput4); + xmlDoc.DocumentElement.GetElementsByTagName("mounitno").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput4; + } + + // 2018/3/19 Vick 新增欄位 ERPMOLineNo + if (xmlDoc.DocumentElement.GetElementsByTagName("erpmolineno").Count > 0 && xmlDoc.GetElementsByTagName("erpmolineno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("erpmolineno").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput5 = xmlDoc.DocumentElement.GetElementsByTagName("erpmolineno").Item(0).SelectNodes("value").Item(0).InnerText; + strERPMOLineNo = modWS.CInput_Singlequotation(argstrInput5); + xmlDoc.DocumentElement.GetElementsByTagName("erpmolineno").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput5; + } + + if (xmlDoc.DocumentElement.GetElementsByTagName("wipentityid").Count > 0 && xmlDoc.GetElementsByTagName("wipentityid").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("wipentityid").Item(0).SelectNodes("value").Item(0).InnerText) && Information.IsNumeric(xmlDoc.DocumentElement.GetElementsByTagName("wipentityid").Item(0).SelectNodes("value").Item(0).InnerText) == true) + + + + wipEntityId = Conversions.ToInteger(xmlDoc.DocumentElement.GetElementsByTagName("wipentityid").Item(0).SelectNodes("value").Item(0).InnerText); + + + if (xmlDoc.DocumentElement.GetElementsByTagName("bomversion").Count > 0 && xmlDoc.GetElementsByTagName("bomversion").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("bomversion").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput8 = xmlDoc.DocumentElement.GetElementsByTagName("bomversion").Item(0).SelectNodes("value").Item(0).InnerText; + bomVersion = modWS.CInput_Singlequotation(argstrInput8); + xmlDoc.DocumentElement.GetElementsByTagName("bomversion").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput8; + } + + if (xmlDoc.DocumentElement.GetElementsByTagName("lcplantype").Count > 0 && xmlDoc.GetElementsByTagName("lcplantype").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("lcplantype").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput8 = xmlDoc.DocumentElement.GetElementsByTagName("lcplantype").Item(0).SelectNodes("value").Item(0).InnerText; + lcPlantype = modWS.CInput_Singlequotation(argstrInput8); + xmlDoc.DocumentElement.GetElementsByTagName("lcplantype").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput8; + } + + if (xmlDoc.DocumentElement.GetElementsByTagName("faiflag").Count > 0 && xmlDoc.GetElementsByTagName("faiflag").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("faiflag").Item(0).SelectNodes("value").Item(0).InnerText)) + + + { + string argstrInput8 = xmlDoc.DocumentElement.GetElementsByTagName("faiflag").Item(0).SelectNodes("value").Item(0).InnerText; + faiFlag = modWS.CInput_Singlequotation(argstrInput8); + xmlDoc.DocumentElement.GetElementsByTagName("faiflag").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput8; + } + + // 檢查必要性欄位 + if (string.IsNullOrEmpty(MONo)) + clsERP.combineException(ref strException, mesmsg: "[%MONoEmpty%]"); + if (MOQty <= 0m) + clsERP.combineException(ref strException, mesmsg: "[%MOQtyError%]"); + + // 2022/04/08 Eric 檢查產品資訊,並取得目前產品資訊用於後續判斷投料作業站 + using (var objOE = new kcOE.clsOEBasis()) + { + DataSet dsTemp_OE; + dsTemp_OE = objOE.ShowMOBasis(MONo); + if (dsTemp_OE.Tables["OEMOBasis"].Rows.Count > 0) + { + ProductNo = dsTemp_OE.Tables["OEMOBasis"].Rows[0]["ProductNo"].ToString().ToUpper(); + ProductVersion = dsTemp_OE.Tables["OEMOBasis"].Rows[0]["ProductVersion"].ToString().ToUpper(); + dsTemp_OE = null; + } + else + { + // 工單編號不存在 + clsERP.combineException(ref strException, mesmsg: "[%MONoNotExist%]"); + dsTemp_OE = null; + } + } + + if (strException.Count > 0) + goto exitFun; + + // 2019/02/24 OwenLiu, Mantis:0055248 TIPTOP工單整合-工單刪除問題 + Description = (string.IsNullOrEmpty(Description) ? "From ERP" : "From ERP," + Description); + + // ----- MO Detail ----- + var dtMTL = new DataTable("MOMaterialList"); + dtMTL.Columns.Add("MONo", Type.GetType("System.String")); + dtMTL.Columns.Add("MaterialNo", Type.GetType("System.String")); + dtMTL.Columns.Add("MaterialLevel", Type.GetType("System.Int16")); + dtMTL.Columns.Add("StdQty", Type.GetType("System.Decimal")); + dtMTL.Columns.Add("UnitNo", Type.GetType("System.String")); + dtMTL.Columns.Add("OPNo", Type.GetType("System.String")); + dtMTL.Columns.Add("PutInPlaceType", Type.GetType("System.Int16")); + dtMTL.Columns.Add("DecreaseRate", Type.GetType("System.Decimal")); + dtMTL.Columns.Add("Specified", Type.GetType("System.Int16")); + dtMTL.Columns.Add("MaterialType", Type.GetType("System.String")); + dtMTL.Columns.Add("CountWay", Type.GetType("System.Int16")); + dtMTL.Columns.Add("CheckLotNo", Type.GetType("System.Int16")); + dtMTL.Columns.Add("MaterialVersion", Type.GetType("System.String")); + dtMTL.Columns.Add("MaterialMONo", Type.GetType("System.String")); + dtMTL.Columns.Add("SubstituteMaterialNo", Type.GetType("System.String")); + dtMTL.Columns.Add("SubstituteMaterialLevel", Type.GetType("System.Int16")); // 2012/12/26,Even,新增替代物料及物料使用量 + dtMTL.Columns.Add("SubstituteStdQty", Type.GetType("System.Decimal")); // 2012/12/28,Even,新增替代料標準數 + dtMTL.Columns.Add("RequireQty", Type.GetType("System.Decimal")); + dtMTL.Columns.Add("DeliveryMethod", Type.GetType("System.String")); // 2019/09/26 Grace 新增"材料型態" + + dtMTL.Columns.Add("MainItem", Type.GetType("System.String")); //主料编号 + dtMTL.Columns.Add("PhantomItem", Type.GetType("System.String")); //虚拟件 + dtMTL.Columns.Add("LockRequirement", Type.GetType("System.String")); //是否锁定需求 + dtMTL.Columns.Add("OperationSeqnum", Type.GetType("System.String")); //工序 + + if (xmlDoc.DocumentElement.GetElementsByTagName("momateriallist").Count > 0) + { + if (xmlDoc.GetElementsByTagName("momateriallist").Item(0).SelectNodes("value").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("momateriallist").Item(0).SelectNodes("value"); + if (xmlList.Count == 0) + { + clsERP.combineException(ref strMessage, mesmsg: "[%MOMaterialListNotExist%]"); + } + else + { + DataRow dr; + bool errorFlag = false; + for (int i = 0, loopTo = xmlList.Count - 1; i <= loopTo; i++) + { + OPNO = string.Empty; + errorFlag = false; + try + { + dr = dtMTL.NewRow(); + + // ----- MONo ----- + dr["MONo"] = MONo; + + // ----- MaterialMo ----- + if (xmlList[i].SelectNodes("materialno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("materialno").Item(0).InnerText)) + { + dr["MaterialNo"] = modWS.CInput_Singlequotation(xmlList[i].SelectNodes("materialno").Item(0).InnerText).ToString().ToUpper(); + MaterialNo = modWS.CInput_Singlequotation(xmlList[i].SelectNodes("materialno").Item(0).InnerText).ToString().ToUpper(); + } + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%MaterialListMaterialNoError%]"); + } + + // ----- MaterialLevel ----- + if (xmlList[i].SelectNodes("materiallevel").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("materiallevel").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("materiallevel").Item(0).InnerText) == true) + + { + MaterialLevel = Conversions.ToInteger(xmlList[i].SelectNodes("materiallevel").Item(0).InnerText); + } + else + { + // Default value + MaterialLevel = Conversions.ToInteger(ConfigurationManager.AppSettings["defMOListMaterialLevel"]); + } + dr["MaterialLevel"] = MaterialLevel; + + // ----- StdQty ----- + decimal dblStdQty = 0m; + if (xmlList[i].SelectNodes("stdqty").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("stdqty").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("stdqty").Item(0).InnerText) == true) + + { + + dr["StdQty"] = Convert.ToDecimal(xmlList[i].SelectNodes("stdqty").Item(0).InnerText); + dblStdQty = Convert.ToDecimal(dr["StdQty"]); + } + + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%MaterialListSTDQtyError%]"); + } + + // ----- UnitNo ----- + if (xmlList[i].SelectNodes("unitno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("unitno").Item(0).InnerText)) + { + string argstrInput6 = xmlList[i].SelectNodes("unitno").Item(0).InnerText; + dr["UnitNo"] = modWS.CInput_Singlequotation(argstrInput6); + xmlList[i].SelectNodes("unitno").Item(0).InnerText = argstrInput6; + } + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%MaterialListUnitNoError%]"); + } + + // ----- PutInPlaceType ----- + if (xmlList[i].SelectNodes("putinplacetype").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("putinplacetype").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("putinplacetype").Item(0).InnerText.ToUpper()) == true) + + { + dr["PutInPlaceType"] = Conversions.ToInteger(xmlList[i].SelectNodes("putinplacetype").Item(0).InnerText); + } + else + { + // Default value + dr["PutInPlaceType"] = Conversions.ToInteger(ConfigurationManager.AppSettings["defMOListPutInPlaceType"]); + } + + // ----- DecreaseRate ----- + if (xmlList[i].SelectNodes("decreaserate").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("decreaserate").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("decreaserate").Item(0).InnerText) == true) + + { + dr["DecreaseRate"] = Convert.ToDecimal(xmlList[i].SelectNodes("decreaserate").Item(0).InnerText); + } + else + { + // Default value + dr["DecreaseRate"] = Convert.ToDecimal(ConfigurationManager.AppSettings["defMOListDecreaseRate"]); + } + + // ----- Specified ----- + if (xmlList[i].SelectNodes("specified").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("specified").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("specified").Item(0).InnerText) == true) + + { + dr["Specified"] = Convert.ToDecimal(xmlList[i].SelectNodes("specified").Item(0).InnerText); + } + else + { + // Default value + dr["Specified"] = Convert.ToDecimal(ConfigurationManager.AppSettings["defMOListSpecified"]); + } + + // ----- MaterialType----- + if (xmlList[i].SelectNodes("materialtype").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("materialtype").Item(0).InnerText)) + + { + string argstrInput7 = xmlList[i].SelectNodes("materialtype").Item(0).InnerText; + dr["MaterialType"] = modWS.CInput_Singlequotation(argstrInput7); + xmlList[i].SelectNodes("materialtype").Item(0).InnerText = argstrInput7; + } + + // ----- CountWay ----- + if (xmlList[i].SelectNodes("countway").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("countway").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("countway").Item(0).InnerText) == true) + + { + dr["CountWay"] = Conversions.ToInteger(xmlList[i].SelectNodes("countway").Item(0).InnerText); + } + else + { + // Default value + dr["CountWay"] = Conversions.ToInteger(ConfigurationManager.AppSettings["defMOListCountWay"]); + } + + // ----- CheckLotNo ----- + if (xmlList[i].SelectNodes("checklotno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("checklotno").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("checklotno").Item(0).InnerText) == true) + + + dr["CheckLotNo"] = Conversions.ToInteger(xmlList[i].SelectNodes("checklotno").Item(0).InnerText); + + // ----- MaterialVersion ----- + if (xmlList[i].SelectNodes("materialversion").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("materialversion").Item(0).InnerText)) + + { + string argstrInput8 = xmlList[i].SelectNodes("materialversion").Item(0).InnerText; + dr["MaterialVersion"] = modWS.CInput_Singlequotation(argstrInput8); + xmlList[i].SelectNodes("materialversion").Item(0).InnerText = argstrInput8; + } + + // ----- SubstituteMaterialNo ----- + if (xmlList[i].SelectNodes("substitutematerialno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("substitutematerialno").Item(0).InnerText)) + { + dr["SubstituteMaterialNo"] = modWS.CInput_Singlequotation(xmlList[i].SelectNodes("substitutematerialno").Item(0).InnerText).ToString().ToUpper(); + SubstituteMaterialNo = modWS.CInput_Singlequotation(xmlList[i].SelectNodes("substitutematerialno").Item(0).InnerText).ToString().ToUpper(); + } + else + { + // Default value + dr["SubstituteMaterialNo"] = dr["materialno"].ToString().ToUpper(); + SubstituteMaterialNo = dr["materialno"].ToString().ToUpper(); + } + + // ----- OPNo ----- + // 若有傳入作業站資訊以傳入的資訊為主 + // 若沒有傳入作業站資訊,則優先以產品BOM上定義的作業站,若產品BOM無定義,以物料屬性 PutInPlace_OPNo 中的值為主 + // 若皆無傳入則以Config中定義的作業站為主 + if (xmlList[i].SelectNodes("opno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("opno").Item(0).InnerText)) + { + string argstrInput9 = xmlList[i].SelectNodes("opno").Item(0).InnerText; + dr["OPNo"] = modWS.CInput_Singlequotation(argstrInput9); + xmlList[i].SelectNodes("opno").Item(0).InnerText = argstrInput9; + } + else + { + // 檢查產品BOM是否有定義,若無繼續往下查找對應作業站資訊 + using (var objPRD = new kcPRD.clsProduct()) + { + + DataSet dsTemp_PRD; + if (SubstituteMaterialNo == MaterialNo) + { + dsTemp_PRD = objPRD.ShowBOM(ProductNo, ProductVersion, MaterialNo); + if (dsTemp_PRD.Tables["PRDBOM"].Rows.Count > 0) + { + OPNO = dsTemp_PRD.Tables["PRDBOM"].Rows[0]["OPNO"].ToString().ToUpper(); + dsTemp_PRD = null; + } + else + { + dsTemp_PRD = null; + } + } + else + { + dsTemp_PRD = objPRD.ShowBOMMaterialGroup(ProductNo, ProductVersion, MaterialNo, MaterialNo: SubstituteMaterialNo); + if (dsTemp_PRD.Tables["MaterialGroup"].Rows.Count > 0) + { + OPNO = dsTemp_PRD.Tables["MaterialGroup"].Rows[0]["OPNO"].ToString().ToUpper(); + dsTemp_PRD = null; + } + else + { + dsTemp_PRD = null; + } + } + + } + + if (string.IsNullOrEmpty(OPNO)) + { + // 檢查物料屬性是否有定義,若繼續往下查找對應作業站資訊 + DataSet dsTemp_MTL; + using (var objMTL = new kcMTL.clsMTLBasis()) + { + dsTemp_MTL = objMTL.ShowMaterialProperty(SubstituteMaterialNo, "PutInPlace_OPNo", 2); + if (dsTemp_MTL.Tables["MaterialProperty"].Rows.Count > 0) + { + OPNO = dsTemp_MTL.Tables["MaterialProperty"].Rows[0]["DEFAULTVALUE"].ToString().ToUpper(); + dsTemp_MTL = null; + } + else + { + dsTemp_MTL = null; + } + } + + if (string.IsNullOrEmpty(OPNO)) + { + // Default value + dr["OPNo"] = ConfigurationManager.AppSettings["defMOListOPNo"]; + } + else + { + dr["OPNo"] = OPNO; + } + } + else + { + dr["OPNo"] = OPNO; + } + + } + + // 2013/02/18,Even,新增替代物料及物料使用量------- + // ----- SubstituteMaterialLevel ----- + if (xmlList[i].SelectNodes("substitutemateriallevel").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("substitutemateriallevel").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("substitutemateriallevel").Item(0).InnerText) == true) + + { + dr["SubstituteMaterialLevel"] = Conversions.ToInteger(xmlList[i].SelectNodes("substitutemateriallevel").Item(0).InnerText); + } + else + { + // Default value,未抓取到,抓取MaterialLevel + dr["SubstituteMaterialLevel"] = MaterialLevel; + } + // ----- SubstituteStdQty -- + if (xmlList[i].SelectNodes("substitutestdqty").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("substitutestdqty").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("substitutestdqty").Item(0).InnerText) == true) + + { + dr["SubstituteStdQty"] = Convert.ToDecimal(xmlList[i].SelectNodes("substitutestdqty").Item(0).InnerText); + } + else + { + // 2018/09/20 OwenLiu, 因為後端程式會重新計算,這邊取消預設值的指定 + // 'Default value,未抓取到,抓取則抓物料之標準數 + // dr("SubstituteStdQty") = dr("StdQty") + } + + // ----- RequireQty--------若無資料則為工單數 * 標準數*(1+損耗率) + if (xmlList[i].SelectNodes("requireqty").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("requireqty").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("requireqty").Item(0).InnerText) == true) + + { + dr["RequireQty"] = Convert.ToDecimal(xmlList[i].SelectNodes("requireqty").Item(0).InnerText); + } + else + { + // 2018/09/20 OwenLiu, 因為後端程式會重新計算,這邊取消預設值的指定 + // 'Default value + // dr("RequireQty") = MOQty * dblStdQty * (1 + dr("DecreaseRate")) + } + + // ----- DeliveryMethod ----- + // 2019/09/26 Grace 新增tagname, 材料型態:DeliveryMethod (Optional參數,非必傳) + if (xmlList[i].SelectNodes("deliverymethod").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("deliverymethod").Item(0).InnerText)) + + { + string argstrInput10 = xmlList[i].SelectNodes("deliverymethod").Item(0).InnerText; + dr["DeliveryMethod"] = modWS.CInput_Singlequotation(argstrInput10); + xmlList[i].SelectNodes("deliverymethod").Item(0).InnerText = argstrInput10; + } + + if (xmlList[i].SelectNodes("mainitem").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("mainitem").Item(0).InnerText)) + + { + string argstrInput13 = xmlList[i].SelectNodes("mainitem").Item(0).InnerText; + dr["MainItem"] = modWS.CInput_Singlequotation(argstrInput13); + xmlList[i].SelectNodes("mainitem").Item(0).InnerText = argstrInput13; + } + + if (xmlList[i].SelectNodes("phantomitem").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("phantomitem").Item(0).InnerText)) + + { + string argstrInput13 = xmlList[i].SelectNodes("phantomitem").Item(0).InnerText; + dr["PhantomItem"] = modWS.CInput_Singlequotation(argstrInput13); + xmlList[i].SelectNodes("phantomitem").Item(0).InnerText = argstrInput13; + } + + if (xmlList[i].SelectNodes("lockrequirement").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("lockrequirement").Item(0).InnerText)) + + { + string argstrInput13 = xmlList[i].SelectNodes("lockrequirement").Item(0).InnerText; + dr["LockRequirement"] = modWS.CInput_Singlequotation(argstrInput13); + xmlList[i].SelectNodes("lockrequirement").Item(0).InnerText = argstrInput13; + } + + if (xmlList[i].SelectNodes("operationseqnum").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("operationseqnum").Item(0).InnerText)) + + { + string argstrInput13 = xmlList[i].SelectNodes("operationseqnum").Item(0).InnerText; + dr["OperationSeqnum"] = modWS.CInput_Singlequotation(argstrInput13); + xmlList[i].SelectNodes("operationseqnum").Item(0).InnerText = argstrInput13; + } + + if (errorFlag == false) + { + dtMTL.Rows.Add(dr); + } + } + + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%MOMaterialListError%]", stack: ex.StackTrace); + } + } + } + } + } + + // MO Property + var dtMOProperty = new DataTable("MOProperty"); + dtMOProperty.Columns.Add("MONo", Type.GetType("System.String")); + dtMOProperty.Columns.Add("PropertyNo", Type.GetType("System.String")); + dtMOProperty.Columns.Add("PropertyValue", Type.GetType("System.String")); + // dtMOProperty.Columns.Add("LotSerial", System.Type.GetType("System.String")) + dtMOProperty.Columns.Add("DataType", Type.GetType("System.String")); // DataType: 0:Numeric, 1:String(default), 2:Percent, 3:DateTime, 4:Boolean + + // web.config裡預設的MOProperty (ERPUnitNo)(原本是寫在ArrayList裡,改寫在DataTable裡) + if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["defERPUnitNoProperty"])) + { + DataRow drP; + drP = dtMOProperty.NewRow(); + drP["MONo"] = MONo; + drP["PropertyNo"] = ConfigurationManager.AppSettings["defERPUnitNoProperty"]; + drP["PropertyValue"] = MOUnitNo; + drP["DataType"] = "String"; + dtMOProperty.Rows.Add(drP); + } + + + bool PropertyFlag = false; // haoqian 221025 + // ERP拋過來的屬性 + if (xmlDoc.DocumentElement.GetElementsByTagName("property").Count > 0) + { + if (xmlDoc.GetElementsByTagName("property").Item(0).SelectNodes("value").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("property").Item(0).SelectNodes("value"); + if (xmlList.Count == 0) + { + } + // clsERP.combineMessage(strMessage, , , "[%MOPropertyNotExist%]") + else + { + DataRow dr; + bool errorFlag = false; + PropertyFlag = true; // haoqian 221025 + for (int i = 0, loopTo1 = xmlList.Count - 1; i <= loopTo1; i++) + { + errorFlag = false; + try + { + dr = dtMOProperty.NewRow(); + + // ----- MONo ----- + dr["MONo"] = MONo; + + // ----- PropertyNo ----- + if (xmlList[i].SelectNodes("name").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("name").Item(0).InnerText)) + { + string argstrInput11 = xmlList[i].SelectNodes("name").Item(0).InnerText; + dr["PropertyNo"] = modWS.CInput_Singlequotation(argstrInput11); + xmlList[i].SelectNodes("name").Item(0).InnerText = argstrInput11; + } + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%MOPropertyNoEmpty%]"); + } + + // ----- PropertyValue ----- + if (xmlList[i].SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("value").Item(0).InnerText)) + { + string argstrInput12 = xmlList[i].SelectNodes("value").Item(0).InnerText; + dr["PropertyValue"] = modWS.CInput_Singlequotation(argstrInput12); + xmlList[i].SelectNodes("value").Item(0).InnerText = argstrInput12; + } + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%MOPropertyValueEmpty%]"); + } + + // ----- DataType ----- + if (xmlList[i].SelectNodes("type").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("type").Item(0).InnerText)) + { + string argstrInput13 = xmlList[i].SelectNodes("type").Item(0).InnerText; + dr["DataType"] = modWS.CInput_Singlequotation(argstrInput13); + xmlList[i].SelectNodes("type").Item(0).InnerText = argstrInput13; + } + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%MOPropertyDataTypeEmpty%]"); + } + + if (errorFlag == false) + { + dtMOProperty.Rows.Add(dr); + } + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%MOPropertyError%]", stack: ex.StackTrace); + } + } + } + } + } + + if (strException.Count > 0) + goto exitFun; + + // KeyValue + strKeyValue = MONo; + + // '呼叫Dll執行 ----- UnitNo=UnitType=SystemUnit ----- + clsOE.editMO(MONo, MOQty, RONo, ItemNo, CustomerNo, MOTypeNo, Priority, PlanFinishDate, Creator, CreateDate, Description, dtMTL, strMessage, strException, strAlert, dtMOProperty, strERPMOLineNo, PropertyFlag, CustomerLotNo, PlanStartDate); + + // 判斷成功與否 + if (strException.Count > 0) + goto exitFun; + + strResult = "success"; + + exitFun: + ; + } + + + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%EditMOFail%]", stack: ex.StackTrace); + } + + finally + { + + // 將各部份之XML字串組起來並傳出 + string argReturnValue = null; + OutXml = modWS.CombineXMLResponse(strIdentity, argReturnValue, strException, strResult, strMessage); + + // 紀錄Transaction Log + clsERP.addTransactionLog_ErrorCode(modWS.GetXMLIdentityNode(xmlDoc, "transactionid"), modWS.GetXMLIdentityNode(xmlDoc, "moduleid"), modWS.GetXMLIdentityNode(xmlDoc, "functionid"), modWS.GetXMLIdentityNode(xmlDoc, "computername"), modWS.GetXMLIdentityNode(xmlDoc, "curuserno"), modWS.GetXMLIdentityNode(xmlDoc, "sendtime"), strResult, strKeyValue, strMessage, strException, InXml, OutXml, "EditMO", Conversions.ToInteger(ConfigurationManager.AppSettings["keepLog"]), Conversions.ToInteger(ConfigurationManager.AppSettings["keepXML"]), LogClass: "ERP"); + + funEditMORet = OutXml; + + } + + return funEditMORet; + + } + #endregion + + /// + /// 匹配你调试结构的API服务入参信息类 + /// + public class API_Base_ServiceInfo + { + public string ComputerName { get; set; } + public string CurUserNo { get; set; } + public string FunctionID { get; set; } + // 你需要取的目标属性1 + public string InJson { get; set; } + public string ModuleID { get; set; } + public string OutJson { get; set; } + public string PackageName { get; set; } + public DateTime SendTime { get; set; } + public int TargetType { get; set; } + public string TransactionId { get; set; } + // 你需要取的目标属性2 + public HttpRequestHeaders httpRequest { get; set; } + public int keepJson { get; set; } + } + public static string InvokeSrv_JsonToXml(object parameters) + { + string result = ""; + string transactionid = ""; + string moduleid = ""; + string functionid = ""; + string computername = ""; + string curuserno = ""; + string curusrpwd = "";//新增用户密码 SM2加密 + string sendtime = ""; + string languagemode = ""; + string outXml = ""; + string Json = ""; + + + + string ContentType = ""; + string SourceSystem = ""; + string TargetSystem = ""; + string Authorization = ""; + + try + { + //转换为数组 + if (parameters is object[] paramArray && paramArray.Length >= 2) + { + if (paramArray[1] is API_Base.ServiceInfo serviceInfo) + { + Json = serviceInfo.InJson; + string headerText = serviceInfo.httpRequest.ToString(); + + // 解析逻辑 + var lines = headerText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + Dictionary headers = new Dictionary(); + foreach (var line in lines) + { + int index = line.IndexOf(':'); + if (index > 0) + { + string key = line.Substring(0, index).Trim(); + string value = line.Substring(index + 1).Trim(); + headers[key] = value; + } + } + // 结果 + //curuserno = headers.TryGetValue("curuserno", out var no) ? no : ""; + //curusrpwd = headers.TryGetValue("curusrpwd", out var pwd) ? pwd : ""; + + + ContentType = headers.TryGetValue("Content-Type", out var contp) ? contp : ""; + SourceSystem = headers.TryGetValue("Source-System", out var sous) ? sous : ""; + TargetSystem = headers.TryGetValue("Target-System", out var tars) ? tars : ""; + Authorization = headers.TryGetValue("Authorization", out var auth) ? auth : ""; + + curusrpwd = Authorization; + + + + + + } + } + + XmlDocument xmlDoc = Newtonsoft.Json.JsonConvert.DeserializeXmlNode(Json); + + if (xmlDoc.GetElementsByTagName("transactionid").Count > 0) + transactionid = xmlDoc.GetElementsByTagName("transactionid")[0].InnerText; + if (xmlDoc.GetElementsByTagName("moduleid").Count > 0) + moduleid = xmlDoc.GetElementsByTagName("moduleid")[0].InnerText; + if (xmlDoc.GetElementsByTagName("computername").Count > 0) + computername = xmlDoc.GetElementsByTagName("computername")[0].InnerText; + if (xmlDoc.GetElementsByTagName("curuserno").Count > 0) + curuserno = xmlDoc.GetElementsByTagName("curuserno")[0].InnerText; + ////解析传入密码 + //if (xmlDoc.GetElementsByTagName("curusrpwd").Count > 0) + // curusrpwd = xmlDoc.GetElementsByTagName("curusrpwd")[0].InnerText; + + + if (xmlDoc.GetElementsByTagName("sendtime").Count > 0) + sendtime = xmlDoc.GetElementsByTagName("sendtime")[0].InnerText; + if (xmlDoc.GetElementsByTagName("languagemode").Count > 0) + languagemode = xmlDoc.GetElementsByTagName("languagemode")[0].InnerText; + + XmlNodeList temp = xmlDoc.GetElementsByTagName("functionid"); + XmlNode nFunctionId = temp.Count > 0 ? temp[0] : null; + if (nFunctionId == null) + throw new iMESException.MESException("0000-003000", "functionid Not Found"); + + if (curuserno == "") + { + throw new iMESException.MESException("0000-003000", "curuserno Not Found"); + } + + if (curusrpwd == "") + { + throw new iMESException.MESException("0000-003000", "curusrpwd Not Found"); + } + + + //if (ContentType == "") + //{ + // throw new iMESException.MESException("0000-003000", "ContentType Not Found"); + //} + + if (SourceSystem == "") + { + throw new iMESException.MESException("0000-003000", "SourceSystem Not Found"); + } + + if (TargetSystem == "") + { + throw new iMESException.MESException("0000-003000", "TargetSystem Not Found"); + } + + + functionid = nFunctionId.InnerText; + + //add by 14166 for 新增权限校验 + tcEAI_C.clsERP.funCheckUser(curuserno, curusrpwd); + + //alter by 14166 for 调整调用方式 + //仅支持标准接口客开 + + //MethodInfo mi = typeof(EAIws.wsERP).GetMethod(functionid, BindingFlags.Public | BindingFlags.Instance); + //System.Reflection.ConstructorInfo ctor = typeof(EAIws.wsERP).GetConstructor(Type.EmptyTypes); + + + ////调整支持新个案接口 + //MethodInfo mi = null; + //System.Reflection.ConstructorInfo ctor = null; + + //// 定义要搜索的类型顺序 + //Type[] searchTypes = { typeof(modERP), typeof(EAIws.wsERP) }; + //Type targetType = null; + + //foreach (Type type in searchTypes) + //{ + // mi = type.GetMethod(functionid, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + // if (mi != null) + // { + // targetType = type; + // break; + // } + //} + + //if (targetType == null) + //{ + // throw new iMESException.MESException("0000-003000", functionid + " [%INVOKE FAIL%]!"); + //} + + + + MethodInfo mi = null; + System.Reflection.ConstructorInfo ctor = null; + + + mi = typeof(modERP).GetMethod(functionid, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + if (mi == null) + { + mi = typeof(EAIws.wsERP).GetMethod(functionid, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + if (mi == null) + { + throw new iMESException.MESException("0000-003000", functionid + " [%INVOKE FAIL%]!"); + } + else + { + ctor = typeof(EAIws.wsERP).GetConstructor(Type.EmptyTypes); + object instance = ctor.Invoke(null); + outXml = mi.Invoke(instance, new object[] { xmlDoc.OuterXml }).ToString(); + } + } + else + { + outXml = mi.Invoke(null, new object[] { xmlDoc.OuterXml }).ToString(); + } + + + XmlDocument xmlDoc2 = new XmlDocument(); + xmlDoc2.LoadXml(outXml); + result = Newtonsoft.Json.JsonConvert.SerializeObject(xmlDoc2); + } + catch (Exception ex) + { + if (ex is TargetInvocationException && ex.InnerException != null) ex = ex.InnerException; + + Dictionary resultObj = new Dictionary(); + resultObj["response"] = new Dictionary(); + Dictionary response = resultObj["response"] as Dictionary; + response["identity"] = new Dictionary(); + response["exception"] = new Dictionary(); + response["returnvalue"] = ""; + response["result"] = "fail"; + Dictionary identity = ((resultObj["response"] as Dictionary)["identity"] as Dictionary); + identity["transactionid"] = transactionid; + identity["moduleid"] = moduleid; + identity["functionid"] = functionid; + identity["computername"] = computername; + identity["curuserno"] = curuserno; + identity["sendtime"] = sendtime; + identity["languagemode"] = languagemode; + Dictionary exception = ((resultObj["response"] as Dictionary)["exception"] as Dictionary); + exception["code"] = ex is iMESException.MESException ? (ex as iMESException.MESException).ErrorCode : "0000-999999"; + exception["sysmsg"] = ex.Message; + exception["mesmsg"] = ex.Message; + exception["stack"] = ex.StackTrace; + result = Newtonsoft.Json.JsonConvert.SerializeObject(resultObj); + } + + return result; + } + + + + + + + #region-----------add by 14166 for 新增人员接口----------- + public static string CreateUesr(string InXml) + { + string funAddUserRet = default(string); + System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); // 用以讀取Xml字串 + System.Xml.XmlNodeList xmlList; + + string OutXml = null; + + string strIdentity = string.Empty; // Identity XML字串 + string strResult = "fail"; // Result XML字串 + List strException = new List(); // Exception XML字串 + List strMessage = new List(); // Message XML字串 + string strKeyValue = string.Empty; // TransactionLot KeyValue + string strMode = string.Empty; // Mode + + try + { + try + { + xmlDoc.LoadXml(InXml); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, null, ex.Message, "[%InXmlError%]", ex.StackTrace); + goto exitFun; + } + + try + { + strIdentity = modWS.CombineXMLIdentity(xmlDoc); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, null, ex.Message, "[%IndentityError%]", ex.StackTrace); + goto exitFun; + } + + string UserNo = string.Empty;//用户编号 + string UserName = string.Empty;//用户名称 + string UserLevel = string.Empty;//用户等级 + + + string Creator = "ERP";//创建人 + string CreateDate = Conversions.ToString(DateTime.Now);//创建时间 + + string Description = string.Empty;//描述 + string IssueState = string.Empty;//签核状态 + + + + string ChangeDate = Conversions.ToString(DateTime.Now);//变更时间 + string ResetPassword = string.Empty;//第一次登录是否重设密码 + + string UserType = string.Empty;//用户类别 + string UserDP = string.Empty;//用户部门 + string UserEmail = string.Empty;//电子邮箱 + + + string Password = string.Empty;//密码 + + //DateTime InputDate = DateTime.Now; // Default Today + + // UserNo 必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("userno").Count > 0 && xmlDoc.GetElementsByTagName("userno").Item(0).SelectNodes("value").Count > 0) + UserNo = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("userno").Item(0).SelectNodes("value").Item(0).InnerText); + + if (UserNo == string.Empty) + clsERP.combineException(ref strException, null, null, "[%UserNoEmpty%%]"); + + // UserName 必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("username").Count > 0 && xmlDoc.GetElementsByTagName("username").Item(0).SelectNodes("value").Count > 0) + UserName = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("username").Item(0).SelectNodes("value").Item(0).InnerText); + + if (UserName == string.Empty) + clsERP.combineException(ref strException, null, null, "[%UserNameEmpty%%]"); + + // UserLevel 必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("userlevel").Count > 0 && xmlDoc.GetElementsByTagName("userlevel").Item(0).SelectNodes("value").Count > 0) + UserLevel = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("userlevel").Item(0).SelectNodes("value").Item(0).InnerText); + + if (UserLevel == string.Empty) + clsERP.combineException(ref strException, null, null, "[%UserLevelEmpty%%]"); + + + + // Password 必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("password").Count > 0 && xmlDoc.GetElementsByTagName("password").Item(0).SelectNodes("value").Count > 0) + Password = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("password").Item(0).SelectNodes("value").Item(0).InnerText); + + if (UserLevel == string.Empty) + clsERP.combineException(ref strException, null, null, "[%PasswordEmpty%%]"); + + + + // Creator 必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("creator").Count > 0 && xmlDoc.GetElementsByTagName("creator").Item(0).SelectNodes("value").Count > 0) + Creator = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("creator").Item(0).SelectNodes("value").Item(0).InnerText); + + // CreateDate 非必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("createdate").Count > 0 && xmlDoc.GetElementsByTagName("createdate").Item(0).SelectNodes("value").Count > 0) + CreateDate = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("createdate").Item(0).SelectNodes("value").Item(0).InnerText); + + // Description 必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("description").Count > 0 && xmlDoc.GetElementsByTagName("description").Item(0).SelectNodes("value").Count > 0) + Description = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("description").Item(0).SelectNodes("value").Item(0).InnerText); + + // IssueState 非必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("issuestate").Count > 0 && xmlDoc.GetElementsByTagName("issuestate").Item(0).SelectNodes("value").Count > 0) + IssueState = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("issuestate").Item(0).SelectNodes("value").Item(0).InnerText); + + // ChangeDate 必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("changedate").Count > 0 && xmlDoc.GetElementsByTagName("changedate").Item(0).SelectNodes("value").Count > 0) + ChangeDate = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("changedate").Item(0).SelectNodes("value").Item(0).InnerText); + + // ResetPassword 非必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("resetpassword").Count > 0 && xmlDoc.GetElementsByTagName("resetpassword").Item(0).SelectNodes("value").Count > 0) + ResetPassword = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("resetpassword").Item(0).SelectNodes("value").Item(0).InnerText); + + // UserType 非必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("usertype").Count > 0 && xmlDoc.GetElementsByTagName("usertype").Item(0).SelectNodes("value").Count > 0) + UserType = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("usertype").Item(0).SelectNodes("value").Item(0).InnerText); + + + + // UserEmail 邮件非必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("emailaddress").Count > 0 && xmlDoc.GetElementsByTagName("emailaddress").Item(0).SelectNodes("value").Count > 0) + UserEmail = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("emailaddress").Item(0).SelectNodes("value").Item(0).InnerText); + + // UserDP 部门非必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("departmentno").Count > 0 && xmlDoc.GetElementsByTagName("departmentno").Item(0).SelectNodes("value").Count > 0) + UserDP = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("departmentno").Item(0).SelectNodes("value").Item(0).InnerText); + + + + + + // 檢查必要性欄位 + if (strException.Count > 0) + goto exitFun; + //string UserNo = string.Empty;//用户编号 + //string UserName = string.Empty;//用户名称 + //string UserLevel = string.Empty;//用户等级 + + + //string Creator = "ERP";//创建人 + //string CreateDate = Conversions.ToString(DateTime.Now);//创建时间 + + //string Description = string.Empty;//描述 + //string IssueState = string.Empty;//签核状态 + + + + //string ChangeDate = string.Empty;//变更时间 + //string ResetPassword = string.Empty;//第一次登录是否重设密码 + + //string UserType = string.Empty;//用户类别 + //string UserDP = string.Empty;//用户部门 + //string UserEmail = string.Empty;//电子邮箱 + // KeyValue + strKeyValue = UserNo; + + clsERP.funAddUser(ref strMessage, ref strException, UserNo, UserName, UserLevel, Creator, CreateDate, Description, IssueState, ChangeDate, ResetPassword, UserType, UserDP, UserEmail, Password); + + // 判斷成功與否 + if (strException.Count > 0) + goto exitFun; + + strResult = "success"; + + + exitFun: + ; + } + catch (Exception ex) + { + clsERP.combineException(ref strException, null, ex.Message, "[%AddUserFail%]", ex.StackTrace); + } + finally + { + + // 將各部份之XML字串組起來並傳出 + OutXml = modWS.CombineXMLResponse(strIdentity, null, strException, strResult, strMessage); + + // 紀錄Transaction Log + clsERP.addTransactionLog_ErrorCode(modWS.GetXMLIdentityNode(xmlDoc, "transactionid"), modWS.GetXMLIdentityNode(xmlDoc, "moduleid"), modWS.GetXMLIdentityNode(xmlDoc, "functionid"), modWS.GetXMLIdentityNode(xmlDoc, "computername"), modWS.GetXMLIdentityNode(xmlDoc, "curuserno"), modWS.GetXMLIdentityNode(xmlDoc, "sendtime"), strResult, strKeyValue, strMessage, strException, InXml, OutXml, "AddUser(" + strMode + ")", Conversions.ToInteger(1), Conversions.ToInteger(1), LogClass: "ERP"); + + funAddUserRet = OutXml; + } + + return funAddUserRet; + } + + public static string DelUesr(string InXml) + { + string funAddUserRet = default(string); + System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); // 用以讀取Xml字串 + System.Xml.XmlNodeList xmlList; + + string OutXml = null; + + string strIdentity = string.Empty; // Identity XML字串 + string strResult = "fail"; // Result XML字串 + List strException = new List(); // Exception XML字串 + List strMessage = new List(); // Message XML字串 + string strKeyValue = string.Empty; // TransactionLot KeyValue + string strMode = string.Empty; // Mode + + try + { + try + { + xmlDoc.LoadXml(InXml); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, null, ex.Message, "[%InXmlError%]", ex.StackTrace); + goto exitFun; + } + + try + { + strIdentity = modWS.CombineXMLIdentity(xmlDoc); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, null, ex.Message, "[%IndentityError%]", ex.StackTrace); + goto exitFun; + } + + string UserNo = string.Empty;//用户编号 + string UserName = string.Empty;//用户名称 + string UserLevel = string.Empty;//用户等级 + + + string Creator = "ERP";//创建人 + string CreateDate = Conversions.ToString(DateTime.Now);//创建时间 + + string Description = string.Empty;//描述 + string IssueState = string.Empty;//签核状态 + + + + string ChangeDate = Conversions.ToString(DateTime.Now);//变更时间 + string ResetPassword = string.Empty;//第一次登录是否重设密码 + + string UserType = string.Empty;//用户类别 + string UserDP = string.Empty;//用户部门 + string UserEmail = string.Empty;//电子邮箱 + + + string Password = string.Empty;//密码 + + //DateTime InputDate = DateTime.Now; // Default Today + + // UserNo 必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("userno").Count > 0 && xmlDoc.GetElementsByTagName("userno").Item(0).SelectNodes("value").Count > 0) + UserNo = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("userno").Item(0).SelectNodes("value").Item(0).InnerText); + + if (UserNo == string.Empty) + clsERP.combineException(ref strException, null, null, "[%UserNoEmpty%%]"); + + // UserName 必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("username").Count > 0 && xmlDoc.GetElementsByTagName("username").Item(0).SelectNodes("value").Count > 0) + UserName = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("username").Item(0).SelectNodes("value").Item(0).InnerText); + + //if (UserName == string.Empty) + // clsERP.combineException(ref strException, null, null, "[%UserNameEmpty%%]"); + + // UserLevel 必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("userlevel").Count > 0 && xmlDoc.GetElementsByTagName("userlevel").Item(0).SelectNodes("value").Count > 0) + UserLevel = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("userlevel").Item(0).SelectNodes("value").Item(0).InnerText); + + //if (UserLevel == string.Empty) + // clsERP.combineException(ref strException, null, null, "[%UserLevelEmpty%%]"); + + + + // Password 必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("password").Count > 0 && xmlDoc.GetElementsByTagName("password").Item(0).SelectNodes("value").Count > 0) + Password = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("password").Item(0).SelectNodes("value").Item(0).InnerText); + + if (UserLevel == string.Empty) + clsERP.combineException(ref strException, null, null, "[%PasswordEmpty%%]"); + + + + // Creator 必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("creator").Count > 0 && xmlDoc.GetElementsByTagName("creator").Item(0).SelectNodes("value").Count > 0) + Creator = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("creator").Item(0).SelectNodes("value").Item(0).InnerText); + + // CreateDate 非必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("createdate").Count > 0 && xmlDoc.GetElementsByTagName("createdate").Item(0).SelectNodes("value").Count > 0) + CreateDate = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("createdate").Item(0).SelectNodes("value").Item(0).InnerText); + + // Description 必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("description").Count > 0 && xmlDoc.GetElementsByTagName("description").Item(0).SelectNodes("value").Count > 0) + Description = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("description").Item(0).SelectNodes("value").Item(0).InnerText); + + // IssueState 非必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("issuestate").Count > 0 && xmlDoc.GetElementsByTagName("issuestate").Item(0).SelectNodes("value").Count > 0) + IssueState = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("issuestate").Item(0).SelectNodes("value").Item(0).InnerText); + + // ChangeDate 必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("changedate").Count > 0 && xmlDoc.GetElementsByTagName("changedate").Item(0).SelectNodes("value").Count > 0) + ChangeDate = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("changedate").Item(0).SelectNodes("value").Item(0).InnerText); + + // ResetPassword 非必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("resetpassword").Count > 0 && xmlDoc.GetElementsByTagName("resetpassword").Item(0).SelectNodes("value").Count > 0) + ResetPassword = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("resetpassword").Item(0).SelectNodes("value").Item(0).InnerText); + + // UserType 非必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("usertype").Count > 0 && xmlDoc.GetElementsByTagName("usertype").Item(0).SelectNodes("value").Count > 0) + UserType = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("usertype").Item(0).SelectNodes("value").Item(0).InnerText); + + + + // UserEmail 邮件非必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("emailaddress").Count > 0 && xmlDoc.GetElementsByTagName("emailaddress").Item(0).SelectNodes("value").Count > 0) + UserEmail = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("emailaddress").Item(0).SelectNodes("value").Item(0).InnerText); + + // UserDP 部门非必要輸入 + if (xmlDoc.DocumentElement.GetElementsByTagName("departmentno").Count > 0 && xmlDoc.GetElementsByTagName("departmentno").Item(0).SelectNodes("value").Count > 0) + UserDP = modWS.CInput_Singlequotation(xmlDoc.DocumentElement.GetElementsByTagName("departmentno").Item(0).SelectNodes("value").Item(0).InnerText); + + + + + + // 檢查必要性欄位 + if (strException.Count > 0) + goto exitFun; + + // KeyValue + strKeyValue = UserNo; + + clsERP.funDelUser(ref strMessage, ref strException, UserNo, UserName, UserLevel, Creator, CreateDate, Description, IssueState, ChangeDate, ResetPassword, UserType, UserDP, UserEmail, Password); + + // 判斷成功與否 + if (strException.Count > 0) + goto exitFun; + + strResult = "success"; + + + exitFun: + ; + } + catch (Exception ex) + { + clsERP.combineException(ref strException, null, ex.Message, "[%DelUserFail%]", ex.StackTrace); + } + finally + { + + // 將各部份之XML字串組起來並傳出 + OutXml = modWS.CombineXMLResponse(strIdentity, null, strException, strResult, strMessage); + + // 紀錄Transaction Log + clsERP.addTransactionLog_ErrorCode(modWS.GetXMLIdentityNode(xmlDoc, "transactionid"), modWS.GetXMLIdentityNode(xmlDoc, "moduleid"), modWS.GetXMLIdentityNode(xmlDoc, "functionid"), modWS.GetXMLIdentityNode(xmlDoc, "computername"), modWS.GetXMLIdentityNode(xmlDoc, "curuserno"), modWS.GetXMLIdentityNode(xmlDoc, "sendtime"), strResult, strKeyValue, strMessage, strException, InXml, OutXml, "AddUser(" + strMode + ")", Conversions.ToInteger(1), Conversions.ToInteger(1), LogClass: "ERP"); + + funAddUserRet = OutXml; + } + + return funAddUserRet; + } + #endregion + + + #region --- 辅料调拨接口 --- + public static string AddMaterial_WIP(string InXml) + { + string funAddMaterial_WIP = default(string); + + var xmlDoc = new XmlDocument(); // 用以讀取Xml字串 + XmlNodeList xmlList; + string OutXml = null; + + string strIdentity = string.Empty; // Identity XML字串 + string strResult = "fail"; // Result XML字串 + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strKeyValue = string.Empty; // TransactionLot KeyValue + var strAlert = new List(); + + int Status = 0;//status:0为发料,1为退料 + + try + { + + try + { + // 讀取InXml字串 + xmlDoc.LoadXml(InXml); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%InXmlError%]", stack: ex.StackTrace); + goto exitFun; + } + + // 組Identity字串 + try + { + strIdentity = modWS.CombineXMLIdentity(xmlDoc); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%IndentityError%]", stack: ex.StackTrace); + goto exitFun; + } + + // ----- Material In List ----- + var dtMTL = new DataTable("MaterialTransferList"); + dtMTL.Columns.Add("Vendorno", Type.GetType("System.String")); + dtMTL.Columns.Add("MaterialNo", Type.GetType("System.String")); + dtMTL.Columns.Add("MaterialLotNo", Type.GetType("System.String")); + dtMTL.Columns.Add("MaterialUnitNo", Type.GetType("System.String")); + dtMTL.Columns.Add("TransferQty", Type.GetType("System.Decimal")); + dtMTL.Columns.Add("FromInventoryNo", Type.GetType("System.String")); + dtMTL.Columns.Add("FromLocatorNo", Type.GetType("System.String")); + dtMTL.Columns.Add("ToInventoryNo", Type.GetType("System.String")); + dtMTL.Columns.Add("ToLocatorNo", Type.GetType("System.String")); + + if (xmlDoc.GetElementsByTagName("materialtransferlist").Count > 0) + { + if (xmlDoc.GetElementsByTagName("materialtransferlist").Item(0).SelectNodes("value").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("materialtransferlist").Item(0).SelectNodes("value"); + if (xmlList.Count == 0) + { + clsERP.combineException(ref strException, mesmsg: "[%MaterialListNotExist%]"); + + } + else + { + DataRow dr; + bool errorFlag = false; + for (int i = 0, loopTo = xmlList.Count - 1; i <= loopTo; i++) + { + errorFlag = false; + + try + { + dr = dtMTL.NewRow(); + + + // ----- Vendorno ----- + if (xmlList[i].SelectNodes("vendorno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("vendorno").Item(0).InnerText)) + + { + dr["Vendorno"] = modWS.CInput_Singlequotation(xmlList[i].SelectNodes("vendorno").Item(0).InnerText).ToString(); + } + + // ----- MaterialNo ----- + if (xmlList[i].SelectNodes("materialno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("materialno").Item(0).InnerText)) + { + dr["MaterialNo"] = modWS.CInput_Singlequotation(xmlList[i].SelectNodes("materialno").Item(0).InnerText).ToString().ToUpper(); + } + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%MaterialNoEmpty%]"); + } + + // ----- MaterialLotNo ----- + if (xmlList[i].SelectNodes("materiallotno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("materiallotno").Item(0).InnerText)) + + { + dr["MaterialLotNo"] = modWS.CInput_Singlequotation(xmlList[i].SelectNodes("materiallotno").Item(0).InnerText).ToString(); + } + + + // ----- MaterialUnitNo ----- + if (xmlList[i].SelectNodes("materialunitno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("materialunitno").Item(0).InnerText)) + { + string argstrInput = xmlList[i].SelectNodes("materialunitno").Item(0).InnerText; + dr["MaterialUnitNo"] = modWS.CInput_Singlequotation(argstrInput); + xmlList[i].SelectNodes("materialunitno").Item(0).InnerText = argstrInput; + } + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%MaterialUnitNoEmpty%]"); + } + + // ----- TransferQty ----- + if (xmlList[i].SelectNodes("transferqty").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("transferqty").Item(0).InnerText) && Information.IsNumeric(xmlList[i].SelectNodes("transferqty").Item(0).InnerText) == true) + + { + dr["TransferQty"] = Convert.ToDecimal(xmlList[i].SelectNodes("transferqty").Item(0).InnerText); + //if (Mode == 2 || Mode == 4) + //{ + // // 還原發料或還原退料時將Qty改為負 + // dr["Qty"] = -Convert.ToDecimal(dr["Qty"]); + //} + } + else + { + errorFlag = true; + clsERP.combineException(ref strException, mesmsg: "[%TransferQtyEmtpy%]"); + } + + // ----- FromInventoryNo ----- + if (xmlList[i].SelectNodes("frominventoryno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("frominventoryno").Item(0).InnerText)) + + { + dr["FromInventoryNo"] = modWS.CInput_Singlequotation(xmlList[i].SelectNodes("frominventoryno").Item(0).InnerText).ToString(); + } + + // ----- FromLocatorNo ----- + dr["FromLocatorNo"] = "N/A"; + + // ----- ToInventoryNo ----- + if (xmlList[i].SelectNodes("toinventoryno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("toinventoryno").Item(0).InnerText)) + + { + dr["ToInventoryNo"] = modWS.CInput_Singlequotation(xmlList[i].SelectNodes("toinventoryno").Item(0).InnerText).ToString(); + } + + // ----- ToLocatorNo ----- + dr["ToLocatorNo"] = "N/A"; + + if (errorFlag == false) + { + dtMTL.Rows.Add(dr); + } + } + catch (Exception ex) + { + switch (Status) + { + case 0: + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%MaterialTransferListFail%]", stack: ex.StackTrace); // 发料错误 + break; + } + case 1: + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%MaterialTransferListFail%]", stack: ex.StackTrace); // 退料错误 + break; + } + } + + } + + } + + } + } + + + } + + + string SubInventoryTransferNo = string.Empty; + string Description = string.Empty; + string Creator = string.Empty; + var Createdate = DateTime.Now; + + // SubInventoryTransferNo + if (xmlDoc.DocumentElement.GetElementsByTagName("subinventorytransferno").Count > 0 && xmlDoc.GetElementsByTagName("subinventorytransferno").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("subinventorytransferno").Item(0).SelectNodes("value").Item(0).InnerText)) + { + string argstrInput = xmlDoc.DocumentElement.GetElementsByTagName("subinventorytransferno").Item(0).SelectNodes("value").Item(0).InnerText; + SubInventoryTransferNo = modWS.CInput_Singlequotation(argstrInput); + xmlDoc.DocumentElement.GetElementsByTagName("subinventorytransferno").Item(0).SelectNodes("value").Item(0).InnerText = argstrInput; + } + + // Description + if (xmlDoc.DocumentElement.GetElementsByTagName("description").Count > 0 && xmlDoc.GetElementsByTagName("description").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("description").Item(0).SelectNodes("value").Item(0).InnerText)) + { + Description = xmlDoc.DocumentElement.GetElementsByTagName("description").Item(0).SelectNodes("value").Item(0).InnerText; + } + + // Creator + if (xmlDoc.DocumentElement.GetElementsByTagName("creator").Count > 0 && xmlDoc.GetElementsByTagName("creator").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("creator").Item(0).SelectNodes("value").Item(0).InnerText)) + { + Creator = xmlDoc.DocumentElement.GetElementsByTagName("creator").Item(0).SelectNodes("value").Item(0).InnerText; + } + + // ToDateTime + if (xmlDoc.DocumentElement.GetElementsByTagName("createdate").Count > 0 && xmlDoc.GetElementsByTagName("createdate").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("createdate").Item(0).SelectNodes("value").Item(0).InnerText)) + { + Createdate = Convert.ToDateTime(xmlDoc.DocumentElement.GetElementsByTagName("createdate").Item(0).SelectNodes("value").Item(0).InnerText); + } + + // Status + if (xmlDoc.DocumentElement.GetElementsByTagName("status").Count > 0 && xmlDoc.GetElementsByTagName("status").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("status").Item(0).SelectNodes("value").Item(0).InnerText)) + { + Status = Convert.ToInt32(xmlDoc.DocumentElement.GetElementsByTagName("status").Item(0).SelectNodes("value").Item(0).InnerText); + } + + // 檢查必要性欄位 + if (string.IsNullOrEmpty(SubInventoryTransferNo)) + clsERP.combineException(ref strException, mesmsg: "[%SubInventoryTransferNoEmpty%]"); + if (string.IsNullOrEmpty(Status.ToString())) + clsERP.combineException(ref strException, mesmsg: "[%StatusEmpty%]"); + if (strException.Count > 0) + goto exitFun; + + // KeyValue + strKeyValue = SubInventoryTransferNo; + + // '呼叫Dll執行 ----- UnitNo=UnitType=SystemUnit ----- + tcEAI_C.clsERP.funAddMaterial_WIP(SubInventoryTransferNo, Description, Creator, Status, Createdate, dtMTL, strMessage, strException, strAlert); + + // 判斷成功與否 + if (strException.Count > 0) + goto exitFun; + + strResult = "success"; + + exitFun: + ; + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%AddMaterial_WIPFail%]", stack: ex.StackTrace); + } + finally + { + // 將各部份之XML字串組起來並傳出 + string argReturnValue = null; + OutXml = modWS.CombineXMLResponse(strIdentity, argReturnValue, strException, strResult, strMessage); + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(modWS.GetXMLIdentityNode(xmlDoc, "transactionid"), modWS.GetXMLIdentityNode(xmlDoc, "moduleid"), modWS.GetXMLIdentityNode(xmlDoc, "functionid"), modWS.GetXMLIdentityNode(xmlDoc, "computername"), modWS.GetXMLIdentityNode(xmlDoc, "curuserno"), modWS.GetXMLIdentityNode(xmlDoc, "sendtime"), strResult, strKeyValue, strMessage, strException, InXml, OutXml, "AddMaterial_WIP", Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), LogClass: "ERP"); + funAddMaterial_WIP = OutXml; + + } + + return funAddMaterial_WIP; + + } + #endregion + + #region 更新MES箱状态接口 + public static string UpdateMESCarrier(string InXml) + { + string UpdateMESCarrier = default(string); + var xmlDoc = new XmlDocument(); // 用以讀取Xml字串 + XmlNodeList xmlList; + string OutXml = null; + string strIdentity = string.Empty; // Identity XML字串 + string strResult = "fail"; // Result XML字串 + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strKeyValue = string.Empty; // TransactionLot KeyValue + string dbCode = ""; + string execType = ""; + string Type = ""; + string Barcode = ""; + try + { + + try + { + // 讀取InXml字串 + xmlDoc.LoadXml(InXml); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%InXmlError%]", stack: ex.StackTrace); + goto exitFun; + } + + // 組Identity字串 + try + { + strIdentity = modWS.CombineXMLIdentity(xmlDoc); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%IndentityError%]", stack: ex.StackTrace); + goto exitFun; + } + + if (xmlDoc.DocumentElement.GetElementsByTagName("dbcode").Count > 0 && xmlDoc.GetElementsByTagName("dbcode").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("dbcode").Item(0).SelectNodes("value").Item(0).InnerText)) + { + dbCode = xmlDoc.DocumentElement.GetElementsByTagName("dbcode").Item(0).SelectNodes("value").Item(0).InnerText; + } + + if (xmlDoc.DocumentElement.GetElementsByTagName("exectype").Count > 0 && xmlDoc.GetElementsByTagName("exectype").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("exectype").Item(0).SelectNodes("value").Item(0).InnerText)) + { + execType = xmlDoc.DocumentElement.GetElementsByTagName("exectype").Item(0).SelectNodes("value").Item(0).InnerText; + } + + if (xmlDoc.DocumentElement.GetElementsByTagName("type").Count > 0 && xmlDoc.GetElementsByTagName("type").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("type").Item(0).SelectNodes("value").Item(0).InnerText)) + { + Type = xmlDoc.DocumentElement.GetElementsByTagName("type").Item(0).SelectNodes("value").Item(0).InnerText; + } + + if (xmlDoc.DocumentElement.GetElementsByTagName("barcode").Count > 0 && xmlDoc.GetElementsByTagName("barcode").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("barcode").Item(0).SelectNodes("value").Item(0).InnerText)) + { + Barcode = xmlDoc.DocumentElement.GetElementsByTagName("barcode").Item(0).SelectNodes("value").Item(0).InnerText; + } + + // 檢查必要性欄位 + if (string.IsNullOrEmpty(dbCode)) + clsERP.combineException(ref strException, mesmsg: "[%dbCodeEmpty%]"); + if (string.IsNullOrEmpty(execType)) + clsERP.combineException(ref strException, mesmsg: "[%execTypeEmpty%]"); + if (string.IsNullOrEmpty(Type)) + clsERP.combineException(ref strException, mesmsg: "[%TypeEmpty%]"); + if (string.IsNullOrEmpty(Barcode)) + clsERP.combineException(ref strException, mesmsg: "[%BarcodeEmpty%]"); + if (strException.Count > 0) + goto exitFun; + + // '呼叫Dll執行 ----- UnitNo=UnitType=SystemUnit ----- + + + // 判斷成功與否 + if (strException.Count > 0) + goto exitFun; + + strResult = "success"; + + exitFun: + ; + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%AddMaterial_WIPFail%]", stack: ex.StackTrace); + } + finally + { + // 將各部份之XML字串組起來並傳出 + string argReturnValue = null; + OutXml = modWS.CombineXMLResponse(strIdentity, argReturnValue, strException, strResult, strMessage); + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(modWS.GetXMLIdentityNode(xmlDoc, "transactionid"), modWS.GetXMLIdentityNode(xmlDoc, "moduleid"), modWS.GetXMLIdentityNode(xmlDoc, "functionid"), modWS.GetXMLIdentityNode(xmlDoc, "computername"), modWS.GetXMLIdentityNode(xmlDoc, "curuserno"), modWS.GetXMLIdentityNode(xmlDoc, "sendtime"), strResult, strKeyValue, strMessage, strException, InXml, OutXml, "AddMaterial_WIP", Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), LogClass: "ERP"); + UpdateMESCarrier = OutXml; + + } + + return UpdateMESCarrier; + } + #endregion + + #region 湿敏接口 + public static string UpdateMaterialSM(string InXml) + { + string UpdateMaterialSM = default(string); + + var xmlDoc = new XmlDocument(); // 用以讀取Xml字串 + XmlNodeList xmlList; + string OutXml = null; + + string strIdentity = string.Empty; // Identity XML字串 + string strResult = "fail"; // Result XML字串 + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strKeyValue = string.Empty; // TransactionLot KeyValue + DataRow drData; + string Factory = ""; + DataTable dtData = new DataTable(); + try + { + + try + { + // 讀取InXml字串 + xmlDoc.LoadXml(InXml); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%InXmlError%]", stack: ex.StackTrace); + goto exitFun; + } + + // 組Identity字串 + try + { + strIdentity = modWS.CombineXMLIdentity(xmlDoc); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%IndentityError%]", stack: ex.StackTrace); + goto exitFun; + } + + if (xmlDoc.DocumentElement.GetElementsByTagName("Factory").Count > 0 && xmlDoc.GetElementsByTagName("Factory").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("Factory").Item(0).SelectNodes("value").Item(0).InnerText)) + { + Factory = xmlDoc.DocumentElement.GetElementsByTagName("Factory").Item(0).SelectNodes("value").Item(0).InnerText; + } + + dtData.Columns.Add("REELID", Type.GetType("System.String")); + dtData.Columns.Add("STATUS", Type.GetType("System.String")); + dtData.Columns.Add("OPENDATETIME", Type.GetType("System.DateTime")); + dtData.Columns.Add("CLOSEDATETIME", Type.GetType("System.DateTime")); + dtData.Columns.Add("OPENUSER", Type.GetType("System.String")); + dtData.Columns.Add("CLOSEUSER", Type.GetType("System.String")); + dtData.Columns.Add("INTERVALTIME", Type.GetType("System.String")); + if (xmlDoc.DocumentElement.GetElementsByTagName("Detail").Count > 0) + { + if (xmlDoc.GetElementsByTagName("Detail").Item(0).SelectNodes("msdinfo").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("Detail").Item(0).SelectNodes("msdinfo"); + var loopTo = xmlList.Count - 1; + for (int i = 0; i <= loopTo; i++) + { + if (xmlList[i].SelectNodes("REELID").Count == 0 | xmlList[i].SelectNodes("STATUS").Count == 0 | xmlList[i].SelectNodes("OPENDATETIME").Count == 0 | xmlList[i].SelectNodes("CLOSEDATETIME").Count == 0 | xmlList[i].SelectNodes("OPENUSER").Count == 0 | xmlList[i].SelectNodes("CLOSEUSER").Count == 0 | xmlList[i].SelectNodes("INTERVALTIME").Count == 0) + { + throw new iMESException.MESException("0000-200001", "REELID,STATUS,OPENDATETIME,CLOSEDATETIME,OPENUSER,CLOSEUSER,INTERVALTIME can not empty!"); + } + drData = dtData.NewRow(); + drData["REELID"] = xmlList[i].SelectNodes("REELID").Item(0).InnerText; + drData["STATUS"] = xmlList[i].SelectNodes("STATUS").Item(0).InnerText; + drData["OPENDATETIME"] = Convert.ToDateTime(xmlList[i].SelectNodes("OPENDATETIME").Item(0).InnerText); + drData["CLOSEDATETIME"] = Convert.ToDateTime(xmlList[i].SelectNodes("CLOSEDATETIME").Item(0).InnerText); + drData["OPENUSER"] = xmlList[i].SelectNodes("OPENUSER").Item(0).InnerText; + drData["CLOSEUSER"] = xmlList[i].SelectNodes("CLOSEUSER").Item(0).InnerText; + drData["INTERVALTIME"] = xmlList[i].SelectNodes("INTERVALTIME").Item(0).InnerText; + dtData.Rows.Add(drData); + } + } + } + + // 檢查必要性欄位 + if (string.IsNullOrEmpty(Factory)) + clsERP.combineException(ref strException, mesmsg: "[%FactoryEmpty%]"); + if (strException.Count > 0) + goto exitFun; + + // KeyValue + strKeyValue = Factory; + + // 判斷成功與否 + if (strException.Count > 0) + goto exitFun; + + strResult = "success"; + + exitFun: + ; + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%AddMaterial_WIPFail%]", stack: ex.StackTrace); + } + finally + { + // 將各部份之XML字串組起來並傳出 + string argReturnValue = null; + OutXml = modWS.CombineXMLResponse(strIdentity, argReturnValue, strException, strResult, strMessage); + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(modWS.GetXMLIdentityNode(xmlDoc, "transactionid"), modWS.GetXMLIdentityNode(xmlDoc, "moduleid"), modWS.GetXMLIdentityNode(xmlDoc, "functionid"), modWS.GetXMLIdentityNode(xmlDoc, "computername"), modWS.GetXMLIdentityNode(xmlDoc, "curuserno"), modWS.GetXMLIdentityNode(xmlDoc, "sendtime"), strResult, strKeyValue, strMessage, strException, InXml, OutXml, "AddMaterial_WIP", Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), LogClass: "ERP"); + UpdateMaterialSM = OutXml; + + } + + return UpdateMaterialSM; + } + #endregion + + #region MES退料接口 + public static string funMaterialReturn(string InXml) + { + string funMaterialReturn = default(string); + + var xmlDoc = new XmlDocument(); // 用以讀取Xml字串 + XmlNodeList xmlList; + string OutXml = null; + + string strIdentity = string.Empty; // Identity XML字串 + string strResult = "fail"; // Result XML字串 + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strKeyValue = string.Empty; // TransactionLot KeyValue + DataRow drData; + string Factory = ""; + DataTable dtData = new DataTable(); + DataTable dtDataTemp = new DataTable(); + string mocode = ""; + string mvdcode = ""; + string fromstorage = ""; + string tostorage = ""; + string usercode = ""; + string mdate = ""; + string mtime = ""; + try + { + + try + { + // 讀取InXml字串 + xmlDoc.LoadXml(InXml); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%InXmlError%]", stack: ex.StackTrace); + goto exitFun; + } + + // 組Identity字串 + try + { + strIdentity = modWS.CombineXMLIdentity(xmlDoc); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%IndentityError%]", stack: ex.StackTrace); + goto exitFun; + } + + + + if (xmlDoc.DocumentElement.GetElementsByTagName("Factory").Count > 0 && xmlDoc.GetElementsByTagName("Factory").Item(0).SelectNodes("value").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("Factory").Item(0).SelectNodes("value").Item(0).InnerText)) + { + Factory = xmlDoc.DocumentElement.GetElementsByTagName("Factory").Item(0).SelectNodes("value").Item(0).InnerText; + } + + if (xmlDoc.DocumentElement.GetElementsByTagName("Detail").Count > 0 && xmlDoc.GetElementsByTagName("Detail").Item(0).SelectNodes("mcode").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("Detail").Item(0).SelectNodes("mcode").Item(0).InnerText)) + { + mocode = xmlDoc.DocumentElement.GetElementsByTagName("Detail").Item(0).SelectNodes("mocode").Item(0).InnerText; + } + if (xmlDoc.DocumentElement.GetElementsByTagName("Detail").Count > 0 && xmlDoc.GetElementsByTagName("Detail").Item(0).SelectNodes("mcode").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("Detail").Item(0).SelectNodes("mvdcode").Item(0).InnerText)) + { + mvdcode = xmlDoc.DocumentElement.GetElementsByTagName("Detail").Item(0).SelectNodes("mvdcode").Item(0).InnerText; + } + if (xmlDoc.DocumentElement.GetElementsByTagName("Detail").Count > 0 && xmlDoc.GetElementsByTagName("Detail").Item(0).SelectNodes("mcode").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("Detail").Item(0).SelectNodes("fromstorage").Item(0).InnerText)) + { + fromstorage = xmlDoc.DocumentElement.GetElementsByTagName("Detail").Item(0).SelectNodes("fromstorage").Item(0).InnerText; + } + if (xmlDoc.DocumentElement.GetElementsByTagName("Detail").Count > 0 && xmlDoc.GetElementsByTagName("Detail").Item(0).SelectNodes("mcode").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("Detail").Item(0).SelectNodes("tostorage").Item(0).InnerText)) + { + tostorage = xmlDoc.DocumentElement.GetElementsByTagName("Detail").Item(0).SelectNodes("tostorage").Item(0).InnerText; + } + if (xmlDoc.DocumentElement.GetElementsByTagName("Detail").Count > 0 && xmlDoc.GetElementsByTagName("Detail").Item(0).SelectNodes("mcode").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("Detail").Item(0).SelectNodes("usercode").Item(0).InnerText)) + { + usercode = xmlDoc.DocumentElement.GetElementsByTagName("Detail").Item(0).SelectNodes("usercode").Item(0).InnerText; + } + if (xmlDoc.DocumentElement.GetElementsByTagName("Detail").Count > 0 && xmlDoc.GetElementsByTagName("Detail").Item(0).SelectNodes("mcode").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("Detail").Item(0).SelectNodes("mdate").Item(0).InnerText)) + { + mdate = xmlDoc.DocumentElement.GetElementsByTagName("Detail").Item(0).SelectNodes("mdate").Item(0).InnerText; + } + if (xmlDoc.DocumentElement.GetElementsByTagName("Detail").Count > 0 && xmlDoc.GetElementsByTagName("Detail").Item(0).SelectNodes("mcode").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("Detail").Item(0).SelectNodes("mtime").Item(0).InnerText)) + { + mtime = xmlDoc.DocumentElement.GetElementsByTagName("Detail").Item(0).SelectNodes("mtime").Item(0).InnerText; + } + + dtData.Columns.Add("MCODE", Type.GetType("System.String")); + dtData.Columns.Add("QTY", Type.GetType("System.String")); + if (xmlDoc.DocumentElement.GetElementsByTagName("Detail").Count > 0) + { + if (xmlDoc.GetElementsByTagName("Detail").Item(0).SelectNodes("mlist").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("Detail").Item(0).SelectNodes("mlist"); + var loopTo = xmlList.Count - 1; + for (int i = 0; i <= loopTo; i++) + { + if (xmlList[i].SelectNodes("MCODE").Count == 0 | xmlList[i].SelectNodes("QTY").Count == 0) + { + throw new iMESException.MESException("0000-200001", "MCODE,QTY can not empty!"); + } + drData = dtData.NewRow(); + drData["MCODE"] = xmlList[i].SelectNodes("MCODE").Item(0).InnerText; + drData["QTY"] = xmlList[i].SelectNodes("QTY").Item(0).InnerText; + dtData.Rows.Add(drData); + } + } + } + + dtDataTemp.Columns.Add("REELID", Type.GetType("System.String")); + dtDataTemp.Columns.Add("MCODE", Type.GetType("System.String")); + dtDataTemp.Columns.Add("QTY", Type.GetType("System.String")); + if (xmlDoc.DocumentElement.GetElementsByTagName("Detail").Count > 0) + { + if (xmlDoc.GetElementsByTagName("Detail").Item(0).SelectNodes("reelinfo").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("Detail").Item(0).SelectNodes("reelinfo"); + var loopTo = xmlList.Count - 1; + for (int i = 0; i <= loopTo; i++) + { + if (xmlList[i].SelectNodes("MCODE").Count == 0 | xmlList[i].SelectNodes("QTY").Count == 0 | xmlList[i].SelectNodes("REELID").Count == 0) + { + throw new iMESException.MESException("0000-200001", "REELID,MCODE,QTY can not empty!"); + } + drData = dtDataTemp.NewRow(); + drData["REELID"] = xmlList[i].SelectNodes("REELID").Item(0).InnerText; + drData["MCODE"] = xmlList[i].SelectNodes("MCODE").Item(0).InnerText; + drData["QTY"] = xmlList[i].SelectNodes("QTY").Item(0).InnerText; + dtDataTemp.Rows.Add(drData); + } + } + } + + // 檢查必要性欄位 + if (string.IsNullOrEmpty(Factory)) + clsERP.combineException(ref strException, mesmsg: "[%FactoryEmpty%]"); + if (strException.Count > 0) + goto exitFun; + + // KeyValue + strKeyValue = Factory; + + // '呼叫Dll執行 ----- UnitNo=UnitType=SystemUnit ----- + + + // 判斷成功與否 + if (strException.Count > 0) + goto exitFun; + + strResult = "success"; + + exitFun: + ; + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%AddMaterial_WIPFail%]", stack: ex.StackTrace); + } + finally + { + // 將各部份之XML字串組起來並傳出 + string argReturnValue = null; + OutXml = modWS.CombineXMLResponse(strIdentity, argReturnValue, strException, strResult, strMessage); + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(modWS.GetXMLIdentityNode(xmlDoc, "transactionid"), modWS.GetXMLIdentityNode(xmlDoc, "moduleid"), modWS.GetXMLIdentityNode(xmlDoc, "functionid"), modWS.GetXMLIdentityNode(xmlDoc, "computername"), modWS.GetXMLIdentityNode(xmlDoc, "curuserno"), modWS.GetXMLIdentityNode(xmlDoc, "sendtime"), strResult, strKeyValue, strMessage, strException, InXml, OutXml, "AddMaterial_WIP", Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), LogClass: "ERP"); + funMaterialReturn = OutXml; + + } + + return funMaterialReturn; + } + #endregion + + //#region Reel校验接口 + ////public static string CheckReelQty(string jsonInput) + ////{ + //// JObject response = new JObject(); + //// try + //// { + //// JObject requestJson = JObject.Parse(jsonInput); + //// string factory = (string)requestJson["Data"]?["Factory"]; + //// string reelId = (string)requestJson["Data"]?["Detail"]?["REELID"]; + //// string qty = (string)requestJson["Data"]?["Detail"]?["QTY"]; + //// bool isSuccess = true; + + //// if (isSuccess) + //// { + //// response["result"] = 1; + //// response["qty"] = qty; + //// response["mcode"] = "111"; + //// response["vendorcode"] = "123456"; + //// response["vendordate"] = "20240512"; + //// response["manufacturer"] = "龙旗"; + //// response["vendorlotno"] = "123"; + //// response["oraFacReel"] = "12"; + //// response["snscale"] = "09"; + //// response["mpn"] = ""; + //// response["produceArea"] = ""; + //// response["cnum"] = 0; + //// response["msg"] = null; + //// } + //// else + //// { + //// response["result"] = 0; + //// response["msg"] = $"未找到该料卷{reelId}"; + //// response["qty"] = ""; + //// } + //// } + //// catch (Exception ex) + //// { + //// response["result"] = 0; + //// response["msg"] = "解析异常或系统错误: " + ex.Message; + //// response["qty"] = ""; + + //// // 此处可以加上你原来的记录 Log 的代码 + //// } + + //// return response.ToString(Newtonsoft.Json.Formatting.None ); + ////} + + //public static string CheckReelQty(object input) + //{ + // JObject response = new JObject(); + // string Json = ""; + // var strException = new List(); // Exception XML字串 + // var strMessage = new List(); // Message XML字串 + // try + // { + // if (input is object[] paramArray && paramArray.Length >= 2) + // { + // if (paramArray[1] is API_Base.ServiceInfo serviceInfo) + // { + // Json = serviceInfo.InJson; + // //JObject requestJson = JObject.FromObject(input); + // JObject requestJson = JObject.Parse(Json); + // string factory = requestJson["Data"]?["Factory"]?.ToString(); + // string reelId = requestJson["Data"]?["Detail"]?["REELID"]?.ToString(); + // string qty = requestJson["Data"]?["Detail"]?["QTY"]?.ToString(); + // string STORAGECODE = requestJson["Data"]?["Detail"]?["STORAGECODE"]?.ToString(); + + // // 逻辑判断(这里保持你原有的逻辑) + // //clsERP.CheckReelQty() + // bool isSuccess = true; + // string mcode = ""; + // string qty1 = ""; + // isSuccess = clsERP.CheckReelQty(ref strException, ref strMessage, reelId,ref mcode,ref qty1); + // if (isSuccess) + // { + // response["result"] = 1; + // response["qty"] = qty1; + // response["mcode"] = mcode; + // response["vendorcode"] = "123456"; + // response["vendordate"] = DateTime.Now.ToString("yyyy-MM-dd"); + // response["manufacturer"] = "龙旗"; + // response["vendorlotno"] = "123"; + // response["oraFacReel"] = reelId; + // response["snscale"] = "09"; + // response["mpn"] = ""; + // response["produceArea"] = ""; + // response["cnum"] = 0; + // response["msg"] = null; + // } + // else + // { + // response["result"] = 0; + // response["msg"] = $"未找到该料卷{reelId}"; + // response["qty"] = ""; + // } + // } + // } + // } + // catch (Exception ex) + // { + // response["result"] = 0; + // response["msg"] = "数据解析异常或系统错误: " + ex.Message; + // response["qty"] = ""; + // // Log.Error(ex); + // } + + // return response.ToString(Newtonsoft.Json.Formatting.None); + //} + //#endregion + + + + #region 电子料仓发料明细数据回传(按销售订单回传) + public static string SendMaterial_RAW(string InXml) + { + string SendMaterial_RAWs = default(string); + + var xmlDoc = new XmlDocument(); // 用以讀取Xml字串 + XmlNodeList xmlList; + string OutXml = null; + + string strIdentity = string.Empty; // Identity XML字串 + string strResult = "fail"; // Result XML字串 + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strKeyValue = string.Empty; // TransactionLot KeyValue + DataRow drData; + string Factory = ""; + DataTable dtData = new DataTable(); + try + { + + try + { + // 讀取InXml字串 + xmlDoc.LoadXml(InXml); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%InXmlError%]", stack: ex.StackTrace); + goto exitFun; + } + + // 組Identity字串 + try + { + strIdentity = modWS.CombineXMLIdentity(xmlDoc); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%IndentityError%]", stack: ex.StackTrace); + goto exitFun; + } + + if (xmlDoc.DocumentElement.GetElementsByTagName("Factory").Count > 0 && !string.IsNullOrEmpty(xmlDoc.DocumentElement.GetElementsByTagName("Factory").Item(0).InnerText)) + { + Factory = xmlDoc.DocumentElement.GetElementsByTagName("Factory").Item(0).InnerText; + } + + dtData.Columns.Add("RECEIPTNO", Type.GetType("System.String")); + dtData.Columns.Add("RECEIPTLINE", Type.GetType("System.String")); + dtData.Columns.Add("STORAGECODE", Type.GetType("System.String")); + dtData.Columns.Add("MCODE", Type.GetType("System.String")); + dtData.Columns.Add("MNAME", Type.GetType("System.String")); + dtData.Columns.Add("REELID", Type.GetType("System.String")); + dtData.Columns.Add("DATECODE", Type.GetType("System.String")); + + dtData.Columns.Add("SNSCALE", Type.GetType("System.String")); + dtData.Columns.Add("VENDERDATE", Type.GetType("System.String")); + dtData.Columns.Add("VENDORCODE", Type.GetType("System.String")); + dtData.Columns.Add("VENDORITEMCODE", Type.GetType("System.String")); + dtData.Columns.Add("VENDERLOTNO", Type.GetType("System.String")); + dtData.Columns.Add("MANUFACTURER", Type.GetType("System.String")); + dtData.Columns.Add("EXDATE", Type.GetType("System.String")); + dtData.Columns.Add("QTY", Type.GetType("System.String")); + dtData.Columns.Add("USERCODE", Type.GetType("System.String")); + + dtData.Columns.Add("MDATE", Type.GetType("System.String")); + dtData.Columns.Add("MTIME", Type.GetType("System.String")); + + + if (xmlDoc.DocumentElement.GetElementsByTagName("Detail").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("Detail"); + var loopTo = xmlList.Count - 1; + for (int i = 0; i <= loopTo; i++) + { + if (xmlList[i].SelectNodes("RECEIPTNO").Count == 0 | xmlList[i].SelectNodes("RECEIPTLINE").Count == 0 | xmlList[i].SelectNodes("STORAGECODE").Count == 0 | xmlList[i].SelectNodes("REELID").Count == 0 | xmlList[i].SelectNodes("DATECODE").Count == 0 | xmlList[i].SelectNodes("VENDERDATE").Count == 0 | xmlList[i].SelectNodes("VENDERLOTNO").Count == 0 | + xmlList[i].SelectNodes("MANUFACTURER").Count == 0 | xmlList[i].SelectNodes("EXDATE").Count == 0 | xmlList[i].SelectNodes("QTY").Count == 0 | xmlList[i].SelectNodes("USERCODE").Count == 0 | xmlList[i].SelectNodes("MDATE").Count == 0 | xmlList[i].SelectNodes("MTIME").Count == 0) + { + throw new iMESException.MESException("0000-200001", "RECEIPTNO,RECEIPTLINE,STORAGECODE,REELID,VENDERDATE,VENDERLOTNO,MANUFACTURER,EXDATE,QTY,USERCODE,MDATE,MTIME,can not empty!"); + } + drData = dtData.NewRow(); + + drData["RECEIPTNO"] = xmlList[i].SelectNodes("RECEIPTNO").Item(0).InnerText; + drData["RECEIPTLINE"] = xmlList[i].SelectNodes("RECEIPTLINE").Item(0).InnerText; + drData["STORAGECODE"] = xmlList[i].SelectNodes("STORAGECODE").Item(0).InnerText; + drData["MCODE"] = xmlList[i].SelectNodes("MCODE").Item(0).InnerText; + drData["MNAME"] = xmlList[i].SelectNodes("MNAME").Item(0).InnerText; + drData["REELID"] = xmlList[i].SelectNodes("REELID").Item(0).InnerText; + drData["DATECODE"] = xmlList[i].SelectNodes("DATECODE").Item(0).InnerText; + drData["SNSCALE"] = xmlList[i].SelectNodes("SNSCALE").Item(0).InnerText; + drData["VENDERDATE"] = xmlList[i].SelectNodes("VENDERDATE").Item(0).InnerText; + drData["VENDORCODE"] = xmlList[i].SelectNodes("VENDORCODE").Item(0).InnerText; + drData["VENDORITEMCODE"] = xmlList[i].SelectNodes("VENDORITEMCODE").Item(0).InnerText; + drData["VENDERLOTNO"] = xmlList[i].SelectNodes("VENDERLOTNO").Item(0).InnerText; + drData["MANUFACTURER"] = xmlList[i].SelectNodes("MANUFACTURER").Item(0).InnerText; + drData["EXDATE"] = xmlList[i].SelectNodes("EXDATE").Item(0).InnerText; + + drData["QTY"] = xmlList[i].SelectNodes("QTY").Item(0).InnerText; + drData["USERCODE"] = xmlList[i].SelectNodes("USERCODE").Item(0).InnerText; + drData["MDATE"] = xmlList[i].SelectNodes("MDATE").Item(0).InnerText; + drData["MTIME"] = xmlList[i].SelectNodes("MTIME").Item(0).InnerText; + + dtData.Rows.Add(drData); + } + } + + // 檢查必要性欄位 + if (string.IsNullOrEmpty(Factory)) + clsERP.combineException(ref strException, mesmsg: "[%FactoryEmpty%]"); + if (strException.Count > 0) + goto exitFun; + + // KeyValue + strKeyValue = Factory; + + // 判斷成功與否 + if (strException.Count > 0) + goto exitFun; + + strResult = "success"; + + exitFun: + ; + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%SendMaterial_RAWFail%]", stack: ex.StackTrace); + } + finally + { + // 將各部份之XML字串組起來並傳出 + string argReturnValue = null; + OutXml = modWS.CombineXMLResponse(strIdentity, argReturnValue, strException, strResult, strMessage); + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(modWS.GetXMLIdentityNode(xmlDoc, "transactionid"), modWS.GetXMLIdentityNode(xmlDoc, "moduleid"), modWS.GetXMLIdentityNode(xmlDoc, "functionid"), modWS.GetXMLIdentityNode(xmlDoc, "computername"), modWS.GetXMLIdentityNode(xmlDoc, "curuserno"), modWS.GetXMLIdentityNode(xmlDoc, "sendtime"), strResult, strKeyValue, strMessage, strException, InXml, OutXml, "AddMaterial_WIP", Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), LogClass: "ERP"); + SendMaterial_RAWs = OutXml; + + } + + return SendMaterial_RAWs; + } + #endregion + + + #region "WMS发料回传前,先回传发料明细关联reel信息,datahub调用MES服务,推送发料明细数据至MES;" + + /// + /// 校验JOSN权限,并解析出JOSN,目前账号只支持DS + /// + /// + public static string funCheckJson(object parameters) + { + string result = ""; + string transactionid = ""; + string moduleid = ""; + string functionid = ""; + string computername = ""; + string curuserno = "DS"; + string curusrpwd = "";//新增用户密码 SM2加密 + string sendtime = ""; + string languagemode = ""; + string outXml = ""; + string Json = ""; + + + + string ContentType = ""; + string SourceSystem = ""; + string TargetSystem = ""; + string Authorization = ""; + try + { + //转换为数组 + if (parameters is object[] paramArray && paramArray.Length >= 2) + { + if (paramArray[1] is API_Base.ServiceInfo serviceInfo) + { + Json = serviceInfo.InJson; + string headerText = serviceInfo.httpRequest.ToString(); + + // 解析逻辑 + var lines = headerText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + Dictionary headers = new Dictionary(); + foreach (var line in lines) + { + int index = line.IndexOf(':'); + if (index > 0) + { + string key = line.Substring(0, index).Trim(); + string value = line.Substring(index + 1).Trim(); + headers[key] = value; + } + } + // 结果 + //curuserno = headers.TryGetValue("curuserno", out var no) ? no : ""; + //curusrpwd = headers.TryGetValue("curusrpwd", out var pwd) ? pwd : ""; + + + ContentType = headers.TryGetValue("Content-Type", out var contp) ? contp : ""; + SourceSystem = headers.TryGetValue("Source-System", out var sous) ? sous : ""; + TargetSystem = headers.TryGetValue("Target-System", out var tars) ? tars : ""; + Authorization = headers.TryGetValue("Authorization", out var auth) ? auth : ""; + + curusrpwd = Authorization; + + + + + + } + } + + tcEAI_C.clsERP.funCheckUser(curuserno, curusrpwd); + + } + catch (Exception ex) + { + throw ex; + } + return Json; + } + + public static string funReceiveReelMaterialByWMS(object parameters) + { + string funSendReelMaterialByWMS = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + + try + { + + strRequestJson = funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + // 定义最终要组装的DataTable + DataTable dtReel = new DataTable(); + + // 先给DataTable创建所有列 + dtReel.Columns.Add("Factory", typeof(string)); + dtReel.Columns.Add("RECEIPTNO", typeof(string)); + dtReel.Columns.Add("RECEIPTLINE", typeof(int)); + dtReel.Columns.Add("STORAGECODE", typeof(string)); + dtReel.Columns.Add("MCODE", typeof(string)); + dtReel.Columns.Add("MNAME", typeof(string)); + dtReel.Columns.Add("REELID", typeof(string)); + dtReel.Columns.Add("DATECODE", typeof(string)); + dtReel.Columns.Add("SNSCALE", typeof(string)); + dtReel.Columns.Add("VENDERDATE", typeof(string)); + dtReel.Columns.Add("VENDORCODE", typeof(string)); + dtReel.Columns.Add("VENDORITEMCODE", typeof(string)); + dtReel.Columns.Add("VENDERLOTNO", typeof(string)); + dtReel.Columns.Add("MANUFACTURER", typeof(string)); + dtReel.Columns.Add("EXDATE", typeof(string)); + dtReel.Columns.Add("QTY", typeof(int)); + dtReel.Columns.Add("USERCODE", typeof(string)); + dtReel.Columns.Add("MDATE", typeof(string)); + dtReel.Columns.Add("MTIME", typeof(string)); + + //2.收集数据 + string factory = result.Data?.Factory ?? ""; + + // 遍历明细填充DataTable + if (result.Data.Detail != null && result.Data.Detail.Count > 0) + { + foreach (var item in result.Data.Detail) + { + // 新建一行 + DataRow dr = dtReel.NewRow(); + + // 赋值所有字段 + dr["Factory"] = factory; + dr["RECEIPTNO"] = item.RECEIPTNO ?? ""; + dr["RECEIPTLINE"] = item.RECEIPTLINE; + dr["STORAGECODE"] = item.STORAGECODE ?? ""; + dr["MCODE"] = item.MCODE ?? ""; + dr["MNAME"] = item.MNAME ?? ""; + dr["REELID"] = item.REELID ?? ""; + dr["DATECODE"] = item.DATECODE ?? ""; + dr["SNSCALE"] = item.SNSCALE ?? ""; + dr["VENDERDATE"] = item.VENDERDATE ?? ""; + dr["VENDORCODE"] = item.VENDORCODE ?? ""; + dr["VENDORITEMCODE"] = item.VENDORITEMCODE ?? ""; + dr["VENDERLOTNO"] = item.VENDERLOTNO ?? ""; + dr["MANUFACTURER"] = item.MANUFACTURER ?? ""; + dr["EXDATE"] = item.EXDATE ?? ""; + dr["QTY"] = item.QTY; + dr["USERCODE"] = item.USERCODE ?? ""; + dr["MDATE"] = item.MDATE ?? ""; + dr["MTIME"] = item.MTIME ?? ""; + + // 加入表 + dtReel.Rows.Add(dr); + } + } + + clsERP.funAddMaterial_WIP(factory, dtReel); + + strResult = "success"; + + + + exitFun: + ; + } + catch (Exception ex) + { + strResult = "fail"; + strMsg = ex.Message; + } + finally + { + //组装返回JOSN + var resModel = new ReceiveReelMaterialByWMS_Response(); + + + + if (strResult == "success") + { + resModel.result = "1"; + } + else + { + // 失败逻辑 + resModel.result = "0"; + resModel.msg = strMsg; + } + + //resModel 转成JOSN返回 + strResponseJson = JsonConvert.SerializeObject(resModel); + funSendReelMaterialByWMS = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "INV", "funReceiveReelMaterialByWMS", + "WMS", "WMS", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "ReceiveReelMaterialByWMS", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "WMS"); + } + + return funSendReelMaterialByWMS; + } + + #endregion + + + #region "SPC 接收数据" + + /// + /// 计量 + /// + /// + /// + public static string funGetJLSPCData(object parameters) + { + string GetJLSPCData = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + + //调 clsERP 传入参数 + string SPCSerial_QMS = ""; + string MaterialNo = ""; + string MTLVendor = ""; + string Employee = ""; + string LotNo = ""; + string OPNo = ""; + string QCItemNo = ""; + string DC = ""; + string PartNo = ""; + var listTest = new List(); + + + try + { + + strRequestJson = funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + //要因 没有值,则给 * + SPCSerial_QMS = GetSafeString(result.SPCSERIAL); + MaterialNo = GetSafeString(result.MaterialNo); + MTLVendor = GetSafeString(result.MTLVendor); + Employee = GetSafeString(result.UserNo); + LotNo = GetSafeString(result.LOTNO); + OPNo = GetSafeString(result.OPNO); + QCItemNo = GetSafeString(result.QCItemNo); + DC = GetSafeString(result.DC); + PartNo = GetSafeString(result.PARTNO); + + //实测值,转换成list + var list = result.TestResults; + foreach (var item in list) + { + //item.TestValue 防空 + if (item.TestValue.ToString() != "") + { + listTest.Add(item.TestValue); + } + + } + + + + clsERP.funGetJLSPCData(ref strMessage, ref strException, SPCSerial_QMS, MaterialNo, MTLVendor, Employee, LotNo, OPNo, QCItemNo, DC, PartNo, listTest); + + strResult = "success"; + + + + exitFun: + ; + } + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + + } + finally + { + //组装返回JOSN + + + SPC_GetJLSPCData_Response response = null; + + if (strResult == "success") + { + response = new SPC_GetJLSPCData_Response + { + code = 0, + message = "成功", + success = true, + data = null, + tradeNo = null, + notSuccess = false + }; + } + else + { + // 失败逻辑 + response = new SPC_GetJLSPCData_Response + { + code = 1, + message = strMsg, + success = false, + data = null, + tradeNo = null, + notSuccess = true + }; + } + + //resModel 转成JOSN返回 + strResponseJson = JsonConvert.SerializeObject(response); + GetJLSPCData = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "SPC", "funGetJLSPCData", + "QMS", "QMS", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "GetJLSPCData", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "QMS"); + } + + return GetJLSPCData; + } + + + /// + /// 计数 + /// + /// + /// + public static string funGetJSSPCData(object parameters) + { + string GetJLSPCData = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + + //调 clsERP 传入参数 + string SPCSerial_QMS = ""; + string MaterialNo = ""; + string MTLVendor = ""; + string Employee = ""; + string LotNo = ""; + string ProDuct = ""; + string EquipMent = ""; + string DC = ""; + string PartNo = ""; + var listTest = new List(); + + + try + { + + strRequestJson = funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + //要因 没有值,则给 * + SPCSerial_QMS = GetSafeString(result.SPCSERIAL); + MaterialNo = GetSafeString(result.MaterialNo); + MTLVendor = GetSafeString(result.MTLVendor); + Employee = GetSafeString(result.UserNo); + LotNo = GetSafeString(result.LOTNO); + ProDuct = GetSafeString(result.PRODUCT); + EquipMent = GetSafeString(result.EQUIPMENT); + DC = GetSafeString(result.DC); + //PartNo = GetSafeString(result.PARTNO); + + + clsERP.funGetJSSPCData(ref strMessage, ref strException, SPCSerial_QMS, MaterialNo, MTLVendor, Employee, LotNo, ProDuct, EquipMent, DC, result.QCItemDetails); + + + + + strResult = "success"; + + + + exitFun: + ; + } + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + + } + finally + { + //组装返回JOSN + + + SPC_GetJSSPCData_Response response = null; + + if (strResult == "success") + { + response = new SPC_GetJSSPCData_Response + { + code = 0, + message = "成功", + success = true, + data = null, + tradeNo = null, + notSuccess = false + }; + } + else + { + // 失败逻辑 + response = new SPC_GetJSSPCData_Response + { + code = 1, + message = strMsg, + success = false, + data = null, + tradeNo = null, + notSuccess = true + }; + } + + //resModel 转成JOSN返回 + strResponseJson = JsonConvert.SerializeObject(response); + GetJLSPCData = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "SPC", "funGetJSSPCData", + "QMS", "QMS", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "GetJSSPCData", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "QMS"); + } + + return GetJLSPCData; + } + + + /// + /// 如果字符串为 null 或空字符串,返回默认值(默认*),否则返回原值 + /// + /// 要判断的字段 + /// 为空时替换的值,默认* + /// + public static string GetSafeString(string value, string defaultValue = "*") + { + return string.IsNullOrEmpty(value) ? defaultValue : value; + } + #endregion + + + #region "工单砍单、取消卡控接口" + public static string funCheckMONoCanEditCancel(object parameters) + { + string funCheckMONoCanEditCancel = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + + + + decimal decQuantity = 0; //数量 + int intStatus = 0; //状态 + + decimal InputQty = 0;//工单投入 + decimal OutputQty = 0;//工单产出 + string CurrentStatus = defString;//当前状态 + + bool bolclsERP = false; //调用clsERP方法是否成功 + + try + { + + strRequestJson = funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + + //检查 result.MONO 是否为空 + if (string.IsNullOrEmpty(result.MONo)) + { + throw new Exception("MONO不能为空"); + } + + //检查数据 result.Quantity 和 result.Status 如果不是数值型,则提示 + if (!decimal.TryParse(result.Quantity.ToString(), out decQuantity)) + { + throw new Exception("Quantity必须是数值型"); + + } + + if (!int.TryParse(result.Status.ToString(), out intStatus)) + { + throw new Exception("Status必须是数值型"); + + } + + //intStatus 只能是0和1 + if (intStatus != 0 && intStatus != 1) + { + throw new Exception("Status必须是0或1"); + } + + + + bolclsERP = clsERP.funCheckMONoCanEditCancel_M(ref strMessage, ref strException, ref InputQty, ref OutputQty, ref CurrentStatus, result.MONo, decQuantity, intStatus); + if (bolclsERP == false) + { + //说明有提示 + modWS.ChgTranslateMessage(ref strMessage, ref strMsg); + throw new Exception(strMsg); + } + + strResult = "success"; + + + + exitFun: + ; + } + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + + } + finally + { + //组装返回JOSN + + + ERP_CheckMONoCanEditCancel_Response response = null; + + if (strResult == "success") + { + response = new ERP_CheckMONoCanEditCancel_Response + { + code = 200, + message = "check successfully", + data = new ERP_MOData + { + InputQty = InputQty, + OutputQty = OutputQty, + CurrentStatus = CurrentStatus, + Rusult = "PASS" + }, + requestId = "" + }; + } + else + { + // 失败逻辑 + response = new ERP_CheckMONoCanEditCancel_Response + { + code = 500, + message = strMsg, + data = null // 序列化后不显示data字段 + }; + } + + //resModel 转成JOSN返回 + strResponseJson = JsonConvert.SerializeObject(response); + funCheckMONoCanEditCancel = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "OE", "funCheckMONoCanEditCancel", + "ERP", "ERP", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "CheckMONoCanEditCancel", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "ERP"); + } + + return funCheckMONoCanEditCancel; + } + #endregion + + + #region"Materialhold" + public static string Materialhold(object parameters) + { + string GetJLSPCData = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + + //调 clsERP 传入参数 + string source = ""; + string materialno = ""; + string materiallotno = ""; + string holdstate = ""; + string creator = ""; + string date = ""; + string reasonno = "ERPhold"; + var listTest = new List(); + int REVERSALMETHOD = -1; + try + { + + strRequestJson = funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + //要因 没有值,则给 * + source = GetSafeString(result.source); + materialno = GetSafeString(result.materialno); + materiallotno = GetSafeString(result.materiallotno); + holdstate = GetSafeString(result.holdstate); + creator = GetSafeString(result.creator); + date = GetSafeString(result.date); + reasonno = GetSafeString(result.reasonno); + if (reasonno == "*") + { + reasonno = "ERPhold"; + } + bool bolclsERP = clsERP.funGetMaterialhold(ref strMessage, ref strException, source, materialno, materiallotno, holdstate, creator, date, reasonno); + + if (bolclsERP == true) + { + strResult = "success"; + } + else + { + strResult = "fail"; + } + } + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + + } + finally + { + //组装返回JOSN + + + MaterialHoldResponse response = null; + + if (strResult == "success") + { + + response = new MaterialHoldResponse + { + result = true, + msg = "" + }; + } + else + { + MaterialHoldError error = new MaterialHoldError(); + error.code = "RMQ-01-00-0001"; + error.message = strMsg; + // 失败逻辑 + response = new MaterialHoldResponse + { + result = false, + msg = strMsg, + error = error + }; + } + + //resModel 转成JOSN返回 + strResponseJson = JsonConvert.SerializeObject(response); + GetJLSPCData = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "WIP", "Materialhold", + "ERP", "ERP", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "Materialhold", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "ERP"); + } + + return GetJLSPCData; + } + + #endregion + + #region"工单bom" + /// + /// 计量 + /// + /// + /// + public static string PrdBomList(object parameters) + { + string GetJLSPCData = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + + //调 clsERP 传入参数 + string Productid = ""; + string ProductVersion = ""; + + var listTest = new List(); + int REVERSALMETHOD = -1; + try + { + + strRequestJson = funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + //要因 没有值,则给 * + Productid = GetSafeString(result.PRODUCTNO); + ProductVersion = GetSafeString(result.PRODUCTVERSION); + + if (Productid == "*") + { + throw new Exception("未传产品信息!"); + } + if (ProductVersion == "*") + { + throw new Exception("未传产品版本信息!"); + } + if (result.Bomlist.Count == 0) + { + throw new Exception("未传产品Bom信息!"); + } + + bool bolclsERP = clsERP.GetProdBOMInfo(ref strMessage, ref strException, Productid, ProductVersion, result); + + if (bolclsERP == true) + { + strResult = "success"; + } + else + { + strResult = "fail"; + } + } + catch (Exception ex) + { + strResult = "fail"; + //翻译 + strMsg = modWS.TranslateMsg(ex.Message); + + } + finally + { + //组装返回JOSN + + + MappingResponse response = null; + + if (strResult == "success") + { + + response = new MappingResponse + { + code = "0000", + message = "success", + time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + data = null, + extras = null, + logId = "", + requestId = DateTime.Now.ToString("yyyyMMddHHmmssss") + }; + } + else + { + // 失败逻辑 + response = new MappingResponse + { + code = "1111", + message = strMsg, + time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + data = null, + extras = null, + logId = "", + requestId = DateTime.Now.ToString("yyyyMMddHHmmssss") + }; + } + + //resModel 转成JOSN返回 + strResponseJson = JsonConvert.SerializeObject(response); + GetJLSPCData = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "WIP", "PrdBomList", + "ERP", "ERP", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "PrdBomList", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "ERP"); + } + + return GetJLSPCData; + } + + + #endregion + + #region"钢片绑定" + /// + /// 钢片绑定接口:根据设备编号查询批号,绑定钢片 + /// + public static string CarrierTackIn(object parameters) + { + string GetJLSPCData = default(string); + string strResult = ""; + string strMsg = ""; + string strKeyValue = ""; + var strException = new List(); + var strMessage = new List(); + string strResponseJson = ""; + string strRequestJson = ""; + + string equipmentno = ""; + string steelno = ""; + string carrierno = ""; + string lotno = ""; + + try + { + strRequestJson = funCheckJson(parameters); + + var result = JsonConvert.DeserializeObject(strRequestJson); + equipmentno = GetSafeString(result.equipmentno); + steelno = GetSafeString(result.steelno); + carrierno = GetSafeString(result.carrierno); + + // 校验参数 + if (string.IsNullOrEmpty(equipmentno)) + { + throw new Exception("设备编号不能为空"); + } + if (string.IsNullOrEmpty(steelno)) + { + throw new Exception("钢片编号不能为空"); + } + if (string.IsNullOrEmpty(carrierno)) + { + throw new Exception("料盒不能为空"); + } + + bool bolResult = clsERP.funSteelBind(ref strMessage, ref strException, equipmentno, steelno, carrierno, ref lotno); + + if (bolResult) + { + + } + else + { + strResult = "fail"; + if (strException.Count > 0 && strException[0].Count > 1) + { + strMsg = strException[0][1].ToString(); + } + } + bool bolclsEAP = clsEAP.funTrackIn_InquirybyLot(ref strMessage, ref strException, carrierno, equipmentno); + if (bolclsEAP == false) + { + //说明有提示 + modWS.ChgTranslateMessage(ref strMessage, ref strMsg); + throw new Exception(strMsg); + } + strResult = "success"; + + } + catch (Exception ex) + { + strResult = "fail"; + strMsg = modWS.TranslateMsg(ex.Message); + } + finally + { + SteelBindResponse response = null; + if (strResult == "success") + { + response = new SteelBindResponse + { + code = "0000", + data = new SteelBindData + { + message = "成功", + lotno = lotno, + steelno = steelno + }, + extras = null, + message = "成功", + time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + logId = "", + requestId = DateTime.Now.ToString("yyyyMMddHHmmssss") + }; + } + else + { + response = new SteelBindResponse + { + code = "1111", + data = null, + extras = null, + message = "进站失败," + strMsg, + time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + logId = "", + requestId = DateTime.Now.ToString("yyyyMMddHHmmssss") + }; + } + + strResponseJson = JsonConvert.SerializeObject(response); + GetJLSPCData = strResponseJson; + + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "WIP", "CarrierTackIn", + "ERP", "ERP", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "CarrierTackIn", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "ERP"); + } + + return GetJLSPCData; + } + #endregion + + + + + + #region Reel校验接口 + //public static string CheckReelQty(string jsonInput) + //{ + // JObject response = new JObject(); + // try + // { + // JObject requestJson = JObject.Parse(jsonInput); + // string factory = (string)requestJson["Data"]?["Factory"]; + // string reelId = (string)requestJson["Data"]?["Detail"]?["REELID"]; + // string qty = (string)requestJson["Data"]?["Detail"]?["QTY"]; + // bool isSuccess = true; + + // if (isSuccess) + // { + // response["result"] = 1; + // response["qty"] = qty; + // response["mcode"] = "111"; + // response["vendorcode"] = "123456"; + // response["vendordate"] = "20240512"; + // response["manufacturer"] = "龙旗"; + // response["vendorlotno"] = "123"; + // response["oraFacReel"] = "12"; + // response["snscale"] = "09"; + // response["mpn"] = ""; + // response["produceArea"] = ""; + // response["cnum"] = 0; + // response["msg"] = null; + // } + // else + // { + // response["result"] = 0; + // response["msg"] = $"未找到该料卷{reelId}"; + // response["qty"] = ""; + // } + // } + // catch (Exception ex) + // { + // response["result"] = 0; + // response["msg"] = "解析异常或系统错误: " + ex.Message; + // response["qty"] = ""; + + // // 此处可以加上你原来的记录 Log 的代码 + // } + + // return response.ToString(Newtonsoft.Json.Formatting.None ); + //} + + public static string CheckReelQty(object parameters) + { + JObject response = new JObject(); + string strResult = "fail"; //返回结果 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + try + { + //取得报文,并校验接口规范的Header四参数(Content-Type/Source-System/Target-System/Authorization) + strRequestJson = funCheckJson(parameters); + + JObject requestJson = JObject.Parse(strRequestJson); + string factory = requestJson["Data"]?["Factory"]?.ToString(); + string reelId = requestJson["Data"]?["Detail"]?["REELID"]?.ToString(); + string qty = requestJson["Data"]?["Detail"]?["QTY"]?.ToString(); + string STORAGECODE = requestJson["Data"]?["Detail"]?["STORAGECODE"]?.ToString(); + + if (string.IsNullOrEmpty(reelId)) + { + throw new Exception("[%料卷唯一码必须传入!%]"); + } + strKeyValue = reelId; + + bool isSuccess = false; + string mcode = ""; + string qty1 = ""; + string vendordate = ""; + string vendorcode = ""; + string manufacturer = ""; + string vendorlotno = ""; + string snscale = ""; + bool everExisted = false; + isSuccess = clsERP.CheckReelQty(ref strMessage, ref strException, reelId, STORAGECODE ?? "", ref mcode, ref qty1, ref vendordate, ref vendorcode, ref manufacturer, ref vendorlotno, ref snscale, ref everExisted); + if (isSuccess) + { + response["result"] = 1; + response["qty"] = qty1; + response["mcode"] = mcode; + //供应商编码、生产厂家、供应商批次、09条码四栏,取自线边仓表对应栏位 + response["vendorcode"] = vendorcode; + response["vendordate"] = vendordate; + response["manufacturer"] = manufacturer; + response["vendorlotno"] = vendorlotno; + response["oraFacReel"] = reelId; + response["snscale"] = snscale; + //MPN、产地两栏线边仓表无对应栏位、WMS进料报文亦未带入, + //本次维持回空值,俟数据来源确认后另案补做取数 + response["mpn"] = ""; + response["produceArea"] = ""; + response["cnum"] = 0; + response["msg"] = null; + strResult = "success"; + } + else + { + response["result"] = 0; + //区分「料卷已扣光」与「卷号根本不存在」,此两者现场处理方式不同 + if (everExisted) + { + response["msg"] = $"料卷{reelId}已扣光"; + } + else + { + response["msg"] = $"未找到该料卷{reelId}"; + } + response["qty"] = ""; + strResult = "fail"; + } + } + catch (Exception ex) + { + response["result"] = 0; + response["msg"] = "数据解析异常或系统错误: " + ex.Message; + response["qty"] = ""; + strResult = "fail"; + } + finally + { + strResponseJson = response.ToString(Newtonsoft.Json.Formatting.None); + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "INV", "CheckReelQty", + "WMS", "WMS", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "CheckReelQty", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "WMS"); + } + + return strResponseJson; + } + #endregion + + + #region "WMS退料,扣减线边仓料卷数量" + public static string ReelReturn(object parameters) + { + string ReelReturn = default(string); + string strResult = ""; //返回结果 + string strMsg = ""; //返回信息 + string strKeyValue = ""; + var strException = new List(); // Exception XML字串 + var strMessage = new List(); // Message XML字串 + string strResponseJson = "";//传出JOSN + string strRequestJson = ""; //传入JOSN + + try + { + //取得报文,并校验接口规范的Header四参数(Content-Type/Source-System/Target-System/Authorization) + strRequestJson = funCheckJson(parameters); + + // ====================== + // 1.反序列化 JSON + // ====================== + var result = JsonConvert.DeserializeObject(strRequestJson); + + if (result.Data == null || result.Data.Detail == null) + { + throw new Exception("[%无明细数据!%]"); + } + + var detail = result.Data.Detail; + + string mvdCode = detail.MVDCODE ?? ""; + string moCode = detail.MOCODE ?? ""; + string fromStorage = detail.FROMSTORAGE ?? ""; + string toStorage = detail.TOSTORAGE ?? ""; + string userCode = detail.USERCODE ?? ""; + string mDate = detail.MDATE ?? ""; + string mTime = detail.MTIME ?? ""; + + if (mvdCode == "" || fromStorage == "") + { + throw new Exception("[%退料单号,供应仓都必须传入!%]"); + } + strKeyValue = mvdCode; + + if (detail.REELINFO == null || detail.REELINFO.Count == 0) + { + throw new Exception("[%料卷信息必须传入!%]"); + } + + // 定义最终要组装的DataTable + DataTable dtReelInfo = new DataTable(); + + // 先给DataTable创建所有列 + dtReelInfo.Columns.Add("REELID", typeof(string)); + dtReelInfo.Columns.Add("MCODE", typeof(string)); + dtReelInfo.Columns.Add("QTY", typeof(string)); + + //2.收集数据:依REELINFO逐笔扣减,MLIST仅为汇总不参与扣减 + foreach (var item in detail.REELINFO) + { + // 新建一行 + DataRow dr = dtReelInfo.NewRow(); + + // 赋值所有字段 + dr["REELID"] = item.REELID ?? ""; + dr["MCODE"] = item.MCODE ?? ""; + dr["QTY"] = item.QTY ?? ""; + + // 加入表 + dtReelInfo.Rows.Add(dr); + } + + bool bolclsERP = false; + bolclsERP = clsERP.ReelReturn(ref strMessage, ref strException, mvdCode, moCode, fromStorage, toStorage, userCode, mDate, mTime, dtReelInfo); + if (bolclsERP == false) + { + //说明有提示 + modWS.ChgTranslateMessage(ref strMessage, ref strMsg); + throw new Exception(strMsg); + } + + strResult = "success"; + + + + exitFun: + ; + } + catch (Exception ex) + { + strResult = "fail"; + strMsg = ex.Message; + } + finally + { + //组装返回JOSN + var resModel = new ReelReturn_Response(); + + if (strResult == "success") + { + resModel.result = "1"; + } + else + { + // 失败逻辑 + resModel.result = "0"; + resModel.msg = strMsg; + } + + //resModel 转成JOSN返回 + strResponseJson = JsonConvert.SerializeObject(resModel); + ReelReturn = strResponseJson; + + // 紀錄Transaction Log + tcEAI_C.clsERP.addTransactionLog_ErrorCode(DateTime.Now.ToString("yyyyMMddHHmmssss"), + "INV", "ReelReturn", + "WMS", "WMS", DateTime.Now.ToString(), + strResult, strKeyValue, strMessage, strException, strRequestJson, strResponseJson, "ReelReturn", + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepLog"]), + Conversions.ToInteger(System.Configuration.ConfigurationManager.AppSettings["keepXML"]), + LogClass: "WMS"); + } + + return ReelReturn; + } + + #endregion + + } + +} diff --git a/MESEAI/EAICws/EAICws/modERPIntegrate.cs b/MESEAI/EAICws/EAICws/modERPIntegrate.cs new file mode 100644 index 0000000..740f816 --- /dev/null +++ b/MESEAI/EAICws/EAICws/modERPIntegrate.cs @@ -0,0 +1,16 @@ +using tcEAI_C; +using iMESCore.Settings; + +namespace EAIws_C +{ + + static class modERPIntegrate + { + + public static string strService = "ERPIntegrate"; + public static string strDataBaseType; + public static string strConnectionString; + + + } +} \ No newline at end of file diff --git a/MESEAI/EAICws/EAICws/modKMI.cs b/MESEAI/EAICws/EAICws/modKMI.cs new file mode 100644 index 0000000..4ce0867 --- /dev/null +++ b/MESEAI/EAICws/EAICws/modKMI.cs @@ -0,0 +1,37 @@ +using System; +using System.Xml; + +namespace EAIws_C +{ + + /// +/// +/// + static class modKMI + { + + private static string strService = "KMI"; + + private static string RequestKey = string.Empty; + private static string AccountID = string.Empty; + private static string SeesionID = string.Empty; + public const string SuccessCode = "0"; + + public static void GetXMLHeaderNode(XmlDocument xmlDoc) + { + + if (xmlDoc.SelectNodes("request").Item(0).SelectNodes("host").Count != 0) + { + AccountID = ((XmlElement)xmlDoc.SelectNodes("request").Item(0).SelectNodes("host").Item(0)).GetAttribute("acct"); + if (string.IsNullOrEmpty(AccountID)) + throw new Exception("GetXMLHeaderNode fail!", new Exception("acct is Empty!")); + } + else + { + throw new Exception("GetXMLHeaderNode fail!", new Exception("acct is not found!")); + } + + } + + } +} \ No newline at end of file diff --git a/MESEAI/EAICws/EAICws/modWS.cs b/MESEAI/EAICws/EAICws/modWS.cs new file mode 100644 index 0000000..ce93857 --- /dev/null +++ b/MESEAI/EAICws/EAICws/modWS.cs @@ -0,0 +1,1494 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using static System.Configuration.ConfigurationManager; +using System.Data; +using System.IO; +using System.Resources; +using System.Runtime.InteropServices; +using System.Web; +using System.Xml; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using static iMESCore.Base.iMESConst; + +namespace EAIws_C +{ + + static class modWS + { + #region --- Get Xml Value --- + + + public static string GetXMLIdentityNode(XmlDocument xmlDoc, string SelectNode) + { + try + { + return xmlDoc.GetElementsByTagName("identity").Item(0).SelectNodes(SelectNode).Item(0).InnerXml; + } + catch (Exception e1) + { + return "IdentityError"; + } + + } + + public static string GetXMLTransactionID(ref XmlDocument xmlDoc) + { + try + { + return xmlDoc.GetElementsByTagName("identity").Item(0).SelectNodes("transactionid").Item(0).InnerXml; + } + catch (Exception e1) + { + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + } // New Exception("modWS.GetXMLCurUserNo: " & e1.Message) + } + + public static string GetXMLModuleID(ref XmlDocument xmlDoc) + { + try + { + return xmlDoc.GetElementsByTagName("identity").Item(0).SelectNodes("moduleid").Item(0).InnerXml; + } + catch (Exception e1) + { + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + } // New Exception("modWS.GetXMLCurUserNo: " & e1.Message) + } + + public static string GetXMLFunctionID(ref XmlDocument xmlDoc) + { + try + { + return xmlDoc.GetElementsByTagName("identity").Item(0).SelectNodes("functionid").Item(0).InnerXml; + } + catch (Exception e1) + { + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + } // New Exception("modWS.GetXMLCurUserNo: " & e1.Message) + } + + public static string GetXMLComputerName(ref XmlDocument xmlDoc) + { + try + { + return xmlDoc.GetElementsByTagName("identity").Item(0).SelectNodes("computername").Item(0).InnerXml; + } + catch (Exception e1) + { + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + } // New Exception("modWS.GetXMLCurUserNo: " & e1.Message) + } + + public static string GetXMLCurUserNo(ref XmlDocument xmlDoc) + { + try + { + return xmlDoc.GetElementsByTagName("identity").Item(0).SelectNodes("curuserno").Item(0).InnerXml; + } + catch (Exception e1) + { + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + } // New Exception("modWS.GetXMLCurUserNo: " & e1.Message) + } + + public static string GetXMLSendTime(ref XmlDocument xmlDoc) + { + try + { + return xmlDoc.GetElementsByTagName("identity").Item(0).SelectNodes("sendtime").Item(0).InnerXml; + } + catch (Exception e1) + { + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + } // New Exception("modWS.GetXMLCurUserNo: " & e1.Message) + } + + public static string GetExceptionSysMsg(ref XmlDocument Xmldoc) + { + string GetExceptionSysMsgRet = default(string); + GetExceptionSysMsgRet = CInput(Xmldoc.DocumentElement.GetElementsByTagName("sysmsg").Item(0).InnerXml); + return GetExceptionSysMsgRet; + } + + public static string GetExceptionMesMsg(ref XmlDocument Xmldoc) + { + string GetExceptionMesMsgRet = default(string); + GetExceptionMesMsgRet = CInput(Xmldoc.DocumentElement.GetElementsByTagName("mesmsg").Item(0).InnerXml); + return GetExceptionMesMsgRet; + } + + public static bool chkExecutionSuccess(ref XmlDocument Xmldoc) + { + bool chkExecutionSuccessRet = default(bool); + if (Xmldoc.DocumentElement["result"].InnerXml == "success") + { + chkExecutionSuccessRet = true; + } + else + { + chkExecutionSuccessRet = false; + } + + return chkExecutionSuccessRet; + } + + + #endregion + + #region --- Combine Indentity Xml --- + + public static string CombineXMLIdentity(XmlDocument XMLDoc) + { + string CombineXMLIdentityRet = default(string); + CombineXMLIdentityRet = Conversions.ToString('\t') + '\t' + "" + GetXMLIdentityNode(XMLDoc, "transactionid") + "" + '\n'; + CombineXMLIdentityRet += Conversions.ToString('\t') + '\t' + "" + GetXMLIdentityNode(XMLDoc, "moduleid") + "" + '\n'; + CombineXMLIdentityRet += Conversions.ToString('\t') + '\t' + "" + GetXMLIdentityNode(XMLDoc, "functionid") + "" + '\n'; + CombineXMLIdentityRet += Conversions.ToString('\t') + '\t' + "" + GetXMLIdentityNode(XMLDoc, "computername") + "" + '\n'; + CombineXMLIdentityRet += Conversions.ToString('\t') + '\t' + "" + GetXMLIdentityNode(XMLDoc, "curuserno") + "" + '\n'; + CombineXMLIdentityRet += Conversions.ToString('\t') + '\t' + "" + GetXMLIdentityNode(XMLDoc, "sendtime") + ""; + return CombineXMLIdentityRet; + } + + public static string CombineXMLIdentity(ref string ComputerName, ref string CurUserNo, ref string SendTime) + { + string CombineXMLIdentityRet = default(string); + CombineXMLIdentityRet = "" + ComputerName + "" + "" + CurUserNo + "" + "" + SendTime + ""; + return CombineXMLIdentityRet; + } + + #endregion + + #region --- Combine Input Xml --- + + + public static string CombineXMLIdentity(ref string TransactionID, ref string ModuleID, ref string FunctionID, ref string ComputerName, ref string CurUserNo, ref string SendTime) + { + string CombineXMLIdentityRet = default(string); + CombineXMLIdentityRet = "" + TransactionID + "" + "" + ModuleID + "" + "" + FunctionID + "" + "" + ComputerName + "" + "" + CurUserNo + "" + "" + SendTime + ""; + return CombineXMLIdentityRet; + } + + public static string CombineXMLParameter(ref string value_name, ref string name, ref string type, ref string value, ref string desc) + { + string CombineXMLParameterRet = default(string); + + CombineXMLParameterRet = "<" + value_name.ToLower() + ">" + "" + name + "" + "" + type + "" + "" + value + "" + "" + desc + "" + ""; + return CombineXMLParameterRet; + + } + + public static string CombineXMLParameter(ref string name, ref string type, ref string value, ref string desc) + { + string CombineXMLParameterRet = default(string); + CombineXMLParameterRet = "<" + name.ToLower() + ">" + "" + name + "" + "" + type + "" + "" + value + "" + "" + desc + "" + ""; + return CombineXMLParameterRet; + } + + public static string CombineXMLValue(ref string TagName, ref string Value) + { + string CombineXMLValueRet = default(string); + CombineXMLValueRet = "<" + TagName + ">" + Value + ""; + return CombineXMLValueRet; + } + + public static string CombineXMLValueTag(ref string Value) + { + string CombineXMLValueTagRet = default(string); + CombineXMLValueTagRet = "" + Value + ""; + return CombineXMLValueTagRet; + } + + public static string CombineXMLRequest(ref string strIdentity, ref string strParameter) + { + string CombineXMLRequestRet = default(string); + + CombineXMLRequestRet = "" + "" + strIdentity + ""; + if (!string.IsNullOrEmpty(strParameter)) + { + CombineXMLRequestRet = CombineXMLRequestRet + "" + strParameter + ""; + } + CombineXMLRequestRet = CombineXMLRequestRet + ""; + return CombineXMLRequestRet; + + } + + public static string CombineXMLParameterMultiValue(ref string value_name, ref string name, ref string type, ref string value, ref string desc) + { + string CombineXMLParameterMultiValueRet = default(string); + // Value不用加上Tag + CombineXMLParameterMultiValueRet = "<" + value_name.ToLower() + ">" + "" + name + "" + "" + type + "" + value + "" + desc + "" + ""; + return CombineXMLParameterMultiValueRet; + } + + public static string CombineXMLAdditional(ref string strAdditional) + { + string CombineXMLAdditionalRet = default(string); + CombineXMLAdditionalRet = "" + strAdditional; + CombineXMLAdditionalRet = CombineXMLAdditionalRet + ""; + return CombineXMLAdditionalRet; + } + + public static string CombineAddXML_Add(ref string name, ref string type, ref string value) + { + string CombineAddXML_AddRet = default(string); + CombineAddXML_AddRet = "" + "" + name + "" + "" + type + "" + "" + value + "" + ""; + return CombineAddXML_AddRet; + } + + public static string CombineAddXML_Edit(ref string name, ref string type, ref string value) + { + string CombineAddXML_EditRet = default(string); + CombineAddXML_EditRet = "" + "" + name + "" + "" + type + "" + "" + value + "" + ""; + return CombineAddXML_EditRet; + } + + public static string CombineAddXML_Field(ref string name) + { + string CombineAddXML_FieldRet = default(string); + CombineAddXML_FieldRet = "" + "" + name + "" + ""; + return CombineAddXML_FieldRet; + } + + public static string CombineAddXML_Condition(string condition) + { + string CombineAddXML_ConditionRet = default(string); + + // 2007/03/22,sammi.呼叫CombineAddXML_Condition時,不可加CInput. + // 因CInput會將單引號轉成二個單引號,若Condition為下述範例時,會Error. + // strAdditional = CombineXMLAdditional(CombineAddXML_Condition("ModuleType in ('REWORK','SLR')")) + // strParameter += strAdditional + + CombineAddXML_ConditionRet = "" + condition + ""; + return CombineAddXML_ConditionRet; + + } + + public static string CInput(string strInput) + { + string CInputRet = default(string); + // 將傳入值內的單引號轉換為可存入資料庫的格式 + // 將傳入值內的 &, >, < 三個特殊字元轉換為XmlDocument可解譯之代替符號 + // 傳入值: strInput包含特殊字元的字串 + // 傳回值: 將特殊字元變更為代替符號的字串 + + // 轉換 ' 為 '' (單引號轉為兩個單引號) + CInputRet = Strings.Replace(strInput, "'", "''"); + + // 轉換 & 為 & + CInputRet = Strings.Replace(CInputRet, "&", "&"); + + // CInput = Replace(CInput, """", "''") 'AddFlow的Xml字串不可將雙引號轉為兩個單引號,XMLToFlow會Error + + // 轉換 > 為 > + CInputRet = Strings.Replace(CInputRet, ">", ">"); + + // 轉換 < 為 < + CInputRet = Strings.Replace(CInputRet, "<", "<"); + return CInputRet; + + } + + #endregion + + #region --- Combine Output Xml --- + + public static bool ChgTranslateException(List Exception, ref string strExceptionSysmsg, ref string strExceptionMesmsg, ref string strExceptionStack) + { + bool ChgTranslateExceptionRet = default(bool); + + try + { + foreach (ArrayList al in Exception) + { + if (!string.IsNullOrEmpty(strExceptionSysmsg)) + strExceptionSysmsg += Conversions.ToString('\n'); + if (string.IsNullOrEmpty(Conversions.ToString(al[1])) == false) + strExceptionSysmsg += Conversions.ToString('\t') + '\t' + '\t' + al[1].ToString(); + if (string.IsNullOrEmpty(strExceptionMesmsg) == false) + strExceptionMesmsg += Conversions.ToString('\n'); + 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 = TranslateMsg(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 = TranslateMsg(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 += Conversions.ToString('\t') + '\t' + '\t' + strErrName_Rep; + } + + if (!string.IsNullOrEmpty(strExceptionStack)) + strExceptionStack += Conversions.ToString('\n'); + if (string.IsNullOrEmpty(Conversions.ToString(al[3])) == false) + strExceptionStack += Conversions.ToString('\t') + '\t' + '\t' + al[3].ToString(); + } + + ChgTranslateExceptionRet = true; + } + + catch (Exception e1) + { + throw; + ChgTranslateExceptionRet = false; + } + + return ChgTranslateExceptionRet; + + } + + public static bool ChgTranslateException_ByLanguage(ref List Exception, ref string strExceptionSysmsg, ref string strExceptionMesmsg, ref string strExceptionStack, bool ShowStack) + { + bool ChgTranslateException_ByLanguageRet = default(bool); + + try + { + // item content>> 0:code, 1:sysmsg, 2:mesmsg, 3:stack + foreach (ArrayList al in Exception) + { + if (!string.IsNullOrEmpty(strExceptionSysmsg)) + strExceptionSysmsg += Conversions.ToString(ControlChars.Cr); + if (!string.IsNullOrEmpty(strExceptionStack)) + strExceptionStack += Conversions.ToString(ControlChars.Cr); + // code + if (string.IsNullOrEmpty(Conversions.ToString(al[0])) == false) + { + strExceptionSysmsg += string.Format("[{0}]", TranslateMsg(al[0].ToString())); + } + if (string.IsNullOrEmpty(Conversions.ToString(al[1])) == false) + { + strExceptionSysmsg += "," + TranslateMsg(al[1].ToString()); + } + if (string.IsNullOrEmpty(strExceptionMesmsg) == false) + strExceptionMesmsg += Conversions.ToString(ControlChars.Cr); + if (string.IsNullOrEmpty(Conversions.ToString(al[2])) == false) + { + // 翻譯錯誤訊息 + string strErrName_Rep = ""; + string ErrorName = al[2].ToString(); + strErrName_Rep = TranslateMsg(ErrorName); + strExceptionMesmsg += "," + strErrName_Rep; + } + // stack + if (ShowStack == true && string.IsNullOrEmpty(Conversions.ToString(al[3])) == false) + { + strExceptionStack += ControlChars.Tab + al[3].ToString(); + } + } + + ChgTranslateException_ByLanguageRet = true; + } + + catch (Exception ex) + { + throw; + ChgTranslateException_ByLanguageRet = false; + } + + return ChgTranslateException_ByLanguageRet; + + } + + public static bool ChgTranslateException_ByLanguage(ref List Exception, ref string strExceptionSysmsg, ref string strExceptionMesmsg, ref string strExceptionStack) + { + bool ChgTranslateException_ByLanguageRet = default(bool); + + try + { + foreach (ArrayList al in Exception) + { + if (!string.IsNullOrEmpty(strExceptionSysmsg)) + strExceptionSysmsg += Conversions.ToString('\n'); + if (string.IsNullOrEmpty(Conversions.ToString(al[1])) == false) + strExceptionSysmsg += Conversions.ToString('\t') + '\t' + '\t' + TranslateMsg(al[1].ToString()); + if (string.IsNullOrEmpty(strExceptionMesmsg) == false) + strExceptionMesmsg += Conversions.ToString('\n'); + if (string.IsNullOrEmpty(Conversions.ToString(al[2])) == false) + { + // 翻譯錯誤訊息 + string strErrName_Rep = ""; + string ErrorName = al[2].ToString(); + strErrName_Rep = TranslateMsg(ErrorName); + strExceptionMesmsg += Conversions.ToString('\t') + '\t' + '\t' + strErrName_Rep; + } + + if (!string.IsNullOrEmpty(strExceptionStack)) + strExceptionStack += Conversions.ToString('\n'); + if (string.IsNullOrEmpty(Conversions.ToString(al[3])) == false) + strExceptionStack += Conversions.ToString('\t') + '\t' + '\t' + al[3].ToString(); + } + + ChgTranslateException_ByLanguageRet = true; + } + + catch (Exception e1) + { + throw; + ChgTranslateException_ByLanguageRet = false; + } + + return ChgTranslateException_ByLanguageRet; + + } + + public static bool ChgTranslateMessage(ref List Message, ref string strMmsg) + { + bool ChgTranslateMessageRet = default(bool); + + try + { + foreach (ArrayList al in Message) + { + if (!string.IsNullOrEmpty(strMmsg)) + strMmsg += Conversions.ToString('\n'); + if (string.IsNullOrEmpty(Conversions.ToString(al[2])) == false) + { + // 翻譯訊息 + string strErrName_Rep = ""; + string ErrorName = al[2].ToString(); + if (Strings.InStr(ErrorName, "[%", CompareMethod.Text) > 0) + { + // Replace[%%] + 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 = TranslateMsg(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 = TranslateMsg(strKey); + } + catch (Exception ex) + { + strKeyValue = strKey; + } + if (string.IsNullOrEmpty(strKeyValue)) + { + strErrName_Rep += strKey; + } + else + { + strErrName_Rep += strKeyValue; + } // & "(" & strKey & ")" + // 下次截取字串的起始位置 + intStart = k + 2; + } + } + } + } + } + + // strMmsg += Resources.Resource.ResourceManager.GetString(al.Item(2).ToString) & "(" & al.Item(2).ToString & ")" + strMmsg += strErrName_Rep; + } + + } + + ChgTranslateMessageRet = true; + } + + catch (Exception e1) + { + throw; + + ChgTranslateMessageRet = false; + } + + return ChgTranslateMessageRet; + + } + + public static string CombineXMLReturnValue(ref string value_name, ref string name, ref string type, ref string schema, ref string value, ref string desc) + { + string CombineXMLReturnValueRet = default(string); + + try + { + CombineXMLReturnValueRet = "<" + value_name.Trim().ToLower() + ">" + "" + name + "" + "" + type + "" + "" + schema + "" + "" + value + "" + "" + desc + "" + ""; + } + + catch (Exception e1) + { + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + + } // New Exception("modWS.CombineXMLReturnValue: " & e1.Message) + + return CombineXMLReturnValueRet; + + } + + public static string CombineXMLException(ref string code, ref string sysmsg, ref string mesmsg, string stack = "") + { + string CombineXMLExceptionRet = default(string); + + // Edit by Yun 2006.8.9 加上 CInput + try + { + CombineXMLExceptionRet = "" + code + "" + "" + CInput(sysmsg) + "" + "" + CInput(mesmsg) + "" + "" + CInput(stack) + ""; + } + + catch (Exception e1) + { + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + + } // New Exception("modWS.CombineXMLException: " & e1.Message) + + return CombineXMLExceptionRet; + + } + + public static string CombineXMLMessage(string code, string type, string msg) + { + string CombineXMLMessageRet = default(string); + + try + { + CombineXMLMessageRet = "" + "" + code + "" + "" + type + "" + "" + msg + "" + ""; + } + catch (Exception e1) + { + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + + } // New Exception("modWS.CombineXMLMessage: " & e1.Message) + + return CombineXMLMessageRet; + + } + + public static string CombineXMLResponse(string Identity, string ReturnValue = null, List Exception = null, string Result = null, List Message = null) + { + string CombineXMLResponseRet = default(string); + + try + { + // + CombineXMLResponseRet = "" + '\n'; + + // + if (string.IsNullOrEmpty(Identity)) + { + CombineXMLResponseRet += '\t' + "" + '\n'; + } + else + { + CombineXMLResponseRet += '\t' + "" + '\n'; + CombineXMLResponseRet += Identity + '\n'; + CombineXMLResponseRet += '\t' + "" + '\n'; + } + + // + if (string.IsNullOrEmpty(ReturnValue)) + { + CombineXMLResponseRet += '\t' + "" + '\n'; + } + else + { + CombineXMLResponseRet += '\t' + "" + '\n'; + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + ReturnValue + '\n'; + CombineXMLResponseRet += '\t' + "" + '\n'; + } + + // + if (string.IsNullOrEmpty(Result)) + { + CombineXMLResponseRet += '\t' + "" + '\n'; + } + else + { + CombineXMLResponseRet += '\t' + "" + Result + "" + '\n'; + } + + // + string strExceptionSysmsg = string.Empty; + string strExceptionMesmsg = string.Empty; + string strExceptionStack = string.Empty; + + if (Exception.Count == 0) + { + CombineXMLResponseRet += '\t' + "" + '\n'; + } + else + { + // 2016-12-01, Joe, Exception轉語系 + ChgTranslateException(Exception, ref strExceptionSysmsg, ref strExceptionMesmsg, ref strExceptionStack); + + CombineXMLResponseRet += '\t' + "" + '\n'; + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + AppSettings["defWSErrCode"] + "" + '\n'; + if (string.IsNullOrEmpty(strExceptionSysmsg) == true) + { + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + '\n'; + } + else + { + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + '\n' + strExceptionSysmsg + '\n' + '\t' + '\t' + "" + '\n'; + } + if (string.IsNullOrEmpty(strExceptionMesmsg) == true) + { + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + strExceptionMesmsg + "" + '\n'; + } + else + { + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + '\n' + strExceptionMesmsg + '\n' + '\t' + '\t' + "" + '\n'; + } + if (string.IsNullOrEmpty(strExceptionStack)) + { + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + '\n'; + } + else + { + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + '\n' + strExceptionStack + '\n' + '\t' + '\t' + "" + '\n'; + } + CombineXMLResponseRet += '\t' + "" + '\n'; + } + + // + string strMmsg = string.Empty; + + if (Message.Count == 0) + { + CombineXMLResponseRet += '\t' + "" + '\n'; + } + else + { + CombineXMLResponseRet += '\t' + "" + '\n'; + // 2016-12-01, Joe, Message轉語系 + // Call ChgTranslateMessage(Message, strMmsg) + + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + AppSettings["defMSGCode"] + "" + '\n'; + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + AppSettings["defMSGType"] + "" + '\n'; + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + strMmsg + "" + '\n'; + CombineXMLResponseRet += '\t' + "" + '\n'; + } + + CombineXMLResponseRet += "" + '\n'; + } + + catch (Exception e1) + { + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + // Throw 'New Exception("modWS.CombineXMLResponse: " & e1.Message) + CombineXMLResponseRet = "" + '\n'; + CombineXMLResponseRet += '\t' + "" + '\n'; + CombineXMLResponseRet += '\t' + "" + '\n'; + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + '\n'; + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + '\n'; + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + '\t' + e1.Message + '\n'; + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + '\n'; + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + '\n'; + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + '\t' + "CombineXMLResponse;Fail" + '\n'; + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + '\n'; + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + '\n'; + CombineXMLResponseRet += e1.StackTrace + '\n'; + CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + '\n'; + CombineXMLResponseRet += '\t' + "" + '\n'; + CombineXMLResponseRet += '\t' + "" + '\n'; + CombineXMLResponseRet += ""; + } + + return CombineXMLResponseRet; + + } + + public static string CombineXMLResponse(ref string Identity, ref string ReturnValue, ref string Exception, ref string Result, ref string Message) + { + string CombineXMLResponseRet = default(string); + + try + { + CombineXMLResponseRet = "" + Identity + ""; + + if (!string.IsNullOrEmpty(ReturnValue)) + { + CombineXMLResponseRet = CombineXMLResponseRet + "" + ReturnValue + ""; + } + + if (!string.IsNullOrEmpty(Exception)) + { + CombineXMLResponseRet = CombineXMLResponseRet + "" + Exception + ""; + } + + CombineXMLResponseRet = CombineXMLResponseRet + "" + Result + ""; + + if (!string.IsNullOrEmpty(Message)) + { + CombineXMLResponseRet = CombineXMLResponseRet + "" + Message + ""; + } + + CombineXMLResponseRet = CombineXMLResponseRet + ""; + } + + catch (Exception e1) + { + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + + } // New Exception("modWS.CombineXMLResponse: " & e1.Message) + + return CombineXMLResponseRet; + + } + + // 2016-02-03, Joe, 調整Response XML架構 + + public static string CombineXMLResponse_Parameter(string key = defString, string type = defString, DataTable[] dtTemp = null, bool IsDetail = false) + { + string CombineXMLResponse_ParameterRet = default(string); + + int i = 0; + var XmlDoc = new XmlDocument(); + XmlElement nodeParameter = null; + if ((key ?? "") != defString | (type ?? "") != defString) + { + nodeParameter = XmlDoc.CreateElement("parameter"); + if ((key ?? "") != defString) + nodeParameter.SetAttribute("key", key); + if ((type ?? "") != defString) + nodeParameter.SetAttribute("type", type); + XmlDoc.AppendChild(nodeParameter); + } + + if (!(dtTemp[0] == null)) + { + // For iTable As Integer = 0 To dtTemp.Length - 1 + // If dtTemp(iTable) Is Nothing Then Continue For + i = 0; + + XmlElement nodeData; + XmlElement nodeDetail = null; + XmlElement nodeTemp; + if (IsDetail == false) + { + nodeData = XmlDoc.CreateElement("data"); + nodeTemp = nodeData; + } + else + { + nodeDetail = XmlDoc.CreateElement("detail"); + nodeTemp = nodeDetail; + } + + // 除第一個table外其他視為第二階 + nodeTemp.SetAttribute("name", dtTemp[0].TableName); + XmlElement nodeField; + foreach (DataRow dr in dtTemp[0].Rows) + { + + var nodeRow = XmlDoc.CreateElement("row"); + i = i + 1; + nodeRow.SetAttribute("seq", i.ToString()); + foreach (DataColumn dc in dtTemp[0].Columns) + { + nodeField = XmlDoc.CreateElement("field"); + nodeField.SetAttribute("name", dc.ColumnName.ToLower()); + nodeField.SetAttribute("type", "string"); + nodeField.InnerText = dr[dc].ToString(); + nodeRow.AppendChild(nodeField); + } + if (IsDetail == false) + { + for (int iTable = 1, loopTo = dtTemp.Length - 1; iTable <= loopTo; iTable++) + CombineXMLResponse_Parameter(dtTemp: new DataTable[] { dtTemp[iTable] }, IsDetail: true); + } + nodeTemp.AppendChild(nodeRow); + } + if (IsDetail == false) + { + nodeParameter.AppendChild(nodeTemp); + } + else + { + nodeDetail.AppendChild(nodeTemp); + } + // Next + } + + CombineXMLResponse_ParameterRet = XmlDoc.InnerXml; + return CombineXMLResponse_ParameterRet; + + } + + public static string FormatXMLSchema(ref string XmlSchema) + { + string FormatXMLSchemaRet = default(string); + + int intTruncateLength; + + try + { + FormatXMLSchemaRet = ""; + + // 將Schema字串的前面一行刪除,以符合XML格式 + intTruncateLength = Strings.InStr(XmlSchema, "?>") + 1; + if (intTruncateLength != 1) + { + FormatXMLSchemaRet = Strings.Right(XmlSchema, Strings.Len(XmlSchema) - intTruncateLength); + } + else + { + FormatXMLSchemaRet = XmlSchema; + } + } + + catch (Exception e1) + { + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + + } // New Exception("modWS.FormatXMLSchema: " & e1.Message) + + return FormatXMLSchemaRet; + + } + + #endregion + + #region --- for Message Change Resource use--- + + /// + /// 2020/05/17 OwenLiu, Mantis:0071895, 讀取語系檔案到 Dictionary + /// + /// + /// + private static Dictionary funReadResourceFile_Dictionary(string ResourceFilePath) + { + + var oReturnResource = new Dictionary(); + + try + { + var reader = new ResourceReader(ResourceFilePath); + var en = reader.GetEnumerator(); + + while (en.MoveNext()) + oReturnResource.Add(Conversions.ToString(en.Key), Conversions.ToString(en.Value)); + reader.Close(); + } + catch (Exception ex) + { + throw; + } + + return oReturnResource; + + } + + /// + /// 2020/05/15 OwenLiu, Mantis:0071895, 增加多語系檔案的語系轉換機制 + /// + /// + /// + /// + /// + private static bool funGetResouceValueText(string sourceFile, string pKey, ref string pResValue) + { + + bool blnResult = false; + ResourceSet rmGen = null; + + try + { + using (var fs = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read)) + { + rmGen = new ResourceSet(fs); + fs.Close(); + } + + pResValue = rmGen.GetString(pKey.ToUpper()); + if (!string.IsNullOrEmpty(pResValue)) + blnResult = true; + } + catch (Exception ex) + { + throw; + } + + return blnResult; + + } + + /// + /// 2020/05/15 OwenLiu, Mantis:0071895, 取回所有語系檔案的 ResourceManager Array + /// + /// + /// + /// + /// + private static bool funGetMultiResourceManager(string pResourcePath, string pLanguageMode, ref ResourceManager oResourceManager, ref Dictionary[] oResourceDictionary) + { + + bool blnResult = false; + string strResourceFile = "mesresource"; + + try + { + + if (!string.IsNullOrEmpty(pLanguageMode)) + { + strResourceFile += "." + pLanguageMode; + } + else + { + strResourceFile += ".en"; + } + + if (new DirectoryInfo(pResourcePath).Exists == false) + { + oResourceManager = null; + return blnResult; + } + + // 一次性建立多個ResourceManager, 以節省控制項的語系轉換須多次開檔的時間(控制項一定會有多個) + int intIndex = 0; + short intResouceFileQty = 2; + if (intResouceFileQty == 1) + { + oResourceDictionary = null; + } + else if (intResouceFileQty > 1) + { + oResourceDictionary = new Dictionary[intResouceFileQty - 2 + 1]; + } + oResourceManager = ResourceManager.CreateFileBasedResourceManager(strResourceFile, pResourcePath, null); + oResourceDictionary[0] = funReadResourceFile_Dictionary(pResourcePath + @"\" + strResourceFile + ".resources91"); + + blnResult = true; + } + + catch (Exception ex) + { + throw; + } + + return blnResult; + + } + + + /// + /// 2020/05/15 OwenLiu, Mantis:0071895, 從所有語系檔案的 ResourceManager Array 取出對應的語系值 + /// + /// + /// + /// + private static string funGetResourceManager_Text(string pKey, ref ResourceManager oResourceManager, ref Dictionary[] oResourceDictionary) + { + string strResult = ""; + bool blnKeyExists = false; + + do + { + try + { + + // 先搜尋Dictionary 是否有對應的Key + if (oResourceDictionary != null) + { + foreach (Dictionary ResourceDic in oResourceDictionary) + { + if (ResourceDic.ContainsKey(pKey)) + { + strResult = ResourceDic[pKey]; + blnKeyExists = true; + break; + } + } + } + + if (!blnKeyExists) + { + // 未找到Key, 搜尋ResourceManager + strResult = oResourceManager.GetString(pKey); + if (!string.IsNullOrEmpty(strResult)) + break; + } + } + + catch (Exception ex) + { + } + } + // Throw + while (false); + + return strResult; + + } + + public static string TranslateMsg(string Message) + { + string TranslateMsgRet = default(string); + + // 1.Check LanguageMode + string strFileName, strGenFile; + string LanguageMode = AppSettings.Get("LanguageMode"); + if (string.IsNullOrEmpty(LanguageMode)) + { + strFileName = "mesresource.en"; + strGenFile = "mesresource.en"; + } + else + { + strFileName = "mesresource." + LanguageMode; + strGenFile = "mesresource." + LanguageMode; + } + + // 2.Get File Path + string strResourcePath = ""; + string strResourceDirectory = AppSettings.Get("ResourceDir"); + + // 2016/05/13 YF, 修改Server.MapPath取得實體路徑 + if (HttpContext.Current != null && HttpContext.Current.Server != null) + { + strResourcePath = HttpContext.Current.Server.MapPath("./" + strResourceDirectory); + } + + string strErrName_Rep = ""; + + // 檢查檔案是否存在 + if (File.Exists(strResourcePath + "/" + strFileName + ".resources") == true) + { + // 4.Replace原始訊息. + if (Strings.InStr(Message, "[%", CompareMethod.Text) > 0) + { + // Replace[%%] + // Dim rmGen As ResourceManager = ResourceManager.CreateFileBasedResourceManager(strGenFile, strResourcePath, Nothing) + // 2014/03/20 Hank, 修正讀取Resources檔造成佔用的情形 + // Dim fs As New FileStream(strResourcePath.ToString & "/" & strFileName & ".resources", FileMode.Open, FileAccess.Read, FileShare.Read) + // Dim rmGen As New ResourceSet(fs) + // fs.Close() + + // 2020/05/20 OwenLiu, Mantis:0071895, 增加多語系檔案的語系轉換機制 + ResourceManager ResourceMgr = null; + Dictionary[] ResourceDictionary = null; + funGetMultiResourceManager(strResourcePath, LanguageMode, ref ResourceMgr, ref ResourceDictionary); + + string strKey, strKeyValue; + int intStart, j, k, l; + + intStart = 1; + j = 1; + + while (j != 0) + { + j = Strings.InStr(intStart, Message, "[%", CompareMethod.Text); + if (j == 0) + { + strErrName_Rep += Strings.Mid(Message, intStart); + } + else + { + k = Strings.InStr(j + 2, Message, "%]", CompareMethod.Text); + if (k == 0) + { + // 找不到對應的結束字元. + strErrName_Rep += Strings.Mid(Message, intStart); + j = 0; + } + else + { + // 檢查是否有不對稱的情況. + l = Strings.InStr(j + 2, Message, "[%", CompareMethod.Text); + if (l == 0 || l > k) + { + strErrName_Rep += Strings.Mid(Message, intStart, j - intStart); + strKey = Strings.Mid(Message, j + 2, k - j - 2); + // 將Key執行語系轉換 + try + { + // 2020/05/20 OwenLiu, Mantis:0071895, 增加多語系檔案的語系轉換機制 + strKeyValue = funGetResourceManager_Text(strKey.ToUpper(), oResourceManager: ref ResourceMgr, oResourceDictionary: ref ResourceDictionary); + } + 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(Message, "[%", k, CompareMethod.Text); + // 擷出不轉換的字串. + strErrName_Rep += Strings.Mid(Message, intStart, m - intStart); + strKey = Strings.Mid(Message, m + 2, k - m - 2); + // 將Key執行語系轉換 + try + { + // 2020/05/20 OwenLiu, Mantis:0071895, 增加多語系檔案的語系轉換機制 + strKeyValue = funGetResourceManager_Text(strKey.ToUpper(), oResourceManager: ref ResourceMgr, oResourceDictionary: ref ResourceDictionary); + } + catch (Exception ex) + { + strKeyValue = strKey; + } + if (string.IsNullOrEmpty(strKeyValue)) + { + strErrName_Rep += strKey; + } + else + { + strErrName_Rep += strKeyValue; + } + // 下次截取字串的起始位置 + intStart = k + 2; + } + } + } + } + + ResourceMgr = null; + ResourceDictionary = null; + } + else + { + strErrName_Rep = Message; + } + } + else + { + strErrName_Rep = Message.Replace("[%", "").Replace("%]", ""); + } + + TranslateMsgRet = strErrName_Rep; + return TranslateMsgRet; + + } + + public static string TranslateMsg(string Message, string pLanguage) + { + string TranslateMsgRet = default(string); + + // 1.Check LanguageMode + string strFileName, strGenFile; + string LanguageMode = pLanguage; + if (string.IsNullOrEmpty(LanguageMode)) + { + strFileName = "mesresource.en"; + strGenFile = "mesresource.en"; + } + else + { + strFileName = "mesresource." + LanguageMode; + strGenFile = "mesresource." + LanguageMode; + } + + // 2.Get File Path + string strResourcePath = ""; + string strResourceDirectory = AppSettings.Get("ResourceDir"); + + string strErrName_Rep = ""; + + if (HttpContext.Current != null && HttpContext.Current.Server != null) + { + strResourcePath = HttpContext.Current.Server.MapPath("./" + strResourceDirectory); + } + + // 檢查檔案是否存在 + if (File.Exists(strResourcePath + "/" + strFileName + ".resources") == true) + { + // 4.Replace原始訊息. + if (Strings.InStr(Message, "[%", CompareMethod.Text) > 0) + { + // Replace[%%] + // Dim rmGen As ResourceManager = ResourceManager.CreateFileBasedResourceManager(strGenFile, strResourcePath, Nothing) + // 2014/03/20 Hank, 修正讀取Resources檔造成佔用的情形 + // Dim fs As New FileStream(strResourcePath.ToString & "/" & strFileName & ".resources", FileMode.Open, FileAccess.Read, FileShare.Read) + // Dim rmGen As New ResourceSet(fs) + // fs.Close() + + // 2020/05/20 OwenLiu, Mantis:0071895, 增加多語系檔案的語系轉換機制 + ResourceManager ResourceMgr = null; + Dictionary[] ResourceDictionary = null; + funGetMultiResourceManager(strResourcePath, pLanguage, ref ResourceMgr, ref ResourceDictionary); + + string strKey, strKeyValue; + int intStart, j, k, l; + + intStart = 1; + j = 1; + + while (j != 0) + { + j = Strings.InStr(intStart, Message, "[%", CompareMethod.Text); + if (j == 0) + { + strErrName_Rep += Strings.Mid(Message, intStart); + } + else + { + k = Strings.InStr(j + 2, Message, "%]", CompareMethod.Text); + if (k == 0) + { + // 找不到對應的結束字元. + strErrName_Rep += Strings.Mid(Message, intStart); + j = 0; + } + else + { + // 檢查是否有不對稱的情況. + l = Strings.InStr(j + 2, Message, "[%", CompareMethod.Text); + if (l == 0 || l > k) + { + strErrName_Rep += Strings.Mid(Message, intStart, j - intStart); + strKey = Strings.Mid(Message, j + 2, k - j - 2); + // 將Key執行語系轉換 + try + { + // 2020/05/20 OwenLiu, Mantis:0071895, 增加多語系檔案的語系轉換機制 + strKeyValue = funGetResourceManager_Text(strKey.ToUpper(), oResourceManager: ref ResourceMgr, oResourceDictionary: ref ResourceDictionary); + } + 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(Message, "[%", k, CompareMethod.Text); + // 擷出不轉換的字串. + strErrName_Rep += Strings.Mid(Message, intStart, m - intStart); + strKey = Strings.Mid(Message, m + 2, k - m - 2); + // 將Key執行語系轉換 + try + { + // 2020/05/20 OwenLiu, Mantis:0071895, 增加多語系檔案的語系轉換機制 + strKeyValue = funGetResourceManager_Text(strKey.ToUpper(), oResourceManager: ref ResourceMgr, oResourceDictionary: ref ResourceDictionary); + } + catch (Exception ex) + { + strKeyValue = strKey; + } + if (string.IsNullOrEmpty(strKeyValue)) + { + strErrName_Rep += strKey; + } + else + { + strErrName_Rep += strKeyValue; + } + // 下次截取字串的起始位置 + intStart = k + 2; + } + } + } + } + + ResourceMgr = null; + ResourceDictionary = null; + } + else + { + strErrName_Rep = Message; + } + } + else + { + strErrName_Rep = Message.Replace("[%", "").Replace("%]", ""); + } + + TranslateMsgRet = strErrName_Rep; + return TranslateMsgRet; + + } + + #endregion + + public static string CInput_Singlequotation(string strInput) + { + string CInput_SinglequotationRet = strInput; + + // 若為空字串,導致傳入資料變為Nothing + if (string.IsNullOrEmpty(strInput)) + return CInput_SinglequotationRet; + + // 將傳入值內的單引號轉換為可存入資料庫的格式 + // 傳入值: strInput包含特殊字元的字串 + // 傳回值: 將特殊字元變更為代替符號的字串 + + // 轉換 ' 為 '' (單引號轉為兩個單引號) + CInput_SinglequotationRet = Strings.Replace(strInput, "'", "''"); + return CInput_SinglequotationRet; + + // 17046 20230110 因EAI等接口,已接收InXML字串做 xmlDoc.LoadXml(InXml)解析通過,因此不需再各function做CInput,會將轉換後特殊字又處理一次造成寫入後端錯誤, + // 增加一支轉換函式CInput_Singlequotation,僅做單引號轉換,EAI接口中原本呼叫CInput的地方取代為CInput_Singlequotation + + } + + } +} \ No newline at end of file diff --git a/MESEAI/EAICws/EAICws/obj/Debug/.NETFramework,Version=v4.6.2.AssemblyAttributes.cs b/MESEAI/EAICws/EAICws/obj/Debug/.NETFramework,Version=v4.6.2.AssemblyAttributes.cs new file mode 100644 index 0000000..edc4647 --- /dev/null +++ b/MESEAI/EAICws/EAICws/obj/Debug/.NETFramework,Version=v4.6.2.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] diff --git a/MESEAI/EAICws/EAICws/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/MESEAI/EAICws/EAICws/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000000000000000000000000000000000000..e382d809a6833c9128311a2a6c9a962c390d2f2e GIT binary patch literal 7257 zcmeHMZByGu5Vm=_UZ&#d0?gzCv7vDTl(8su1~KF;oy`TkICm$E z!|+@B3p)LY?XGN#*U)^hX7a&eygu$_pS``6^z1s3Oe7Nj!iC>>-R=WnuX9WI(yuCg zo6CSYh6-%%>jmF+eXmqp$!Ob5NbY;Da`So?|1w%3a8w}JD~|dT4DtFkVMLnC_RI$!X?3L5iz;RXuby>p~hn=A< zT7j{N3uCLkW5a$QVdoYVHKw9vMo^JVZGaN_l-E38up+Bca7D?J3hXs36w(tm!H=Dy6~&uA>7rt zU^On4Xr3)d!NwFr7v2X&=bdp5W%AO{y6^ErCLUkkUF5Rv&?W+2Uf2$_>DIzc;af~f zUo3<5T*00o6|q;pIgk&vh2d*Ugjn{zED%+@WWnr-TH;A zOD20E8b=gGcT*h7zwnsq@(t7r&^ThK7ogpGaqcCN2dDZ$45tRLIfw%2Kq7Su1bhvl zNTC=;F#=+k+y&4nWI^KUZ2TyC}^8*t{k6| zJD_R1xMcG66~oM#M!8@@Yh}4)!l%%XoiD%g-Yl|8Py;D}Vr~HqDl_RjM-k^e<2<@W ztpk?&3QZjY@!+C09ctgQilkx21kTVRgSF6JGL8z`v%ZG*fGfE}CZIJ8y;(h<&F2&NI z6Fry+2Gk&R(85eYdv?4q|J;l`thG-P*!HUJfx%?5hxOp_AFPatZnRO?qL8f9B zIfcAPDsD-0gEbVeWlSu8lW=6XyKe#3jb(Qc2ggJ(5UnUdNDUzEcp(J~H}@Ejj^acr zQblzX5YuP*Z;1U}+`A01(VtHMX+O?gBFIw!vEl^TU@G+6_W*PdH_#iU>LJ<>ac^sf zRYIU2;|BWEbwZ$Lar+N}*0}cp(FX9n++&kHHrds>Nw<@+kofFFy~>q?`;vcTL;FXq z0xFFBGZ4L~uGW)!#Ud;nf3mI>N8ES&@VlHk@9qr^rJlo6uXCj_E5Twqc>&^&Sl(P| zOnO3$pP(_Y3We|_CO~0Ubl#XGW<*zd)0iURmBus)?Ik~hm^vw3TbVy4I*g8=yy2e0 zS}Yc6OK|g?l3$?z{>j$$W#{H8$-;PdGOrwH8a*k~1~PmsOrMe&=$g8cjO`oy#kDmv zjp-C7jU*2uo>L&Rpn5Ns174*TwIN+ehv^!?+zL+>j~uW5zk3g<|NDKb_mGNyci0>G E4+@!Q5C8xG literal 0 HcmV?d00001 diff --git a/MESEAI/EAICws/EAICws/obj/Debug/EAIws_C.csproj.AssemblyReference.cache b/MESEAI/EAICws/EAICws/obj/Debug/EAIws_C.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..bf627670fa52d08384d7a48c9dbf3d57b39d605f GIT binary patch literal 4613 zcmdT{&rcLF6rTDMK{P}~F_91x6TLJbNRW$xWr+uum|X-9lbF(dyEJs#vF!rug|mN) zF)>~|`bQY={t@1FI?k}WWiG?aChMH0)5+KOzW2S?_iF3)Mg^g(p64M_S@mBl*;XW& z+hiQ{+~ebwTn4!E;7>XOG{^A{`JA|(j&1i;C*DR9=jiqj*OV;I#2c0AzV;Vd(7A?Ph z@ONgGetnF0B9tqQt~L-9!npkp1Mf1?lt&tGM(pZBh*JsT283L80}v(`+?N;cPNsg2 zucl6>a5W-G8w$fsB-T}=f?RgFNY?fG79-x zDYrn+B&bzkK!u8FCvAYB3Ec!=V$w@Tnj_a zXnfnBi-CpjD?6W;x1QOuY#W0|33f#Wp%hVzT9ZxS*ve^52x;Pz@-g8a@i1k=RRoTP zC?l!l`S4wOO6>%u6Jyh!u|nv6-j>ld@J@o61T6A8N{3=T-%22@aL=U!*T&i2+_v6f zyoui!#+ivGSZrs;Li(L?u}^2;La_H;*lnT@N-($VK`_p=fyw)Dm>rN!-8g?6V5-Lk gL|n@<`XM`Tmo^%ty-eYIsEqqMHKyQbdnRyy0fwO_YybcN literal 0 HcmV?d00001 diff --git a/MESEAI/EAICws/EAICws/packages.config b/MESEAI/EAICws/EAICws/packages.config new file mode 100644 index 0000000..719b370 --- /dev/null +++ b/MESEAI/EAICws/EAICws/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/MESEAI/EAItc/EAItc_C.csproj b/MESEAI/EAItc/EAItc_C.csproj new file mode 100644 index 0000000..a5c5da1 --- /dev/null +++ b/MESEAI/EAItc/EAItc_C.csproj @@ -0,0 +1,275 @@ + + + + + Debug + AnyCPU + {443394E0-F618-0D60-04C0-E207199604A2} + Library + tcEAI_C + tcEAI_C + 512 + Windows + v4.6.2 + SAK + SAK + SAK + SAK + + $(DefaultItemExcludes);$(ProjectDir)**\*.vb + + + true + full + true + true + ..\..\MES_S_DLL\ + ..\..\MES_S_DLL\tcEAI_C.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + AnyCPU + false + + + pdbonly + false + true + true + ..\..\MES_S_DLL\ + ..\..\MES_S_DLL\tcEAI_C.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + false + + + On + + + Binary + + + Off + + + On + + + + False + ..\..\MES_S_DLL\Apache.NMS.dll + False + + + False + ..\..\MES_S_DLL\Apache.NMS.ActiveMQ.dll + False + + + False + ..\..\MES_S_DLL\BouncyCastle.Crypto.dll + False + + + False + ..\..\MES_S_DLL\data_access_service.dll + False + + + False + ..\..\MES_S_DLL\iMESAppSetting.dll + False + + + False + ..\..\MES_S_DLL\iMESCIOC.dll + + + False + ..\..\MES_S_DLL\iMESComSubroutine.dll + False + + + False + ..\..\MES_S_DLL\iMESComXML.dll + False + + + False + ..\..\MES_S_DLL\iMESConst.dll + False + + + False + ..\..\..\..\环境\MESws_API\bin\iMESUserManager.dll + + + False + ..\..\MES_S_DLL\iMESWIPReleaseLogHandler.dll + + + False + ..\..\..\..\环境\MESws_API\bin\kcEAP.dll + + + False + ..\..\..\..\环境\MESws_API\bin\kcEMS.dll + + + False + ..\..\MES_S_DLL\\kcENT.dll + + + False + ..\..\MES_S_DLL\kcEQP.dll + + + False + ..\..\MES_S_DLL\\kcOE.dll + + + False + ..\..\MES_S_DLL\\kcOP.dll + + + False + ..\..\MES_S_DLL\\kcSMD.dll + + + False + ..\..\MES_S_DLL\\kcSYS.dll + + + False + ..\..\..\..\环境\MESws_API\bin\kcUSR.dll + + + False + ..\..\MES_S_DLL\kcWIP.dll + + + + ..\..\MES_S_DLL\iMESCIO.dll + False + + + ..\..\MES_S_DLL\iMESDataObject.dll + False + + + ..\..\MES_S_DLL\iMESException.dll + False + + + False + ..\..\MES_S_DLL\iMESLog.dll + + + ..\..\MES_S_DLL\kcMTL.dll + False + + + ..\..\MES_S_DLL\kcPRD.dll + False + + + ..\..\MES_S_DLL\kcQC.dll + False + + + ..\..\MES_S_DLL\kcSPC.dll + + + False + + + + + + + + + + + False + ..\..\MES_S_DLL\tcEAI.dll + + + False + ..\..\MES_S_DLL\tcSPC_IC.dll + + + False + ..\..\MES_S_DLL\tcWIP_IC.dll + + + False + ..\..\MES_S_DLL\udReverse.dll + + + False + ..\..\MES_S_DLL\udSPC.dll + + + False + ..\..\MES_S_DLL\udSYS.dll + + + False + ..\..\MES_S_DLL\udSYS_Customer.dll + + + False + ..\..\MES_S_DLL\\udUnitTransferFunction.dll + + + False + ..\..\MES_S_DLL\udWIP.dll + + + + + + + + + + + + + + + + + + + + + + + True + Application.myapp + + + True + Settings.settings + True + + + + + MyApplicationCodeGenerator + Application.Designer.cs + + + SettingsSingleFileGenerator + tcEAI_C.My + Settings.Designer.cs + + + + + \ No newline at end of file diff --git a/MESEAI/EAItc/EAItc_C.csproj.user b/MESEAI/EAItc/EAItc_C.csproj.user new file mode 100644 index 0000000..99e946b --- /dev/null +++ b/MESEAI/EAItc/EAItc_C.csproj.user @@ -0,0 +1,6 @@ + + + + D:\iMES\LQ\环境\DefaultSite\MESws_STD\bin\ + + \ No newline at end of file diff --git a/MESEAI/EAItc/My Project/Application.Designer.cs b/MESEAI/EAItc/My Project/Application.Designer.cs new file mode 100644 index 0000000..299bbe3 --- /dev/null +++ b/MESEAI/EAItc/My Project/Application.Designer.cs @@ -0,0 +1,11 @@ +// ------------------------------------------------------------------------------ +// +// 這段程式碼是由工具產生的。 +// 執行階段版本:4.0.30319.42000 +// +// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼, +// 變更將會遺失。 +// +// ------------------------------------------------------------------------------ + + diff --git a/MESEAI/EAItc/My Project/Application.myapp b/MESEAI/EAItc/My Project/Application.myapp new file mode 100644 index 0000000..758895d --- /dev/null +++ b/MESEAI/EAItc/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 1 + true + diff --git a/MESEAI/EAItc/My Project/AssemblyInfo.cs b/MESEAI/EAItc/My Project/AssemblyInfo.cs new file mode 100644 index 0000000..805a6dd --- /dev/null +++ b/MESEAI/EAItc/My Project/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System; +using System.Reflection; +using System.Runtime.InteropServices; + +// 組件的一般資訊是由下列的屬性集控制。 +// 變更這些屬性的值即可修改組件的相關 +// 資訊。 + +// 檢閱組件屬性的值 + +[assembly: AssemblyTitle("EAItc_C")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("EAItc")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] + +[assembly: ComVisible(false)] + +// 下列 GUID 為專案公開 (Expose) 至 COM 時所要使用的 typelib ID +[assembly: Guid("c6f5bc9b-8482-4694-8df4-0b0a3f7b9707")] + +// 組件的版本資訊由下列四個值所組成: +// +// 主要版本 +// 次要版本 +// 組建編號 +// 修訂編號 +// +// 您可以指定所有的值,也可以依照以下的方式,使用 '*' 將組建和修訂編號 +// 指定為預設值: +// + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/MESEAI/EAItc/My Project/Resources.resx b/MESEAI/EAItc/My Project/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/MESEAI/EAItc/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/MESEAI/EAItc/My Project/Settings.Designer.cs b/MESEAI/EAItc/My Project/Settings.Designer.cs new file mode 100644 index 0000000..d651d7b --- /dev/null +++ b/MESEAI/EAItc/My Project/Settings.Designer.cs @@ -0,0 +1,88 @@ +// ------------------------------------------------------------------------------ +// +// 這段程式碼是由工具產生的。 +// 執行階段版本:4.0.30319.42000 +// +// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼, +// 變更將會遺失。 +// +// ------------------------------------------------------------------------------ + +using System.Diagnostics; +using Microsoft.VisualBasic; + + +namespace tcEAI_C.My +{ + + [System.Runtime.CompilerServices.CompilerGenerated()] + [System.CodeDom.Compiler.GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Advanced)] + internal sealed partial class MySettings : System.Configuration.ApplicationSettingsBase + { + + private static MySettings defaultInstance = (MySettings)Synchronized(new MySettings()); + + #region My.Settings 自動儲存功能 + /* TODO ERROR: Skipped IfDirectiveTrivia + #If _MyType = "WindowsForms" Then + *//* TODO ERROR: Skipped DisabledTextTrivia + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub + *//* TODO ERROR: Skipped EndIfDirectiveTrivia + #End If + */ + #endregion + + public static MySettings Default + { + get + { + + /* TODO ERROR: Skipped IfDirectiveTrivia + #If _MyType = "WindowsForms" Then + *//* TODO ERROR: Skipped DisabledTextTrivia + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If + *//* TODO ERROR: Skipped EndIfDirectiveTrivia + #End If + */ + return defaultInstance; + } + } + } +} + +namespace tcEAI_C.My +{ + + [HideModuleName()] + [DebuggerNonUserCode()] + [System.Runtime.CompilerServices.CompilerGenerated()] + internal static class MySettingsProperty + { + + [System.ComponentModel.Design.HelpKeyword("My.Settings")] + internal static MySettings Settings + { + get + { + return MySettings.Default; + } + } + } +} \ No newline at end of file diff --git a/MESEAI/EAItc/My Project/Settings.settings b/MESEAI/EAItc/My Project/Settings.settings new file mode 100644 index 0000000..85b890b --- /dev/null +++ b/MESEAI/EAItc/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/MESEAI/EAItc/clsCom.cs b/MESEAI/EAItc/clsCom.cs new file mode 100644 index 0000000..23c6719 --- /dev/null +++ b/MESEAI/EAItc/clsCom.cs @@ -0,0 +1,340 @@ +using System; +using System.Reflection; +using Apache.NMS; +using Microsoft.VisualBasic; + +namespace tcEAI_C +{ + + /// +/// 20211027 13871,共用功能 +/// + public class clsCom + { + + /// + /// 20211027 13871,Reflection方法 + /// + /// DLL Name + /// Class Name + /// Function Name + /// + /// + /// + public static bool DetermineCustomized_Constructor(string strComponent, string strClassName, string strMethodName, ref MethodInfo mi, ref object obj) + { + bool DetermineCustomized_ConstructorRet = default(bool); + bool blnResult = false; + + DetermineCustomized_ConstructorRet = false; + try + { + blnResult = DetermineMethod_Constructor(strComponent, strClassName, strMethodName, ref mi, ref obj); + } + catch (Exception ex) + { + } + + finally + { + DetermineCustomized_ConstructorRet = blnResult; + } + + return DetermineCustomized_ConstructorRet; + + } + + /// + /// 20211027 13871,Reflection找出Method + /// + public static bool DetermineMethod_Constructor(string strComponent, string strClassName, string strMethodName, ref MethodInfo mi, ref object obj) + { + string strAppBase = AppDomain.CurrentDomain.BaseDirectory; + string strFilePath = ""; + Assembly mainAssembly; + Type t; + Type[] argumentTypes; + ConstructorInfo ctor; + + MethodInfo[] aryMethos; + + try + { + strFilePath = strAppBase.TrimEnd('\\') + @"\bin\" + strComponent; + mainAssembly = Assembly.LoadFrom(strFilePath); + t = mainAssembly.GetType(mainAssembly.GetName().Name + "." + strClassName, true, true); + // 20211211 13871,支援Module + if (t.GetConstructors().Length > 0) + { + argumentTypes = Type.EmptyTypes; + ctor = t.GetConstructor(argumentTypes); + obj = ctor.Invoke(new object[] { }); + } + strMethodName = Strings.Replace(strMethodName, ".", "_"); + aryMethos = t.GetMethods(); + foreach (MethodInfo item in aryMethos) + { + if ((strMethodName.ToUpper() ?? "") == (item.Name.ToUpper() ?? "")) + { + mi = item; + return true; + } + } + + if (mi == null) + { + return false; + } + else + { + return true; + } + } + catch (Exception ex) + { + return false; + } + } + + /// + /// 20211027 13871,取得Method的參數預設值陣列 + /// + /// DLL Name,可不傳副檔名,會自動補.dll + /// Class Name + /// Method Name + /// + public static object[] funGetMethodParameters(string strComponent, string strClassName, string strMethodName) + { + object[] funGetMethodParametersRet = default(object[]); + try + { + var mi = default(MethodInfo); + var obj = default(object); + if (!strComponent.ToUpper().Contains(".DLL")) + { + strComponent = strComponent + ".dll"; + } + + if (!DetermineCustomized_Constructor(strComponent, strClassName, strMethodName, ref mi, ref obj)) + { + throw new iMESException.MESException("0000-200003", strComponent + "." + strClassName + "," + strMethodName + " [%METHOD%] [%NOT FOUND%]"); + } + + int iParameterLength = mi.GetParameters().Length; + var aryParameter = new object[iParameterLength]; + for (int i = 0, loopTo = mi.GetParameters().Length - 1; i <= loopTo; i++) + { + try + { + aryParameter[i] = mi.GetParameters()[i].DefaultValue; + } + catch (Exception) + { + if (mi.GetParameters()[i].ParameterType == typeof(DateTime)) + aryParameter[i] = default(DateTime); + else + throw; + } + } + funGetMethodParametersRet = aryParameter; + } + catch (Exception ex) + { + throw; + } + + return funGetMethodParametersRet; + } + + /// + /// 20211027 13871,執行指定DLL、Class、Method,無法執行多載Method + /// + /// DLL Name,可不傳副檔名,會自動補.dll + /// Class Name + /// Method Name + /// + public static object funExecuteMethod(string strComponent, string strClassName, string strMethodName, ref object[] aryParameters) + { + object funExecuteMethodRet = default(object); + try + { + var mi = default(MethodInfo); + var obj = default(object); + if (!strComponent.ToUpper().Contains(".DLL")) + { + strComponent = strComponent + ".dll"; + } + + if (!DetermineCustomized_Constructor(strComponent, strClassName, strMethodName, ref mi, ref obj)) + { + throw new iMESException.MESException("0000-200003", strComponent + "." + strClassName + "," + strMethodName + " [%METHOD%] [%NOT FOUND%]"); + } + + funExecuteMethodRet = mi.Invoke(obj, aryParameters); + } + + catch (Exception ex) + { + ex = funGetRealException(ex); + throw ex; + } + + return funExecuteMethodRet; + } + + // 20211208 13871,從clsEAP移植 + public static Exception funGetRealException(Exception ex) + { + Exception funGetRealExceptionRet = default(Exception); + try + { + funGetRealExceptionRet = ex; + + if (ex is TargetInvocationException && ex.InnerException != null) + { + funGetRealExceptionRet = funGetRealException(ex.InnerException); + } + } + catch (Exception ex2) + { + throw; + } + + return funGetRealExceptionRet; + } + + + + #region --- Combine Input Xml --- + + + public static string CombineXMLIdentity(ref string TransactionID, ref string ModuleID, ref string FunctionID, ref string ComputerName, ref string CurUserNo, ref string SendTime) + { + string CombineXMLIdentityRet = default(string); + CombineXMLIdentityRet = "" + TransactionID + "" + "" + ModuleID + "" + "" + FunctionID + "" + "" + ComputerName + "" + "" + CurUserNo + "" + "" + SendTime + ""; + return CombineXMLIdentityRet; + } + + public static string CombineXMLParameter(ref string value_name, ref string name, ref string type, ref string value, ref string desc) + { + string CombineXMLParameterRet = default(string); + + CombineXMLParameterRet = "<" + value_name.ToLower() + ">" + "" + name + "" + "" + type + "" + "" + value + "" + "" + desc + "" + ""; + return CombineXMLParameterRet; + + } + + public static string CombineXMLParameter(ref string name, ref string type, ref string value, ref string desc) + { + string CombineXMLParameterRet = default(string); + CombineXMLParameterRet = "<" + name.ToLower() + ">" + "" + name + "" + "" + type + "" + "" + value + "" + "" + desc + "" + ""; + return CombineXMLParameterRet; + } + + public static string CombineXMLValue(ref string TagName, ref string Value) + { + string CombineXMLValueRet = default(string); + CombineXMLValueRet = "<" + TagName + ">" + Value + ""; + return CombineXMLValueRet; + } + + public static string CombineXMLValueTag(ref string Value) + { + string CombineXMLValueTagRet = default(string); + CombineXMLValueTagRet = "" + Value + ""; + return CombineXMLValueTagRet; + } + + public static string CombineXMLRequest(ref string strIdentity, ref string strParameter) + { + string CombineXMLRequestRet = default(string); + + CombineXMLRequestRet = "" + "" + strIdentity + ""; + if (!string.IsNullOrEmpty(strParameter)) + { + CombineXMLRequestRet = CombineXMLRequestRet + "" + strParameter + ""; + } + CombineXMLRequestRet = CombineXMLRequestRet + ""; + return CombineXMLRequestRet; + + } + + public static string CombineXMLParameterMultiValue(ref string value_name, ref string name, ref string type, ref string value, ref string desc) + { + string CombineXMLParameterMultiValueRet = default(string); + // Value不用加上Tag + CombineXMLParameterMultiValueRet = "<" + value_name.ToLower() + ">" + "" + name + "" + "" + type + "" + value + "" + desc + "" + ""; + return CombineXMLParameterMultiValueRet; + } + + public static string CombineXMLAdditional(ref string strAdditional) + { + string CombineXMLAdditionalRet = default(string); + CombineXMLAdditionalRet = "" + strAdditional; + CombineXMLAdditionalRet = CombineXMLAdditionalRet + ""; + return CombineXMLAdditionalRet; + } + + public static string CombineAddXML_Add(ref string name, ref string type, ref string value) + { + string CombineAddXML_AddRet = default(string); + CombineAddXML_AddRet = "" + "" + name + "" + "" + type + "" + "" + value + "" + ""; + return CombineAddXML_AddRet; + } + + public static string CombineAddXML_Edit(ref string name, ref string type, ref string value) + { + string CombineAddXML_EditRet = default(string); + CombineAddXML_EditRet = "" + "" + name + "" + "" + type + "" + "" + value + "" + ""; + return CombineAddXML_EditRet; + } + + public static string CombineAddXML_Field(ref string name) + { + string CombineAddXML_FieldRet = default(string); + CombineAddXML_FieldRet = "" + "" + name + "" + ""; + return CombineAddXML_FieldRet; + } + + public static string CombineAddXML_Condition(string condition) + { + string CombineAddXML_ConditionRet = default(string); + + // 2007/03/22,sammi.呼叫CombineAddXML_Condition時,不可加CInput. + // 因CInput會將單引號轉成二個單引號,若Condition為下述範例時,會Error. + // strAdditional = CombineXMLAdditional(CombineAddXML_Condition("ModuleType in ('REWORK','SLR')")) + // strParameter += strAdditional + + CombineAddXML_ConditionRet = "" + condition + ""; + return CombineAddXML_ConditionRet; + + } + + public static string CInput(string strInput) + { + string CInputRet = default(string); + // 將傳入值內的單引號轉換為可存入資料庫的格式 + // 將傳入值內的 &, >, < 三個特殊字元轉換為XmlDocument可解譯之代替符號 + // 傳入值: strInput包含特殊字元的字串 + // 傳回值: 將特殊字元變更為代替符號的字串 + + // 轉換 ' 為 '' (單引號轉為兩個單引號) + CInputRet = Strings.Replace(strInput, "'", "''"); + + // 轉換 & 為 & + CInputRet = Strings.Replace(CInputRet, "&", "&"); + + // CInput = Replace(CInput, """", "''") 'AddFlow的Xml字串不可將雙引號轉為兩個單引號,XMLToFlow會Error + + // 轉換 > 為 > + CInputRet = Strings.Replace(CInputRet, ">", ">"); + + // 轉換 < 為 < + CInputRet = Strings.Replace(CInputRet, "<", "<"); + return CInputRet; + + } + + #endregion + } +} \ No newline at end of file diff --git a/MESEAI/EAItc/clsEAP.cs b/MESEAI/EAItc/clsEAP.cs new file mode 100644 index 0000000..8dd770d --- /dev/null +++ b/MESEAI/EAItc/clsEAP.cs @@ -0,0 +1,12080 @@ +using System; +using System.Data; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using static iMESCore.Base.iMESConst; +using static iMESCore.Base.iMESComXML; +using static iMESCore.Base.iMESComSubroutine; +using System.Collections.Generic; +using System.Collections; +using iMESCore.Settings; +using kcSYS; +using kcWIP; +using System.Data.Common; +using System.Linq; +using static iMESCore.DataBase.iMESSql; +using System.Xml; +using kcOP; +using kcUSR; +using Org.BouncyCastle.Asn1; +using static kcWIP.clsMaterialHandler; +using System.Net.NetworkInformation; +using System.IO; +using System.Reflection; +using System.Text; +using Newtonsoft.Json; +using iMESCIOC.Response.EAP; + +namespace tcEAI_C +{ + + public class clsEAP + { + + public static string strDataBaseType; + public static string strConnectionString; + private kcWIP.clsLot objLot = new kcWIP.clsLot(); + + + private static System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); // 用以讀取Xml字串 + + public static iMESWIPReleaseLogHandler.clsLotReleaseLogHandle objLotLog; + + private static udReverse.clsReverse objReverse = new udReverse.clsReverse(); + + private static clsDBCom objDBCom = new clsDBCom(); + + public static string strSQL = ""; + + #region 共用功能 ConbineXMLFunction + public static void SaveLog1(string LogMsg, string LogPath = "", string Json = "") + { + DateTime datLogTime = DateTime.Now; + string strLogFileName; + try + { + if (LogPath.Equals("")) + { + if (DriveExists("D")) + { + LogPath = @"D:\MESLOG"; + } + else + { + LogPath = System.IO.Directory.GetCurrentDirectory(); + } + + } + else if (!LogPath.EndsWith(@"\")) + LogPath += @"\Log"; + else + LogPath += "Log"; + + if (!Directory.Exists(LogPath)) + Directory.CreateDirectory(LogPath); + + string head = datLogTime.ToString("yyyy/MM/dd HH:mm:ss fff"); + LogMsg = head + System.Environment.NewLine + Json + System.Environment.NewLine + LogMsg + System.Environment.NewLine; + strLogFileName = LogPath + @"\" + "" + datLogTime.ToString("yyyyMMdd") + ".log"; + + using (System.IO.StreamWriter SW = new System.IO.StreamWriter(strLogFileName, true)) + { + SW.WriteLine(LogMsg); // 输出并换行 + SW.Flush(); // 刷新 + SW.Close(); // 关闭输出流 + } + } + catch (Exception ex) + { + } + } + public static bool DriveExists(string driveLetter) + { + try + { + // 获取所有驱动器信息 + DriveInfo[] allDrives = DriveInfo.GetDrives(); + foreach (DriveInfo drive in allDrives) + { + // 检查驱动器名称是否匹配 + if (drive.Name.StartsWith(driveLetter + ":")) + { + return true; // 找到匹配的驱动器,返回true + } + } + } + catch (Exception ex) + { + Console.WriteLine("发生错误:" + ex.Message); + } + return false; // 未找到匹配的驱动器,返回false + } + public static string CombineXMLRequest_AutoExecutionLot(string InXml, string functionid, string computername, DataTable dtLotInfo, string OPNo, string CurUserNo, string SendTime, bool blnRuleChk = true) + { + string CombineXMLRequest_AutoExecutionLotRet = default(string); + + string strLotXML = ""; + string strLotNoColumnName = ""; + if (dtLotInfo.Columns.Contains("Lot_ID")) + { + strLotNoColumnName = "Lot_ID"; + } + else if (dtLotInfo.Columns.Contains("LotNo")) + { + strLotNoColumnName = "LotNo"; + } + + string strrulecheckTag = ""; + if (!blnRuleChk) + { + strrulecheckTag = "false"; + } + + foreach (DataRow drTemp in dtLotInfo.Rows) + strLotXML = Conversions.ToString(strLotXML + Operators.ConcatenateObject(Operators.ConcatenateObject("", drTemp[strLotNoColumnName]), "")); + strLotXML += ""; + CombineXMLRequest_AutoExecutionLotRet = "" + " " + "" + Strings.Format(DateTime.Now, "yyyyMMddHHmmssfff") + "" + "" + functionid + "" + strLotXML + "" + computername + "" + "" + OPNo + "" + "" + CurUserNo + "" + "" + SendTime + "" + strrulecheckTag + "" + "" + InXml + "" + ""; + return CombineXMLRequest_AutoExecutionLotRet; + } + + #endregion + + #region ReverseTriggerOP + + public static bool ExeReverseTriggerOP_NotUseUndo(string pUserNo, string pLotNo, string pLotSerial = defString, int pLotStamp = defInteger, string ComputreName = "EAI") + { + + string InXml, OutXml, strIdentity, strParameter; + bool blnExecResult = false; + + // 2020/3/17 Ning, Mantis: 0068960, WIP_Kit 增加ExeReverseTriggerOP_NotUseUndo共用函式 + try + { + // 檢查此 BR 是否此站第一次執行,若是第一次執行則以刪除Temp, Cont, LotLog...的方式取消Trigger OP的動作 + strIdentity = CombineXMLIdentity(ComputreName, pUserNo, DateTime.Now.ToString(defDateTimeFormat)); + + strParameter = CombineXMLParameter("lotno", "LotNo", "String", CInput(pLotNo), ""); + // 因FormLoad不見得會成功取得Lot的資料,有可能失敗,故使用變數來決定是否傳出參數. + if ((pLotSerial ?? "") != defString) + { + strParameter += CombineXMLParameter("lotserial", "LotSerial", "String", CInput(pLotSerial), ""); + } + if (pLotStamp != defInteger) + { + strParameter += CombineXMLParameter("lotstamp", "LotStamp", "Long", pLotStamp.ToString(), ""); + } + InXml = CombineXMLRequest(strIdentity, strParameter); + // OutXml = InvokeSrv("wsWIP.ReverseTriggerOP_NotUseUndo", InXml) + + object[] aryPars = clsCom.funGetMethodParameters("wsSTD", "wsWIP", "ReverseTriggerOP_NotUseUndo"); + aryPars[0] = InXml; + OutXml = clsCom.funExecuteMethod("wsSTD", "wsWIP", "ReverseTriggerOP_NotUseUndo", ref aryPars) as string; + + blnExecResult = true; + } + catch (Exception ex) + { + + } + + return blnExecResult; + } + + #endregion + + #region "测试工序进出站" + public string Execute_CI_LOT(Dictionary dicPars, Dictionary dicPars_DataTable, string UserNo, string LanguageMode, ref List aryMessage) + { + string Execute_CI_LOTRet = default(string); + + var datSendTime = default(DateTime); + string strComputerName = string.Empty; + string strCurUserNo = UserNo; + + object blnRuleCheck = true; + bool blnEXETriggerOP = false; + string LotNo = ""; + DataSet dsTemp = new DataSet(); + IDbConnection cnnTemp = null; + AppSettings objSetting = new AppSettings(); + var CollectionSQL = new Collection(); + string strSQL = ""; + string LotResult = ""; + string ComputerName = Environment.MachineName; + DateTime sendTime = DateTime.Now; + DbDataReader drTemp = null; + DbDataReader drTemp1 = null; + int Curqty = 0; + string ProductNo = ""; + string ProductVersion = ""; + string MONO = ""; + long LotStamp = 0; + string UnitNo = ""; + string OPNO = ""; + + try + { + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + //首先根据unitid(子批批号)查出来当前批次 + strSQL = $@"SELECT * FROM TBLWIPPRDSTATE_LQ WHERE PRODUCTTYPE=1 AND PRODUCTID='{dicPars["unitid"]}' AND STATE=1"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + LotNo = drTemp["LOTNO"].ToString(); + } + else + { + throw new iMESException.MESException("0000-200002", "[%LOTNO%] [%NOT FOUND%]"); + } + drTemp.Close(); + + strSQL = $"SELECT A.*,B.MONO FROM TBLWIPLOTSTATE A LEFT JOIN TBLWIPLOTBASIS B ON A.LOTNO=B.BASELOTNO WHERE A.LOTNO='{LotNo}' "; + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TBLWIPLOTSTATE", cnnTemp); + if (dsTemp.Tables["TBLWIPLOTSTATE"].Rows.Count > 0) + { + Curqty = Convert.ToInt32(dsTemp.Tables["TBLWIPLOTSTATE"].Rows[0]["Curqty"].ToString()); + if (!dsTemp.Tables["TBLWIPLOTSTATE"].Rows[0]["STATUS"].ToString().Equals("0")) + { + throw new iMESException.MESException("0000-12561", $"母批批次{LotNo}状态不为待进站!"); + } + MONO = dsTemp.Tables["TBLWIPLOTSTATE"].Rows[0]["MONO"].ToString(); + LotStamp = Convert.ToInt64(dsTemp.Tables["TBLWIPLOTSTATE"].Rows[0]["LotStamp"].ToString()); + UnitNo = dsTemp.Tables["TBLWIPLOTSTATE"].Rows[0]["CURUNITNO"].ToString(); + OPNO = dsTemp.Tables["TBLWIPLOTSTATE"].Rows[0]["OPNO"].ToString(); + } + else + { + throw new iMESException.MESException("0000-12561", $"批次{LotNo }找不到在制信息!"); + } + + strSQL = $"SELECT * FROM TBLOEMOBASIS WHERE MONO='{MONO }'"; + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TBLOEMOBASIS", cnnTemp); + if (dsTemp.Tables["TBLOEMOBASIS"].Rows.Count > 0) + { + ProductNo = dsTemp.Tables["TBLOEMOBASIS"].Rows[0]["ProductNo"].ToString(); + ProductVersion = dsTemp.Tables["TBLOEMOBASIS"].Rows[0]["ProductVersion"].ToString(); + } + else + { + throw new iMESException.MESException("0000-200001", $"工单{MONO}不存在!"); + } + + #region 分批逻辑,子批进出站 + if (Curqty > 1) + { + string splitLotNo = ""; + using (var objSYSEng = new kcSYS.clsSYSEng()) + { + splitLotNo = objSYSEng.GetSplitLotNo(true, LotNo, ""); + } + + //新建分批表 + DataTable dtSplitLot; + dtSplitLot = new DataTable("SplitLot"); + dtSplitLot.Columns.Add("SplitLotNo", Type.GetType("System.String")); + dtSplitLot.Columns.Add("SplitLotQty", Type.GetType("System.Decimal")); + dtSplitLot.Columns.Add("SplitSysQty", Type.GetType("System.Decimal")); + dtSplitLot.Columns.Add("Action", Type.GetType("System.Int32")); + dtSplitLot.Columns.Add("NodeID", Type.GetType("System.String")); + dtSplitLot.Columns.Add("ReturnType", Type.GetType("System.Int32")); + dtSplitLot.Columns.Add("FromProductNo", Type.GetType("System.String")); + dtSplitLot.Columns.Add("FromProductVersion", Type.GetType("System.String")); + dtSplitLot.Columns.Add("ProductNo", Type.GetType("System.String")); + dtSplitLot.Columns.Add("ProductVersion", Type.GetType("System.String")); + dtSplitLot.Columns.Add("UnitNo", Type.GetType("System.String")); + dtSplitLot.Columns.Add("OPNo", Type.GetType("System.String")); + //加入母批 + DataRow drData; + drData = dtSplitLot.NewRow(); + drData["SplitLotNo"] = LotNo; + drData["SplitLotQty"] = Curqty - 1; + drData["SplitSysQty"] = Curqty - 1; + drData["Action"] = 0; + drData["NodeID"] = ""; + drData["ReturnType"] = 0; + drData["FromProductNo"] = ProductNo; + drData["FromProductVersion"] = ProductVersion; + drData["ProductNo"] = ProductNo; + drData["ProductVersion"] = ProductVersion; + drData["UnitNo"] = UnitNo; + drData["OPNo"] = OPNO; + dtSplitLot.Rows.Add(drData); + //加入子批 + DataRow drData2; + drData2 = dtSplitLot.NewRow(); + drData2["SplitLotNo"] = splitLotNo; + drData2["SplitLotQty"] = 1; + drData2["SplitSysQty"] = 1; + drData2["Action"] = 0; + drData2["NodeID"] = ""; + drData2["ReturnType"] = 0; + drData2["FromProductNo"] = ProductNo; + drData2["FromProductVersion"] = ProductVersion; + drData2["ProductNo"] = ProductNo; + drData2["ProductVersion"] = ProductVersion; + drData2["UnitNo"] = UnitNo; + drData2["OPNo"] = OPNO; + dtSplitLot.Rows.Add(drData2); + //获取返回结果 + string returnSplitResult = ""; + try + { + using (var objLot = new kcWIP.clsLot()) + { + returnSplitResult = objLot.BR_Manual_LotSplit(LotStamp, LotNo, 0, UserNo, dtSplitLot); + //执行分批后查询分批的在制情况 + //未查询到表示分批失败,返回,否则继续后续逻辑 + strSQL = $"SELECT * FROM TBLWIPLOTSTATE WHERE LOTNO='{splitLotNo}' "; + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TBLWIPLOTSTATE2", cnnTemp); + if (dsTemp.Tables["TBLWIPLOTSTATE2"].Rows.Count > 0) + { + //执行子批自动进出站 + dicPars.Add("lotno", splitLotNo); + Execute_CI_LOTRet = Convert.ToString(AutoexecutionLot_Lot_CS(ref blnEXETriggerOP, dicPars, dicPars_DataTable, "CI", datSendTime, strCurUserNo, strComputerName, Convert.ToBoolean(blnRuleCheck))); + if (Execute_CI_LOTRet.Contains("success")) + { + strSQL = $@"UPDATE TBLWIPPRDSTATE_LQ SET STATE=0 WHERE PRODUCTTYPE=1 AND PRODUCTID='{dicPars["unitid"]}' AND STATE=1"; + CollectionSQL.Add(strSQL); + + strSQL = $@"INSERT INTO TBLWIPPRDSTATE_LQ(LOTNO,PRODUCTID,EQPID,STATE,OPNO,CARRIERID,PRODUCTTYPE,CREATEDATE) VALUES('{dicPars["lotno"]}','{dicPars["unitid"]}','',1,'{OPNO }','',1,To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; + CollectionSQL.Add(strSQL); + + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + } + } + else + { + throw new iMESException.MESException("0000-12561", $"分批失败!"); + } + } + } + catch (Exception e) + { + returnSplitResult = "执行分批失败--" + e.Message; + throw new iMESException.MESException("0000-12561", returnSplitResult); + } + } + #endregion + #region 母批标准进出站逻辑 + else + { + //只有确定批号后再传入 + dicPars.Add("lotno", LotNo); + Execute_CI_LOTRet = Convert.ToString(AutoexecutionLot_Lot_CS(ref blnEXETriggerOP, dicPars, dicPars_DataTable, "CI", datSendTime, strCurUserNo, strComputerName, Convert.ToBoolean(blnRuleCheck))); + } + #endregion + + return Execute_CI_LOTRet; + } + catch (Exception) + { + + throw; + } + finally + { + + CloseConnection(cnnTemp); + } + } + + public string Execute_CO_LOT(Dictionary dicPars, Dictionary dicPars_DataTable, string UserNo, string LanguageMode, ref List aryMessage) + { + string Execute_CO_LOTRet = default(string); + + var datSendTime = default(DateTime); // 送達時間 + string strFunctionID = "CO"; // 執行類型 'CI(進站)、CO (出站) 、SPC(SPC資料 + string strComputerName = string.Empty; // Request Client ComputerName + string strCurUserNo = UserNo; // Request User -紀錄操作人員 + + string strSQL = ""; + + object blnRuleCheck = true; + bool blnEXETriggerOP = false; + string LotNo; + DbDataReader drTemp = null; + IDbConnection cnnTemp = null; + AppSettings objSetting = new AppSettings(); + DataSet dsLotTemp; + DataSet dsTemp = new DataSet(); + string LotSerial = "", OPNO = "", InventoryNo = "", MONo = "", CurUnitNo = "", ProductNo, ProductVersion, BaseLotNo = "", BRNo, LogGroupSerial = ""; + int intOPReference, intOPStatus; // OPReference參數要參考0:Product,1:Module. OPStatus 0:站間,1:站中 + string ReferenceNo, ReferenceVersion, NodeVersion, ModProcessNo, ModProcessVersion, CurModuleNo, CurModuleVersion, CurNodeId, AreaNo, OPGroupNo, strGOLinkName; + double CurQty; + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + //首先根据unitid(子批批号)查出来当前批次 + strSQL = $@"SELECT * FROM TBLWIPPRDSTATE_LQ WHERE PRODUCTTYPE=1 AND PRODUCTID='{dicPars["unitid"]}' AND STATE=1"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + LotNo = drTemp["LOTNO"].ToString(); + } + else + { + throw new iMESException.MESException("0000-200002", "[%LOTNO%] [%NOT FOUND%]"); + } + drTemp.Close(); + + using (var ds = new DataSet()) + { + ExecuteSQLQuery_Adapter( + "Select A.*,B.ElementName As AttribName, B.InputType, B.DataType, B. ValueType " + + " From tblWIPTemp_Attrib A, tblSYSElementBasis B " + + " Where A.AttribNo=B.ElementNo And A.AttribSource = 0 " + + " and (AttribPhase = 99 or AttribPhase = 2) And B.AllowNull = 0 And A.LotNo ='" + LotNo + "'", + ds.Tables.Add("TempAttrib"), objSetting.GetConnectionString(), objSetting.GetDataBaseType()); + dicPars_DataTable.Add("lotattrib", ds.Tables[0]); + } + + // 2.2 取得所有傳入Lot的AttribPhase = PhaseNo並且為99 的Keyin TempCopmonentAttrib + using (var ds = new DataSet()) + { + ExecuteSQLQuery_Adapter( + "Select A.*,B.ElementName As AttribName, B.InputType, B.DataType, B. ValueType " + + " From tblWIPTemp_ComponentAttrib A, tblSYSElementBasis B " + + " Where A.AttribNo=B.ElementNo And A.AttribSource = 0 " + + " and (AttribPhase = 99 or AttribPhase = 2) And B.AllowNull = 0 And A.LotNo ='" + LotNo + "'", + ds.Tables.Add("TempCopmonentAttrib"), objSetting.GetConnectionString(), objSetting.GetDataBaseType()); + dicPars_DataTable.Add("lotcomponentattrib", ds.Tables[0]); + } + + strSQL = "Select C.LotSerial, A.ProcessNo, A.OPNo, A.NodeId, A.AreaNo, A.HaveComponent, A.CurUnitNo, A.CurQty, A.GoStatus, A.HaveLevel, " + " A.OPReference, A.ModuleNo, A.ModuleVersion, A.LogGroupSerial, A.OPStatus,A.BRNo,A.GoLinkName, " + " B.BaseLotNo, B.ProductNo, B.ProductVersion,A.OPGroupNo,B.MONo,C.INVENTORYNO From tblWIPTemp_LotState C,tblWIPLotState A, tblWIPLotBasis B " + " Where A.LotNo ='" + LotNo + "'" + " And A.BaseLotNo = B.BaseLotNo AND C.LOTNO=A.LOTNO"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + intOPReference = Conversions.ToInteger(drTemp["OPReference"]); + if (intOPReference == 0) // 參考Product + { + ReferenceNo = drTemp["ProductNo"].ToString(); + ReferenceVersion = drTemp["ProductVersion"].ToString(); + } + else if (intOPReference == 1) // 參考Module + { + ReferenceNo = drTemp["ModuleNo"].ToString(); + ReferenceVersion = drTemp["ModuleVersion"].ToString(); + } + else + { + throw new iMESException.MESException("0000-202001", "[%LotNo%] : " + LotNo); + } + + LotSerial = drTemp["LotSerial"].ToString(); + ProductNo = drTemp["ProductNo"].ToString(); + ProductVersion = drTemp["ProductVersion"].ToString(); + CurModuleNo = drTemp["ModuleNo"].ToString(); + CurModuleVersion = drTemp["ModuleVersion"].ToString(); + OPNO = drTemp["OPNo"].ToString(); + BaseLotNo = drTemp["BaseLotNo"].ToString(); + InventoryNo = Conversions.ToString(drTemp["InventoryNo"]); + CurNodeId = drTemp["NodeID"].ToString(); + AreaNo = drTemp["AreaNo"].ToString(); + // HaveComponent = drTemp("HaveComponent") + CurUnitNo = drTemp["CurUnitNo"].ToString(); + CurQty = Convert.ToDouble(drTemp["CurQty"]); + // SetWait時會有資料,故不會Null + LogGroupSerial = drTemp["LogGroupSerial"].ToString(); + intOPStatus = Conversions.ToInteger(drTemp["OPStatus"]); + BRNo = drTemp["BRNo"].ToString(); + OPGroupNo = drTemp["OPGroupNo"].ToString(); + strGOLinkName = drTemp["GoLinkName"].ToString(); // 2012/02/22 + MONo = drTemp["MONo"].ToString(); // 2020/06/05 Elvis 0072943: 回填完工數量 + // 2022/2/25 0104829: SDD211216_02-01 / HaveComponent、HaveLevel判斷抽換成共用function + } + else + { + throw new iMESException.MESException("0000-202002", "[%LotNo%] : " + LotNo); + } + drTemp.Close(); + + dicPars.Add("lotno", LotNo); + dicPars.Add("opno", OPNO); + + using (var objkcWIP_clsLot = new clsLot()) + { + dsLotTemp = objkcWIP_clsLot.ShowLotBasisJoinState(LotNo); + } + if (dsLotTemp.Tables[0].Rows.Count < 1) + { + throw new iMESException.MESException("0000-200001", "[%LOTNO%][%NOT FOUND%]"); + } + + using (var obj = new kcEAP.clsWIP()) + { + if (obj.ChkCO_UseMaterial(LotNo) == false) + { + throw new iMESException.MESException("0000-200001", "ChkCO_UseMaterial Fail!"); + } + } + //(xg)检查请求报文是否增加了errorcode、errorvalue参数 + var errorcode = ""; + var errorvalue = ""; + if (dicPars.ContainsKey("errorcode")) + { + errorcode = dicPars["errorcode"].ToString(); + errorvalue = dicPars["errorvalue"].ToString(); + } + + // 1. 检查字典中是否存在这个key + if (dicPars_DataTable.ContainsKey("lotattrib")) + { + if (dicPars_DataTable["lotattrib"] != null) + { + if (dicPars_DataTable["lotattrib"].Select("ATTRIBNO='GoodQty'").Length > 0) + { + dicPars_DataTable["lotattrib"].Select("ATTRIBNO='GoodQty'")[0]["ATTRIBVALUE"] = CurQty; + } + + if (dicPars_DataTable["lotattrib"].Select("ATTRIBNO='DefectQty'").Length > 0) + { + dicPars_DataTable["lotattrib"].Select("ATTRIBNO='DefectQty'")[0]["ATTRIBVALUE"] = 0; + } + } + } + + //查询当前的作业站的属性中是否有【测试工序】属性,若有的话,将socketid存到进站的参数中,执行进站逻辑。 + strSQL = "SELECT * FROM TBLOPPROPERTY WHERE ISSUESTATE=2 AND PROPERTYNO='测试工序' AND OPNO='" + OPNO + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (dicPars["result"].ToString().ToUpper() == "NG") + { + // 1. 检查字典中是否存在这个key + if (dicPars_DataTable.ContainsKey("lotattrib")) + { + if (dicPars_DataTable["lotattrib"] != null) + { + if (dicPars_DataTable["lotattrib"].Select("ATTRIBNO='GoodQty'").Length > 0) + { + dicPars_DataTable["lotattrib"].Select("ATTRIBNO='GoodQty'")[0]["ATTRIBVALUE"] = 0; + } + + if (dicPars_DataTable["lotattrib"].Select("ATTRIBNO='DefectQty'").Length > 0) + { + dicPars_DataTable["lotattrib"].Select("ATTRIBNO='DefectQty'")[0]["ATTRIBVALUE"] = CurQty; + } + } + } + + Collection CollectionSQL = new Collection(); + //直接入不良品库 + strSQL = "Insert into tblINVWIP_Scrap(LogGroupSerial,InventoryNo,LotSerial,LotNo,OPNo,UnitNo,ScrapQty,LossQty,BaseLotNo, InputDate)" + " Values ('" + LogGroupSerial + "','" + InventoryNo + "','" + LotSerial + "', '" + LotNo + "','" + OPNO + "','" + CurUnitNo + "'," + CurQty + ",0,'" + BaseLotNo + "'," + " To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ")"; + CollectionSQL.Add(strSQL); + // 加入ReverseUpdateContent + strSQL = "Delete From tblINVWIP_Scrap Where LotSerial='" + LotSerial + "'"; + Collection argcolSQL_Rows9 = null; + objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows9); + + // 變更LotSate + // 2012/02/22,新增GoLinkName + strSQL = "Update tblWIPLotState Set LotSerial = '" + LotSerial + "'," + " Status = 12 ," + " GoStatus = null , " + " GoLinkName = null , " + " EventTime = To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " EventUserNo='" + UserNo + "'," + " EventDescription='测试工序入不良品仓'," + " ArriveTime = To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + if (intOPStatus == 1) // 站中Wait才須給EndTime + { + strSQL = strSQL + " PreOPEndTime = To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + } + strSQL = strSQL + " OPStatus = 0 Where LotNo = '" + LotNo + "'"; + CollectionSQL.Add(strSQL); + + // 執行本站結束的相關處理,站中才須處理 + decimal decGoodQty = default(decimal), decFailQty = default(decimal), decLossQty = default(decimal); + if (intOPStatus == 1) + { + // 檢查是否已有產出 + string strGoodUnitNo = ""; + + objLot.SHR_CalOutput(ref cnnTemp, ref decGoodQty, ref decFailQty, ref decLossQty, ref strGoodUnitNo, LogGroupSerial, (decimal)CurQty, CurUnitNo); + + // 結算工時. + decimal FinalGoodQtyTmp = defInteger, FinalFailQtyTmp = defInteger; + objLot.EndOP(ref FinalGoodQtyTmp, ref FinalFailQtyTmp, LotNo, LotSerial, DateTime.Now, CollectionSQL, UserNo, true, EventDescription: "测试工序入不良品仓", GoodQty: 0m, FailQty: decGoodQty + decFailQty, LossQty: decLossQty, UnitNo: strGoodUnitNo, CalculateEMP: true); + } + else + { + // 由EndModule內自行處理 + decGoodQty = defInteger; + decFailQty = defInteger; + } + + // 不正常結束,CompleteFlag=0. + if (intOPReference == 1) + { + if (decGoodQty == defInteger) + { + objLot.EndModule(LotNo, LotSerial, DateTime.Now, CollectionSQL, EventUserNo: UserNo, EventDescription: "测试工序入不良品仓", CompleteFlag: 0, UnUpdateFailQty: (decimal)CurQty, FinalGoodQty: 0m); + } + else + { + objLot.EndModule(LotNo, LotSerial, DateTime.Now, CollectionSQL, EventUserNo: UserNo, EventDescription: "测试工序入不良品仓", CompleteFlag: 0, UnUpdateFailQty: decGoodQty + decFailQty, FinalGoodQty: 0m); + } + } + + // 2017/09/25 YF, 叫用工單達交率處理者,判斷是否回寫實際完工日 + // 2020/03/17 OwenLiu, Mantis:0068929 工單實際開工日/工單實際完工日 調整還原機制的共用處理 + new kcOE.WorkOrderRateHandler().ActualFinishDateProcess(pLotNo: LotNo, pLotSerial: LotSerial , pEventTime: DateTime .Now , pCollectionSQL: CollectionSQL, objReverse: objReverse); + //(xg)20260722 + if (errorcode != "") + { + //更改表TBLPCSDIELOG_LQ + strSQL = $"update TBLPCSDIELOG_LQ set BADFLAG = 1,REASONNO = '{errorcode}' where unitid='{dicPars["unitid"].ToString()}'"; + CollectionSQL.Add(strSQL); + //更改表TBLPCSDIELOG_LQ + strSQL = $"update tblwipprdstate_LQ set STATE=2 where LOTNO='{LotNo}' AND state= 1"; + CollectionSQL.Add(strSQL); + } + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + } + else if (dicPars["result"].ToString().ToUpper() == "FAIL") + { + strSQL = $@"select * from TBLCUSTESTOPRESULT where lotno ='{LotNo }' and opno ='{OPNO }' and eqpid='{dicPars["eqp_id"]}'"; + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TBLCUSTESTOPRESULT", cnnTemp); + if (dsTemp.Tables["TBLCUSTESTOPRESULT"].Rows.Count + 1 < int.Parse(drTemp["DefaultValue"].ToString())) + { + Collection CollectionSQL = new Collection(); + //走cycle节点,回到原站点 + strSQL = $@"INSERT INTO TBLCUSTESTOPRESULT(ErrorNo,ReasonName,LOTNO,OPNO,EQPID,RESULT,TESTTIME) VALUES('{errorcode}','{errorvalue}','{dicPars["lotno"]}','{dicPars["opno"]}','{dicPars["eqp_id"]}','{dicPars["result"]}',To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; + CollectionSQL.Add(strSQL); + + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + + Execute_CO_LOTRet = Convert.ToString(AutoexecutionLot_Lot_CS(ref blnEXETriggerOP, dicPars, dicPars_DataTable, strFunctionID, datSendTime, strCurUserNo, strComputerName, Convert.ToBoolean(blnRuleCheck), "CYCLE")); + } + else + { + // 1. 检查字典中是否存在这个key + if (dicPars_DataTable.ContainsKey("lotattrib")) + { + if (dicPars_DataTable["lotattrib"] != null) + { + if (dicPars_DataTable["lotattrib"].Select("ATTRIBNO='GoodQty'").Length > 0) + { + dicPars_DataTable["lotattrib"].Select("ATTRIBNO='GoodQty'")[0]["ATTRIBVALUE"] = 0; + } + + if (dicPars_DataTable["lotattrib"].Select("ATTRIBNO='DefectQty'").Length > 0) + { + dicPars_DataTable["lotattrib"].Select("ATTRIBNO='DefectQty'")[0]["ATTRIBVALUE"] = CurQty; + } + } + } + //直接入不良品库 + Collection CollectionSQL = new Collection(); + //直接入不良品库 + strSQL = "Insert into tblINVWIP_Scrap(LogGroupSerial,InventoryNo,LotSerial,LotNo,OPNo,UnitNo,ScrapQty,LossQty,BaseLotNo, InputDate)" + " Values ('" + LogGroupSerial + "','" + InventoryNo + "','" + LotSerial + "', '" + LotNo + "','" + OPNO + "','" + CurUnitNo + "'," + CurQty + ",0,'" + BaseLotNo + "'," + " To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ")"; + CollectionSQL.Add(strSQL); + // 加入ReverseUpdateContent + strSQL = "Delete From tblINVWIP_Scrap Where LotSerial='" + LotSerial + "'"; + Collection argcolSQL_Rows9 = null; + objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows9); + + // 變更LotSate + // 2012/02/22,新增GoLinkName + strSQL = "Update tblWIPLotState Set LotSerial = '" + LotSerial + "'," + " Status = 12 ," + " GoStatus = null , " + " GoLinkName = null , " + " EventTime = To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " EventUserNo='" + UserNo + "'," + " EventDescription='测试工序入不良品仓'," + " ArriveTime = To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + if (intOPStatus == 1) // 站中Wait才須給EndTime + { + strSQL = strSQL + " PreOPEndTime = To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + } + strSQL = strSQL + " OPStatus = 0 Where LotNo = '" + LotNo + "'"; + CollectionSQL.Add(strSQL); + + // 執行本站結束的相關處理,站中才須處理 + decimal decGoodQty = default(decimal), decFailQty = default(decimal), decLossQty = default(decimal); + if (intOPStatus == 1) + { + // 檢查是否已有產出 + string strGoodUnitNo = ""; + + objLot.SHR_CalOutput(ref cnnTemp, ref decGoodQty, ref decFailQty, ref decLossQty, ref strGoodUnitNo, LogGroupSerial, (decimal)CurQty, CurUnitNo); + + // 結算工時. + decimal FinalGoodQtyTmp = defInteger, FinalFailQtyTmp = defInteger; + objLot.EndOP(ref FinalGoodQtyTmp, ref FinalFailQtyTmp, LotNo, LotSerial, DateTime.Now, CollectionSQL, UserNo, true, EventDescription: "测试工序入不良品仓", GoodQty: 0m, FailQty: decGoodQty + decFailQty, LossQty: decLossQty, UnitNo: strGoodUnitNo, CalculateEMP: true); + } + else + { + // 由EndModule內自行處理 + decGoodQty = defInteger; + decFailQty = defInteger; + } + + // 不正常結束,CompleteFlag=0. + if (intOPReference == 1) + { + if (decGoodQty == defInteger) + { + objLot.EndModule(LotNo, LotSerial, DateTime.Now, CollectionSQL, EventUserNo: UserNo, EventDescription: "测试工序入不良品仓", CompleteFlag: 0, UnUpdateFailQty: (decimal)CurQty, FinalGoodQty: 0m); + } + else + { + objLot.EndModule(LotNo, LotSerial, DateTime.Now, CollectionSQL, EventUserNo: UserNo, EventDescription: "测试工序入不良品仓", CompleteFlag: 0, UnUpdateFailQty: decGoodQty + decFailQty, FinalGoodQty: 0m); + } + } + + // 2017/09/25 YF, 叫用工單達交率處理者,判斷是否回寫實際完工日 + // 2020/03/17 OwenLiu, Mantis:0068929 工單實際開工日/工單實際完工日 調整還原機制的共用處理 + new kcOE.WorkOrderRateHandler().ActualFinishDateProcess(pLotNo: LotNo, pLotSerial: LotSerial, pEventTime: DateTime.Now, pCollectionSQL: CollectionSQL, objReverse: objReverse); + //(xg)20260722 + if (errorcode != "") + { + //更改表TBLPCSDIELOG_LQ + strSQL = $"update TBLPCSDIELOG_LQ set BADFLAG = 1,REASONNO = '{errorcode}' where unitid='{dicPars["unitid"].ToString()}'"; + CollectionSQL.Add(strSQL); + //更改表TBLPCSDIELOG_LQ + strSQL = $"update tblwipprdstate_LQ set STATE=2 where LOTNO='{LotNo}' AND state= 1"; + CollectionSQL.Add(strSQL); + } + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + } + } + else if (dicPars["result"].ToString().ToUpper() == "PASS") + { + Collection CollectionSQL = new Collection(); + strSQL = $@"INSERT INTO TBLCUSTESTOPRESULT(LOTNO,OPNO,EQPID,RESULT,TESTTIME) VALUES('{dicPars["lotno"]}','{dicPars["opno"]}','{dicPars["eqp_id"]}','{dicPars["result"]}',To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; + CollectionSQL.Add(strSQL); + + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + + //正常出站 + Execute_CO_LOTRet = Convert.ToString(AutoexecutionLot_Lot_CS(ref blnEXETriggerOP, dicPars, dicPars_DataTable, strFunctionID, datSendTime, strCurUserNo, strComputerName, Convert.ToBoolean(blnRuleCheck))); + } + } + else + { + Execute_CO_LOTRet = Convert.ToString(AutoexecutionLot_Lot_CS(ref blnEXETriggerOP, dicPars, dicPars_DataTable, strFunctionID, datSendTime, strCurUserNo, strComputerName, Convert.ToBoolean(blnRuleCheck))); + } + drTemp.Close(); + + return Execute_CO_LOTRet; + } + + // 0102096: [6.0.5] EAP自動報工架構_SDD210906_05-01/ Execute_CI_LOT + public object AutoexecutionLot_Lot_CS(ref bool blnEXETriggerOP, Dictionary dicPars, Dictionary dicPars_DataTable, string FunctionID, DateTime ArriveTime, string UserNo, string ComputerName, bool blnRuleCheck = true, string LinkName = defString) + { + object AutoexecutionLot_LotRet = default(object); + var dtLotState = new DataTable(); // Load Afer TriggerOP + var objLot = new clsLot(); + var objSYS = new clsSYSUserLog(); + var objWIP = new kcWIP.clsWIP(); + var objUSR = new iMESUserManager.clsUSRSecurity(); + var objclsWIP = new clsWIP(); + var objEMS = new kcEMS.clsEMSEquipment(); + var objReverse = new udReverse.clsReverse(); + DataRow drAdd; + IDbConnection cnnTemp = null; + var drTemp = default(DbDataReader); + //OleDbCommand cmmTemp; + AppSettings objSetting = new AppSettings(); + + string strException; + string strResult; + int PhaseNo; + string AreaNo = defString; + string OPNo = defString; + string PSNo = defString; + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); // Create connection + + string strServiceName = "ExecuteLot"; + + + var dtLotNo = new DataTable(); + dtLotNo.Columns.Add("LotNo", System.Type.GetType("System.String")); + var drLotAdd = dtLotNo.NewRow(); + drLotAdd["LotNo"] = dicPars["lotno"]; + dtLotNo.Rows.Add(drLotAdd); + string LotNo = dtLotNo.Rows[0]["LotNo"].ToString(); + + string InXML = ""; + string OutXML = ""; + + string strRetrunMsg = ""; + + var dtChkRuleLot2 = new DataTable("ChkRuleLot"); // minya 20200315 + string strEquipmentNo = defString; + string strERFMsg = ""; + try + { + + // 1.依InXml資料與Lot目前狀態比對是否符合 + DataRow drLotState = null; + var strKernelModule = default(string); + var strKernelFunctionName = default(string); + + // 檢查USER過帐权限 + DataRow drUser; + if (!string.IsNullOrEmpty(UserNo)) + { + drUser = objUSR.GetUserSecurity(UserNo, 2); + if (string.IsNullOrEmpty(drUser["UserNo"].ToString())) + { + UserNo = "EAP_AGENT"; + drUser = objUSR.GetUserSecurity(UserNo, 2); + if (string.IsNullOrEmpty(drUser["UserNo"].ToString())) + { + throw new iMESException.MESException("0000-200015", "[%Please provide curuser or set EAP_Agent correct, then execute Lot%] !"); + } + } + } + else + { + UserNo = "EAP_AGENT"; + drUser = objUSR.GetUserSecurity(UserNo, 2); + if (string.IsNullOrEmpty(drUser["UserNo"].ToString())) + { + throw new iMESException.MESException("0000-200015", "[%Please provide curuser or set EAP_Agent correct, then execute Lot%] !"); + } + } + + strEquipmentNo = dicPars["eqp_id"]; + + // 2.取得生產批現況資訊 + string refBRNO = defString; + string refBRExecutionFile = defString; + + string strLots = "("; + foreach (DataRow drTempLotNo in dtLotNo.Rows) + strLots += "'" + drTempLotNo["LotNo"].ToString() + "',"; + strLots = strLots.TrimEnd(','); + strLots += ")"; + + if (tcEAI.clsEAP.funLoadLotStatusJoinOPBusinessRule(strLots, ref dtLotNo) < 0) + { + throw new iMESException.MESException("0000-200091", "[%funLoadLotStatusJoinOPBusinessRule fail%]!"); + } + if (!(dtLotNo == null) && dtLotNo.Rows.Count > 0) // 取出區域與作業站 + { + OPNo = dtLotNo.Rows[0]["OPNo"].ToString(); + AreaNo = dtLotNo.Rows[0]["AreaNo"].ToString(); + PSNo = dtLotNo.Rows[0]["PSNo"].ToString(); + } + + // 檢查User是否有此OP的權限------------------------------------------------------------------------------------------------ + // Gary Lu 20121114:這個作業站不在群組內才要進行權限檢查 + if (objUSR.ChkUserOPPriv(UserNo, OPNo) == false) + { + throw new iMESException.MESException("0000-202015", "[%UserNo%]:" + UserNo + "[%NOTHINGSTATE%][%OPPRIVILEGE%], [%OPNo%]:" + OPNo); + } + + // 檢查User是否有產品區段設定權限------------------------------------------------------------------------------------------------ + if (objUSR.ChkUserPSPriv(UserNo, PSNo) == false) + { + throw new iMESException.MESException("0000-200062", "[%EmployeeNo%]:" + UserNo + "[%has no PS Privilege%], [%PSNo%]:" + PSNo); + } + + objUSR = null; + + // 6.取得班別 + string ShiftNo = "N/A"; + using (var obj = new clsUSRDepartment()) + { + ShiftNo = obj.GetShift(UserNo); + } + + // 0 : Sucess + // -1 : Program Error + // -2 : LotInfo Error + // -3 : Each Lot Has Different BR + // -4 : RefLotNo Didn't Setting KERNELMODULE(tblOPBusinessRuleBasis) + // -5 : RefLotNo Didn't Setting KERNELFUNCTIONNAME(tblOPBusinessRuleBasis) + // -6 : LotStatus Error + switch (tcEAI.clsEAP.ChkLotStateAndBRNo(strLots, FunctionID, OPNo)) + { + case -1: + { + throw new iMESException.MESException("0000-200091", "[%ChkLotStateAndBRNo fail%]!"); + } + case -2: + { + throw new iMESException.MESException("0000-200091", "[%LotNo And OPNo fail!%]"); + } + case -3: + { + throw new iMESException.MESException("0000-200091", "[%Each Lot Has Different BR%]"); + } + case -4: + { + throw new iMESException.MESException("0000-200091", "[%RefLotNo%] " + LotNo + "; [%Not Setting KERNELMODULE(tblOPBusinessRuleBasis)%]"); + } + case -5: + { + throw new iMESException.MESException("0000-200091", "[%RefLotNo%] " + LotNo + "; [%Not Setting KERNELFUNCTIONNAME(tblOPBusinessRuleBasis)%]"); + } + case -6: + { + throw new iMESException.MESException("0000-200091", "[%LotStatus Error%]"); + } + } + + foreach (DataRow drTempLotNo in dtLotNo.Rows) + { + if (dtLotNo.Rows.IndexOf(drTempLotNo) == 0) + { + refBRNO = drTempLotNo["BRNO"].ToString(); + refBRExecutionFile = drTempLotNo["EXECUTIONFILE"].ToString(); + } + else if (drTempLotNo["BRNO"].ToString() != refBRNO) + { + // LotBR 與首批不一致 + throw new iMESException.MESException("0000-200091", "[%LotNo%]:" + drTempLotNo["LotNo"].ToString() + " [%BR%] [%Is Not THE SAME%]"); + } + + funCheckStateByLot(ref strKernelModule, ref strKernelFunctionName, drTempLotNo["LotNo"].ToString(), drTempLotNo, FunctionID, OPNo); + } + + if (FunctionID == "CO") + { + if (refBRExecutionFile.ToUpper() != "BR_L_CO_GEN.DLL" && refBRExecutionFile.ToUpper() != "BR_L_CO_GEN_M.DLL") + { + //0156845: [6.0.7]调整EAP接口查核支援BR逻辑,增加查核brno + if (!tcEAI.clsEAP.ExeBrnoIfSupport(refBRExecutionFile.ToUpper(), refBRNO)) + { + throw new iMESException.MESException("0000-200091", "[%Only Support L_CO_GEN Now%] [%NOWUSE%]:" + refBRNO + ""); + } + + } + } + else if (refBRExecutionFile.ToUpper() != "BR_L_CI_GEN.DLL" && refBRExecutionFile.ToUpper() != "BR_L_CI_GEN_M.DLL") + { + //0156845: [6.0.7]调整EAP接口查核支援BR逻辑,增加查核brno + if (!tcEAI.clsEAP.ExeBrnoIfSupport(refBRExecutionFile.ToUpper(), refBRNO)) + { + throw new iMESException.MESException("0000-200091", "[%Only Support L_CI_GEN Now%] [%NOWUSE%]:" + refBRNO + ""); + } + } + + // 3.Execution Trigger OP + if (!dtLotNo.Columns.Contains("blnEXETriggerOP")) + { + using (var dcTemp = new DataColumn()) + { + dcTemp.ColumnName = "blnEXETriggerOP"; + dcTemp.DataType = Type.GetType("System.Boolean"); + dcTemp.DefaultValue = false; + dtLotNo.Columns.Add(dcTemp); + } + } + + foreach (DataRow drTempLot in dtLotNo.Rows) + { + // If drTempLot("Status") = 0 Then + string DescriptionTmp = defString; + long NewLotStampTmp = defInteger; + switch (objLot.TriggerOP(ref DescriptionTmp, ref NewLotStampTmp, Convert.ToString(drTempLot["LotNo"]), UserNo: UserNo)) + { + + case "hold_exceedtime": + { + tcEAI.clsWIP.BRERFCreateExecute(pUserId: UserNo, pLotNo: Convert.ToString(drTempLot["LotNo"]), pERFType: 1, pHoldTime: 0, pRuleNo: "EXCEEDTIME"); + throw new iMESException.MESException("0000-200091", "LotNO:" + + drTempLot["LotNo"] + "[%VIOLATE TIME CONTROL,CREATE ERF%]!"); + } + case "futurehold": + { + tcEAI.clsWIP.BRERFCreateExecute(pUserId: UserNo, pLotNo: Convert.ToString(drTempLot["LotNo"]), pERFType: 3, pHoldTime: 0); + throw new iMESException.MESException("0000-200091", "LotNO:" + + drTempLot["LotNo"] + "[%FUTUREHOLD SET,CREATE ERF%]!"); + } + case "futurewait": + { + throw new iMESException.MESException("0000-200091", "LotNO:" + drTempLot["LotNo"] + "[%FUTUREWAIT%]!"); + } + case "futureos": + { + throw new iMESException.MESException("0000-200091", "LotNO:" + drTempLot["LotNo"] + "[%FUTURE OS%]!"); + } + + default: + { + // 2020/03/11 Shih Kai, 68676 :自动进出站BR检核-TriggerOP後增加補做TriggerPhase + // Trigger Phase + drLotState = objLot.GetLotBasisJoinState(LotNo: drTempLot["LotNo"].ToString()); // 取得最新的LotState + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drLotState["OPReference"], 0, false))) // by Product + { + PhaseNo = objLot.GetBusinessRulePhase(drLotState["ProductNo"].ToString(), drLotState["ProductVersion"].ToString(), drLotState["OPNo"].ToString(), drLotState["BRNo"].ToString()); + } + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drLotState["OPReference"], 1, false))) // by Module + { + PhaseNo = objLot.GetBusinessRulePhase(drLotState["ModuleNo"].ToString(), drLotState["ModuleVersion"].ToString(), drLotState["OPNo"].ToString(), drLotState["BRNo"].ToString()); + } + else + { + throw new iMESException.MESException("0000-200015", "LotNo:" + + drTempLot["LotNo"] + ",[%OPREFERENCE ERROR%]!"); + } + + // 剛做完TriggerOP,不用再執行Attrib的變更 + objLot.TriggerPhase_LotState(Convert.ToString(drTempLot["LotNo"]), PhaseNo, UserNo); + + drTempLot["blnEXETriggerOP"] = true; + break; + } + } + } + + var drLotRow = objLot.GetLotBasisJoinState(LotNo: LotNo); // 取得最新的LotState + + string strLotStamp = drLotRow["LotStamp"].ToString(); + string strLotSerial = drLotRow["LotSerial"].ToString(); + string strLogGroupSerial = drLotRow["LogGroupSerial"].ToString(); + int intPhaseNo = Conversions.ToInteger(drLotRow["PhaseNo"]); + + blnEXETriggerOP = true; + + // 4.ReLoad Lotstate Afer Trigger OP In dtLotState + tcEAI.clsEAP.funLoadLotStatusJoinOPBusinessRule(strLots, ref dtLotState); + + + // 20200309 Edison Mantis : 68289: [SEMI WAFER]通用性CI/CO BR檢核 + // 區域設備檢核 Key in Lot Attrib檢核 Component Attrib檢核, Check Control Rule + // =============================================== 68289 Start =============================================== + + // 5.Xml轉Table + DataTable dtLotList = new DataTable(), dtLotAttrib = new DataTable(), dtLotError = new DataTable(), dtLotComponent = new DataTable(), dtLotCompAttrib = new DataTable(), dtEquipment = new DataTable(), dtTempAttrib = new DataTable(), dtComponentError = new DataTable(); + DataTable dtAccessory = null; + + // 將批號加入資料表以便檢查設備 + dtLotList.Columns.Add("LotNo"); + DataRow drLotNo; + drLotNo = dtLotList.NewRow(); + drLotNo["LotNo"] = LotNo; + dtLotList.Rows.Add(drLotNo); + + if (dicPars_DataTable.Keys.Contains("lotattrib")) + { + //查询当前的作业站的属性中是否有【测试工序】属性,若有的话,将socketid存到进站的参数中,执行进站逻辑。 + string strSQL = "SELECT * FROM TBLOPPROPERTY WHERE ISSUESTATE=2 AND PROPERTYNO='测试工序' AND OPNO='" + OPNo + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + dtLotAttrib = dicPars_DataTable["lotattrib"]; + } + drTemp.Close(); + } + + if (dicPars_DataTable.Keys.Contains("loterror")) + { + dtLotError = dicPars_DataTable["loterror"]; + } + + if (dicPars_DataTable.Keys.Contains("lotcompoment")) + { + dtLotComponent = dicPars_DataTable["lotcompoment"]; + } + if (dicPars_DataTable.Keys.Contains("lotcomponentattrib")) + { + dtLotCompAttrib = dicPars_DataTable["lotcomponentattrib"]; + } + + if (dicPars_DataTable.Keys.Contains("equipment")) + { + dtEquipment = dicPars_DataTable["equipment"]; + } + else + { + dtEquipment.Columns.Add("EquipmentNo"); + DataRow drEQP; + drEQP = dtEquipment.NewRow(); + drEQP["EquipmentNo"] = strEquipmentNo; + dtEquipment.Rows.Add(drEQP); + } + + if (dicPars_DataTable.Keys.Contains("tempattrib")) + { + dtTempAttrib = dicPars_DataTable["tempattrib"]; + } + if (dicPars_DataTable.Keys.Contains("componenterror")) + { + dtComponentError = dicPars_DataTable["componenterror"]; + } + if (dicPars_DataTable.Keys.Contains("accessorylist")) + { + dtAccessory = dicPars_DataTable["accessorylist"]; + } + + if (dtAccessory == null) + { + dtAccessory = objEMS.LoadEQPACCStateJoinAccState_EAP(EquipmentNo: strEquipmentNo); + } + + string strCANodeName, strComponentNodeName; + string strLinkName = "PASS"; + string strMailGroupNo = ""; + string strMsg = ""; + string strRuleNo = defString; + int intERFType = 0; + DataTable dtLotRuleData = default(DataTable); + //DataTable dtLotRuleData = default(DataTable), dtCompRuleData = default(DataTable); + + var dtLotAttrib_Temp = new DataTable(); + //dtLotAttrib_Temp.Columns.Add("LotNo", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("AttribNo", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("AttribType", Type.GetType("System.Int32")); + dtLotAttrib_Temp.Columns.Add("AttribSequence", Type.GetType("System.Int32")); + dtLotAttrib_Temp.Columns.Add("AttribSource", Type.GetType("System.Int32")); + dtLotAttrib_Temp.Columns.Add("AttribPhase", Type.GetType("System.Int32")); + dtLotAttrib_Temp.Columns.Add("AttribValue", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("SaveToLotPropertyNo", Type.GetType("System.String")); + // 2021/12/1 缺少QCItemNo,於標準BRcheckin會出錯 + dtLotAttrib_Temp.Columns.Add("TestValue", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("QCItemNo", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("Result", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("Result_INT", Type.GetType("System.Int32")); + dtLotAttrib_Temp.Columns.Add("FactorSerial", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("SerialNo", Type.GetType("System.Int32")); + dtLotAttrib_Temp.Columns.Add("MEMO", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("ComponentNo", Type.GetType("System.String")); + // SPC + dtLotAttrib_Temp.Columns["TestValue"].Expression = "AttribValue"; + + var dtLotCompAttrib_Temp = new DataTable(); + dtLotCompAttrib_Temp.Columns.Add("LotNo", Type.GetType("System.String")); + dtLotCompAttrib_Temp.Columns.Add("ComponentNo", Type.GetType("System.String")); + dtLotCompAttrib_Temp.Columns.Add("AttribNo", Type.GetType("System.String")); + dtLotCompAttrib_Temp.Columns.Add("AttribValue", Type.GetType("System.String")); + dtLotCompAttrib_Temp.Columns.Add("AttribType", Type.GetType("System.Int32")); + dtLotCompAttrib_Temp.Columns.Add("AttribSequence", Type.GetType("System.Int32")); + dtLotCompAttrib_Temp.Columns.Add("AttribSource", Type.GetType("System.Int32")); + dtLotCompAttrib_Temp.Columns.Add("AttribPhase", Type.GetType("System.Int32")); + dtLotCompAttrib_Temp.Columns.Add("SaveToLotPropertyNo", Type.GetType("System.String")); + + if (blnRuleCheck) + { + + // 預設 + strCANodeName = "componentattrib"; + strComponentNodeName = "component"; + // Call XmlToTable(InXML, dtEquipment, dtLotList, dtLotAttrib, dtLotError, dtLotComponent, dtLotCompAttrib, strLots, LotNo, strCANodeName, strComponentNodeName, refBRNO) 'refBRNO minya 20200312 + + // dtLotAttrib若不包含欄位:LotNo,會出錯誤 + if (!(dtLotAttrib == null)) + { + if (!dtLotAttrib.Columns.Contains("LotNo")) + { + dtLotAttrib.Columns.Add("LotNo"); + if (!(dtLotNo == null) && dtLotNo.Rows.Count > 0) + { + foreach (DataRow dr in dtLotAttrib.Rows) + dr["LotNo"] = dtLotNo.Rows[0]["LotNo"].ToString(); + } + } + } + // 6. 基本檢查 + funBasisCheck(CIorCO: FunctionID, dtLotNo: dtLotNo, dtEquipment: dtEquipment, dtLotList: dtLotList, dtLotAttrib: dtLotAttrib, dtLotError: dtLotError, dtLotComponent: dtLotComponent, dtLotCompAttrib: dtLotCompAttrib, dtTempAttrib: ref dtTempAttrib, strLots: strLots); + + // 7.格式化Rule Check 資料 並進行ChkControlRule---------------------------------------------------------------------------------------------- + string strBatchComponent = ""; + string strAttrib = ""; + string strCAttrib = ""; + string strError = ""; + string strTemp = ""; + + // 7.1 需要判 Rule 的生產批 + var dtChkRuleLot = new DataTable("ChkRuleLot"); + string strRuleLot = ""; + dtChkRuleLot.Columns.Add("LotNo", Type.GetType("System.String")); + + foreach (DataRow rL in dtLotNo.Rows) + { + strRuleLot += CombineXMLValueTag( + CombineXMLValue("lotno", CInput(rL["LotNo"].ToString()))); + dtChkRuleLot.Rows.Add(rL["LotNo"].ToString()); + } + + // 7.2 格式化資料Component + foreach (DataRow rC in dtLotComponent.Rows) + { + strBatchComponent += CombineXMLValueTag( + CombineXMLValue("lotno", CInput(rC["LotNo"].ToString())) + + CombineXMLValue("componentno", CInput(rC["ComponentNo"].ToString()))); + } + + // 7.3 格式化-Key In Attrib + // KeyIn Attrib + //20240102,13871,0155146: [6.0.7]EAP接口Execute_CO_LOT,出站输入特性参数时,EAP和产品作业站输入一致,但是会提示报错 + DataTable attribtemp = null; + using (var obj = new clsLot()) + { + attribtemp = obj.ShowTemp_Attrib(LotNo).Tables[0]; + } + //foreach (DataRow rLA in dtLotAttrib.Rows) + //{ + // for (int x = 0, loopTo = attribtemp.Rows.Count - 1; x <= loopTo; x++) + // { + // if (rLA["AttribNo"].ToString() == attribtemp.Rows[x]["AttribNo"].ToString()) + // { + // attribtemp.Rows[x]["AttribValue"] = rLA["AttribValue"].ToString(); + // } + // } + //} + //20240102,13871,0155146,註解此 + //for (var i = 0; i < dtLotAttrib_Temp.Rows.Count - 1; i++) + //{ + // for (var j = 0; j < attribtemp.Rows.Count - 1; j++) + // { + // if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(attribtemp.Rows[j]["AttribNo"], dtLotAttrib_Temp.Rows[i]["AttribNo"], false))) + // { + // attribtemp.Rows[j]["AttribValue"] = CInput(dtLotAttrib_Temp.Rows[i]["AttribValue"].ToString()); + // } + // } + //} + //dtLotAttrib_Temp.Clear(); + //for (var p = 0; p < attribtemp.Rows.Count; p++) + //{ + // strAttrib = strAttrib + CombineXMLValueTag( + // CombineXMLValue("lotno", LotNo) + + // CombineXMLValue("attribno", CInput(attribtemp.Rows[p]["AttribNo"].ToString())) + + // CombineXMLValue("attribtype", attribtemp.Rows[p]["AttribType"].ToString()) + + // CombineXMLValue("attribsequence", attribtemp.Rows[p]["AttribSequence"].ToString()) + + // CombineXMLValue("attribsource", attribtemp.Rows[p]["AttribSource"].ToString()) + + // CombineXMLValue("attribphase", attribtemp.Rows[p]["AttribPhase"].ToString()) + + // CombineXMLValue("attribvalue", CInput(attribtemp.Rows[p]["AttribValue"].ToString())) + + // CombineXMLValue("savetolotpropertyno", CInput(attribtemp.Rows[p]["SaveToLotPropertyNo"].ToString())) + + // CombineXMLValue("qcitemno", CInput(attribtemp.Rows[p]["QCItemNo"].ToString()))); + // DataRow drTemp_Rows; + // drTemp_Rows = dtLotAttrib_Temp.NewRow(); + // drTemp_Rows["LotNo"] = LotNo; + // drTemp_Rows["AttribNo"] = attribtemp.Rows[p]["AttribNo"]; + // drTemp_Rows["AttribType"] = attribtemp.Rows[p]["AttribType"]; + // drTemp_Rows["AttribSequence"] = attribtemp.Rows[p]["AttribSequence"]; + // drTemp_Rows["AttribSource"] = attribtemp.Rows[p]["AttribSource"]; + // drTemp_Rows["AttribPhase"] = attribtemp.Rows[p]["AttribPhase"]; + // drTemp_Rows["AttribValue"] = attribtemp.Rows[p]["AttribValue"].ToString(); + // drTemp_Rows["SaveToLotPropertyNo"] = attribtemp.Rows[p]["SaveToLotPropertyNo"]; + // drTemp_Rows["QCItemNo"] = attribtemp.Rows[p]["QCItemNo"]; + // dtLotAttrib_Temp.Rows.Add(drTemp_Rows); + //} + + if (!(attribtemp == null)) + { + attribtemp.DefaultView.RowFilter = "(AttribPhase = " + intPhaseNo + " or AttribPhase = 99) And AttribSource <> 0"; // CurPhase & All的所有Attrib,除了KeyIn + for (int i = 0; i <= attribtemp.DefaultView.Count - 1; i++) + { + strTemp = CombineXMLValue("lotno", LotNo) + + CombineXMLValue("attribno", CInput(attribtemp.DefaultView[i]["AttribNo"].ToString())) + + CombineXMLValue("attribtype", attribtemp.DefaultView[i]["AttribType"].ToString()) + + CombineXMLValue("attribsequence", attribtemp.DefaultView[i]["AttribSequence"].ToString()) + + CombineXMLValue("attribsource", attribtemp.DefaultView[i]["AttribSource"].ToString()) + + CombineXMLValue("attribphase", attribtemp.DefaultView[i]["AttribPhase"].ToString()) + + CombineXMLValue("savetolotpropertyno", CInput(attribtemp.DefaultView[i]["SaveToLotPropertyNo"].ToString())); + if (attribtemp.DefaultView[i]["AttribValue"] is DBNull) + strTemp += CombineXMLValue("attribvalue", ""); + else + strTemp += CombineXMLValue("attribvalue", CInput(attribtemp.DefaultView[i]["AttribValue"].ToString())); + strAttrib += CombineXMLValueTag(strTemp); + } + //還原顯示 + attribtemp.DefaultView.RowFilter = "AttribSource <> 0 And AttribSource <> 1 And (AttribPhase = " + intPhaseNo + " or AttribPhase = 99)"; // Source = Not KeyIn, Not Calculate ,CurPhase and All + + //Temp:Attrib_KeyIn + for (int i = 0; i <= dtLotAttrib.Rows.Count - 1; i++) + { + if (dtLotAttrib.Rows[i]["AttribValue"] is DBNull) + dtLotAttrib.Rows[i]["AttribValue"] = ""; + + DataRow[] drChk = attribtemp.Select("AttribNo='" + dtLotAttrib.Rows[i]["AttribNo"] + "'"); + if (drChk.Length == 0) + { + throw new iMESException.MESException("0000-203010", "[%AttribNo%]:" + dtLotAttrib.Rows[i]["AttribNo"].ToString()); + } + else + { + strTemp = CombineXMLValue("lotno", LotNo) + + CombineXMLValue("attribno", CInput(dtLotAttrib.Rows[i]["AttribNo"].ToString())) + + CombineXMLValue("attribtype", drChk[0]["AttribType"].ToString()) + + CombineXMLValue("attribsequence", drChk[0]["AttribSequence"].ToString()) + + CombineXMLValue("attribsource", drChk[0]["AttribSource"].ToString()) + + CombineXMLValue("attribphase", drChk[0]["AttribPhase"].ToString()) + + CombineXMLValue("attribvalue", CInput(dtLotAttrib.Rows[i]["AttribValue"].ToString())) + + CombineXMLValue("savetolotpropertyno", CInput(drChk[0]["SaveToLotPropertyNo"].ToString())); + if (drChk[0]["QCItemNo"] is DBNull) + strTemp += CombineXMLValue("qcitemno", ""); + else + strTemp += CombineXMLValue("qcitemno", CInput(drChk[0]["QCItemNo"].ToString())); + + SaveLog1(strTemp, @"D:\MESLog\Execute_CO_LOT"); + + strAttrib += CombineXMLValueTag(strTemp); + } + } + } + + + // 7.4.格式化 Component Attrib + foreach (DataRow rCA in dtLotCompAttrib.Rows) + { + DataSet dsTemp; + using (var obj = new clsLot()) + { + dsTemp = obj.ShowTemp_ComponentAttrib(LotNo); + } + + for (int x = 0, loopTo1 = dsTemp.Tables[0].Rows.Count - 1; x <= loopTo1; x++) + { + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(rCA["AttribNo"], dsTemp.Tables[0].Rows[x]["AttribNo"], false))) + { + strCAttrib = strCAttrib + CombineXMLValueTag( + CombineXMLValue("lotno", LotNo) + + CombineXMLValue("componentno", CInput(dsTemp.Tables[0].Rows[x]["ComponentNo"].ToString())) + + CombineXMLValue("attribno", CInput(rCA["AttribNo"].ToString())) + + CombineXMLValue("attribtype", dsTemp.Tables[0].Rows[x]["AttribType"].ToString()) + + CombineXMLValue("attribsequence", dsTemp.Tables[0].Rows[x]["AttribSequence"].ToString()) + + CombineXMLValue("attribsource", dsTemp.Tables[0].Rows[x]["AttribSource"].ToString()) + + CombineXMLValue("attribphase", dsTemp.Tables[0].Rows[x]["AttribPhase"].ToString()) + + CombineXMLValue("attribvalue", CInput(rCA["AttribValue"].ToString())) + + CombineXMLValue("savetolotpropertyno", CInput(dsTemp.Tables[0].Rows[x]["SaveToLotPropertyNo"].ToString()))); + + DataRow drTemp_Rows; + drTemp_Rows = dtLotCompAttrib_Temp.NewRow(); + drTemp_Rows["LotNo"] = LotNo; + drTemp_Rows["ComponentNo"] = dsTemp.Tables[0].Rows[x]["ComponentNo"]; + drTemp_Rows["AttribNo"] = rCA["AttribNo"]; + drTemp_Rows["AttribType"] = dsTemp.Tables[0].Rows[x]["AttribType"]; + drTemp_Rows["AttribSequence"] = dsTemp.Tables[0].Rows[x]["AttribSequence"]; + drTemp_Rows["AttribSource"] = dsTemp.Tables[0].Rows[x]["AttribSource"]; + drTemp_Rows["AttribPhase"] = dsTemp.Tables[0].Rows[x]["AttribPhase"]; + drTemp_Rows["AttribValue"] = rCA["AttribValue"].ToString(); + drTemp_Rows["SaveToLotPropertyNo"] = dsTemp.Tables[0].Rows[x]["SaveToLotPropertyNo"]; + dtLotCompAttrib_Temp.Rows.Add(drTemp_Rows); + } + } + } + + // 7.5 格式化不良原因 + foreach (DataRow rE in dtLotError.Rows) + { + strError = strError + CombineXMLValueTag( + CombineXMLValue("lotno", CInput(rE["LotNo"].ToString())) + + CombineXMLValue("componentno", CInput(rE["ComponentNo"].ToString())) + + CombineXMLValue("errorno", CInput(rE["ErrorNo"].ToString())) + + CombineXMLValue("errorqty", rE["ErrorQty"].ToString()) + + CombineXMLValue("errorlevel", rE["ErrorLevel"].ToString())); + } + + // 7.6 Control Rule Check------------------------------------------------------------------------------------------------------------- + DataSet dsTestValue = null; + + //if (ChkControlRule_BatchComponent(dtChkRuleLot, true, UserNo, strRuleLot, strBatchComponent, ref strAttrib, ref strCAttrib, ref strLinkName, ref strMsg, ref strRuleNo, ref intERFType, ref dtLotRuleData, ref dtCompRuleData, ref strMailGroupNo, ref dsTestValue, strError) < 0) + if (tcEAI.clsEAP.ChkControlRule(ref dsTestValue, ref dtChkRuleLot, LotNo, UserNo, Conversions.ToLong(strLotStamp), ref strAttrib, ref strLinkName, ref strMsg, ref strRuleNo, ref intERFType, ref strMailGroupNo, strError) < 0) + + { + throw new iMESException.MESException("0000-200091", "[%LotNo%]:" + LotNo + ",Check Control Rule [%FUNCTION%][%Fail%]."); + } + + // Check SPC Contorl + if (funChkSPCControl_Var(UserNo, LotNo, ref strAttrib, dsTestValue, ref strLinkName, ref intERFType, ref strERFMsg, dtEquipment) < 0) + { + throw new iMESException.MESException("0000-200091", "[%LotNo%]:" + LotNo + ",Check SPC Contorl [%FUNCTION%][%Fail%]."); + } + strERFMsg = tcEAI.clsEAP.TranslateMsg(strERFMsg); + + //strAttrib to dtLotAttrib_Temp + dtLotAttrib_Temp = ConvertXmlToDataTable(dtLotAttrib_Temp, strAttrib); + + // 取得RuleNo + DataRow[] drSelHoldRule; + if (!(dtLotRuleData == null) && dtLotRuleData.Rows.Count > 0) + { + if (strLinkName == "HOLD") + { + drSelHoldRule = dtLotRuleData.Select("Linkname= 'HOLD'"); + if (drSelHoldRule.Length > 0) + { + strRuleNo = drSelHoldRule[0]["RuleNo"].ToString(); + } + } + } + + // 2020/03/12 Lena, 將 InXml 中的 LiknName、Lot Attrib、Component Attrib 置換為 Control Rule Check 後的結果 + string strLinkNameTagName = "linkname".ToLower(); + string strLAttribTagName = "attrib".ToLower(); + string strCAttribTagName = strCANodeName.ToLower(); + + int intStartIndex, intEndIndex; + string strHand, strLast, strChang; + string strInXml = InXML; + DataRow[] drSel; + + // LinkName + if (!string.IsNullOrEmpty(strLinkName)) + { + intStartIndex = Strings.InStr(strInXml, "<" + strLinkNameTagName + ">"); + intEndIndex = Strings.InStr(strInXml, ""); + if (intStartIndex > 0 && intEndIndex > 0) + { + strHand = strInXml.Substring(0, intStartIndex - 1); + strLast = Strings.Mid(strInXml, intEndIndex + strLinkNameTagName.Length + 3); + string argname = "LinkName"; + string argtype = "String"; + string argdesc = ""; + strChang = CombineXMLParameter(strLinkNameTagName, argname, argtype, strLinkName, argdesc); + strInXml = strHand + strChang + strLast; + } + } + + // Lot Attrib + if (!string.IsNullOrEmpty(strAttrib)) + { + intStartIndex = Strings.InStr(strInXml, "<" + strLAttribTagName + ">"); + intEndIndex = Strings.InStr(strInXml, ""); + if (intStartIndex > 0 && intEndIndex > 0) + { + strHand = strInXml.Substring(0, intStartIndex - 1); + strLast = Strings.Mid(strInXml, intEndIndex + strLAttribTagName.Length + 3); // strLAttribTagName.Length + 3 = 的長度 + string argtype1 = "String"; + string argdesc1 = ""; + strChang = CombineXMLParameterMultiValue(strLAttribTagName, strLAttribTagName, argtype1, strAttrib, argdesc1); + strInXml = strHand + strChang + strLast; + } + } + + // Component Attrib + if (!string.IsNullOrEmpty(strCAttrib)) + { + intStartIndex = Strings.InStr(strInXml, "<" + strCAttribTagName + ">"); + intEndIndex = Strings.InStr(strInXml, ""); + if (intStartIndex > 0 && intEndIndex > 0) + { + strHand = strInXml.Substring(0, intStartIndex - 1); + strLast = Strings.Mid(strInXml, intEndIndex + strCAttribTagName.Length + 3); // strCAttribTagName.Length + 3 = 的長度 + string argtype2 = "String"; + string argdesc2 = ""; + strChang = CombineXMLParameterMultiValue(strCAttribTagName, strCAttribTagName, argtype2, strCAttrib, argdesc2); + strInXml = strHand + strChang + strLast; + } + } + + InXML = strInXml; + + dtChkRuleLot2 = dtChkRuleLot.Copy(); + + //var drSelRule = default(DataRow[]); + //foreach (DataRow drTempComponent in dtCompRuleData.Rows) + //{ + // if (Strings.Right(drTempComponent["RuleAction"].ToString(), 4) == "HOLD") + // { + // drSelRule = dtLotRuleData.Select("LotNo = '" + drTempComponent["LotNo"].ToString() + "'"); + // if (drSelRule.Length > 0) + // { + // drSelRule[0]["LinkName"] = Strings.Right(drTempComponent["RuleAction"].ToString(), 4); + // if (string.IsNullOrEmpty(drSelRule[0]["RuleNo"].ToString())) + // { + // drSelRule[0]["RuleNo"] = drTempComponent["RuleNo"].ToString(); + // } + // else + // { + // drSelRule[0]["RuleNo"] = drSelRule[0]["RuleNo"] + "," + drTempComponent["RuleNo"].ToString(); + // } + // } + // } + // else if (drTempComponent["RuleAction"].ToString() == "WAIT") + // { + // drSelRule = dtLotRuleData.Select("LotNo = '" + drTempComponent["LotNo"].ToString() + "'"); + // if (drSelRule.Length > 0) + // { + // if (drSelRule[0]["LinkName"].ToString() != "PASS") + // { + // drSelRule[0]["LinkName"] = "WAIT"; + // if (string.IsNullOrEmpty(drSelRule[0]["RuleNo"].ToString())) + // { + // drSelRule[0]["RuleNo"] = drTempComponent["RuleNo"].ToString(); + // } + // else + // { + // drSelRule[0]["RuleNo"] = drSelRule[0]["RuleNo"] + "," + drTempComponent["RuleNo"].ToString(); + // } + // } + // } + // } + //} + + // =============================================== 68289 End =============================================== + } + + // 將LotStamp替換為TriggerOP後的LotStamp + if (blnEXETriggerOP) + { + string strLotStampTagName = "lotstamp".ToLower(); + + int intStartIndex, intEndIndex; + string strHand, strLast, strChang; + string strInXml = InXML; + DataRow[] drSel; + + // 取得LotStamp + intStartIndex = Strings.InStr(strInXml, "<" + strLotStampTagName + ">"); + intEndIndex = Strings.InStr(strInXml, ""); + if (intStartIndex > 0 && intEndIndex > 0) + { + strHand = strInXml.Substring(0, intStartIndex - 1); + strLast = Strings.Mid(strInXml, intEndIndex + strLotStampTagName.Length + 3); + string argname1 = "LotStamp"; + string argtype3 = "Long"; + string argvalue = Conversions.ToInteger(dtLotState.Rows[0]["LotStamp"]).ToString(); + string argdesc3 = ""; + strChang = CombineXMLParameter(strLotStampTagName, argname1, argtype3, argvalue, argdesc3); + strInXml = strHand + strChang + strLast; + InXML = strInXml; + } + } + + if (LinkName != defString) + { + strLinkName = LinkName; + } + + string strcheckinresult = ""; // BR_CheckIn回傳success or fail + using (var obj = new clsLot()) + { + if (FunctionID == "CO") + { + // 5.取出GoodQty,GoodUnitNo--------------------------------------------------------------------------------------------------- + DataRow[] drSel; + double GoodQty = 0d; + + drSel = dtLotAttrib_Temp.Select("AttribNo='GoodQty'"); + if (drSel.Length == 0) + { + throw new iMESException.MESException("0000-200001", "[%CheckOut%] [%GoodQty%] [%not found%]"); + } + else + { + GoodQty = Convert.ToDouble(drSel[0]["AttribValue"]); + } + // 進站之前已扣料過。 + strcheckinresult = obj.BR_CheckOut(Conversions.ToLong(strLotStamp), LotNo, strLinkName, dtLotAttrib_Temp, dtEquipment, null, null, (decimal)GoodQty, UserNo); + + strRetrunMsg = strcheckinresult; + // 9.Return Value + if (!string.IsNullOrEmpty(strRetrunMsg)) + { + strResult = "fail"; + throw new iMESException.MESException("0000-200011", "[%LotNo%] : " + LotNo + "[%Execute%] [%Fail%]."); + } + else + { + strException = ""; + strResult = "success"; + } + } + + else + { + strcheckinresult = obj.BR_CheckIn(Conversions.ToLong(strLotStamp), LotNo, strLinkName, dtLotAttrib_Temp, dtEquipment, UserNo, ShiftNo, dtAccessory: dtAccessory); + strRetrunMsg = strcheckinresult; + + // 9.Return Value + if (strRetrunMsg == "success") + { + strException = ""; + strResult = "success"; + } + else + { + strResult = "fail"; + throw new iMESException.MESException("0000-200011", "[%LotNo%] : " + LotNo + "[%Execute%] [%Fail%]."); + } + } + } + + + + objSYS.AddEventLog(strServiceName, UserNo, "LotNo", LotNo, DateTime.Now, "ExecuteLot", ComputerName: ComputerName); + // Call BRTransferLot(LotNo, UserNo, strLinkName, 1) + tcEAI.clsEAP.BRTransferLot_Bin(LotNo, UserNo, strLinkName, intERFType, strRuleNo, ComputerName: ComputerName, RuleMsg: strERFMsg); + + + lblExitProcedure: + ; + } + + + catch (iMESException.MESException ex) + { + + if (FunctionID == "CI") + { + if (dtLotNo.Columns.Contains("blnEXETriggerOP")) + { + // CheckIn失敗將狀態變更回Queue + foreach (DataRow drTempLotInfo in dtLotNo.Rows) + { + if (Convert.ToBoolean(drTempLotInfo["blnEXETriggerOP"])) + { + DataRow[] drSel = dtLotState.Select("LotNO='" + drTempLotInfo["LotNo"] + "'".ToString()); + // Call objReverse.ExecuteReverse(drSel(0)("LotNo"), "AutoExe", Now, , , , , drSel(0)("LotStamp")) + // Call objLot.ExeReverseTriggerOP(drSel(0)("LotNo"), drSel(0)("LotSerial"), drSel(0)("LogGroupSerial"), drSel(0)("LotStamp")) + ExeReverseTriggerOP_NotUseUndo(UserNo, Convert.ToString(drSel[0]["LotNo"]), Convert.ToString(drSel[0]["LotSerial"]), Conversions.ToInteger(drSel[0]["LotStamp"]), ComputerName); + } + } + } + } + + strResult = "fail"; + strRetrunMsg = ex.Message; + + objSYS.AddErrorLog_ErrorCode(strServiceName, UserNo, "LotNo", LotNo, DateTime.Now, ex.Message + " : " + ex.StackTrace, ComputerName: ComputerName, ErrorCode: Convert.ToString(ex.ErrorCode)); + + throw ex; + } + + catch (Exception ex) + { + + if (FunctionID == "CI") + { + // CheckIn失敗將狀態變更回Queue + if (dtLotNo.Columns.Contains("blnEXETriggerOP")) + { + foreach (DataRow drTempLotInfo in dtLotNo.Rows) + { + if (Convert.ToBoolean(drTempLotInfo["blnEXETriggerOP"])) + { + DataRow[] drSel = dtLotState.Select("LotNO='" + drTempLotInfo["LotNo"] + "'".ToString()); + // Call objReverse.ExecuteReverse(drSel(0)("LotNo"), "AutoExe", Now, , , , , drSel(0)("LotStamp")) + // Call objLot.ExeReverseTriggerOP(drSel(0)("LotNo"), drSel(0)("LotSerial"), drSel(0)("LogGroupSerial"), drSel(0)("LotStamp")) + ExeReverseTriggerOP_NotUseUndo(UserNo, Convert.ToString(drSel[0]["LotNo"]), Convert.ToString(drSel[0]["LotSerial"]), Conversions.ToInteger(drSel[0]["LotStamp"]), ComputerName); + } + } + } + } + + strResult = "fail"; + strRetrunMsg = ex.Message; + objSYS.AddErrorLog_ErrorCode(strServiceName, UserNo, "LotNo", LotNo, DateTime.Now, ex.Message + " : " + ex.StackTrace, ComputerName: ComputerName); + + throw ex; + } + + finally + { + if (!(drTemp == null)) + drTemp.Close(); + if (!(objLot == null)) + { + objLot.Dispose(); + objLot = null; + } + if (!(objSYS == null)) + { + objSYS.Dispose(); + objSYS = null; + } + AutoexecutionLot_LotRet = strRetrunMsg; + CloseConnection(cnnTemp); + } + + return AutoexecutionLot_LotRet; + } + + private static short funCheckStateByLot(ref string strKernelModule, ref string strKernelFunctionName, string strLotNo, DataRow drLotState, string strFunctionId = defString, string strOPNo = defString) + { + + try + { + // C1:檢查狀態是否符合 + if (strFunctionId == "CI") + { + // CI,狀態必須是0. + if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drLotState["Status"], 0, false))) + { + // 生產批狀態不可執行此動作! + throw new iMESException.MESException("0000-217001", "[%LotNo%]:" + strLotNo + ",[%Status%] [%is not%] [%Queue%]!"); + } + // ElseIf strFunctionId = "CO" Then + // 'CO,狀態必須是1. + // If drLotState("Status") <> 1 Then + // Throw New iMESException.MESException("0000-217001", "[%LotNo%]:" & strLotNo & ",[%Status%] [%is not%] [%Running%]!") + // End If + } + + // C2:檢查作業站是否符合 + if (strOPNo != defString) + { + if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(strOPNo, drLotState["OPNo"], false))) + { + throw new iMESException.MESException("0000-203029", "[%LotNo%]:" + strLotNo + ",[%CurOPNo%] [%is not%] " + strOPNo + "!"); + } + } + + // 取得BR設定之KernelModule,KernelFunctionName + using (var objOP = new clsOpBasis()) + { + DataRow drBR; + drBR = objOP.GetBusinessRule(drLotState["BRNo"].ToString()); + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drBR["BRNo"], "", false))) + { + throw new iMESException.MESException("0000-200003", "[%BRNo%]:" + drLotState["BRNo"]); + } + } + } + + + catch (Exception ex) + { + throw; + } + + return default(short); + + + } + private static int funChkSPCControl_Var(string UserNo, string LotNo, ref string strAttrib, DataSet dsTestValue, ref string strLinkName, ref int intERFType, ref string strERFMsg, DataTable Equipment = default(DataTable)) + { + int funChkSPCControl_VarRet = default(int); + + funChkSPCControl_VarRet = -1; + + string InXml, OutXml, strIdentity, strParameter; + XmlDocument XmlDoc = new XmlDocument(); + string strTemp; + + string strEquipmentNo = defString; + string strQCItemNo = defString; + + try + { + // 檢查設備是不是1台 + if (!(Equipment == null)) + { + if (Equipment.Rows.Count == 1) + strEquipmentNo = Equipment.Rows[0]["EquipmentNo"].ToString(); + else + throw new iMESException.MESException("0000-103010", "[%SAVETOQCITEM%],[%ONLY SINGLE EQUIPMENT%]"); + } + + // 檢查有無需要拋SPC + if (dsTestValue == null || dsTestValue.Tables[0].Select(" QCItemNo <> '' ").Length <= 0) + { + funChkSPCControl_VarRet = 0; + return funChkSPCControl_VarRet; + } + + // 新增check spc拋回的資料欄 + dsTestValue.Tables[0].Columns.Add("Result", System.Type.GetType("System.String")); + dsTestValue.Tables[0].Columns.Add("Result_INT", System.Type.GetType("System.Int32")); + dsTestValue.Tables[0].Columns.Add("FactorSerial", System.Type.GetType("System.String")); + dsTestValue.Tables[0].Columns.Add("ERFMsg", System.Type.GetType("System.String")); + + // 檢查SPC管制規格 + strIdentity = CombineXMLIdentity("EAI", UserNo, Convert.ToString(DateTime.Now)); + strParameter = CombineXMLParameter("lotno", "LotNo", "String", CInput(LotNo), ""); + if (strEquipmentNo != defString) + { + strParameter += CombineXMLParameter("equipmentno", "EquipmentNo", "String", CInput(strEquipmentNo), ""); + } + InXml = CombineXMLRequest(strIdentity, strParameter); + + object[] aryPars = clsCom.funGetMethodParameters("wsSTD", "wsSPC", "CheckSPCContorl_Var"); + aryPars[0] = InXml; + aryPars[1] = dsTestValue; + OutXml = clsCom.funExecuteMethod("wsSTD", "wsSPC", "CheckSPCContorl_Var", ref aryPars) as string; + + XmlDoc.LoadXml(OutXml); + if (chkExecutionSuccess(XmlDoc)) + { + strLinkName = funGetFinalLinkName(strLinkName, dsTestValue.Tables[0], intERFType); + dsTestValue.Tables[0].DefaultView.Sort = "QCItemNo"; + if (!(dsTestValue.Tables[0] == null) && dsTestValue.Tables[0].DefaultView.ToTable().Rows.Count > 0) + { + strERFMsg = ""; + strAttrib = ""; + foreach (DataRow dr in dsTestValue.Tables[0].Rows) + { + strTemp = CombineXMLValue("attribno", CInput(dr["AttribNo"].ToString())) + + CombineXMLValue("attribtype", dr["AttribType"].ToString()) + + CombineXMLValue("attribsequence", dr["AttribSequence"].ToString()) + + CombineXMLValue("attribsource", dr["AttribSource"].ToString()) + + CombineXMLValue("attribphase", dr["AttribPhase"].ToString()) + + CombineXMLValue("attribvalue", CInput(dr["AttribValue"].ToString())) + + CombineXMLValue("savetolotpropertyno", CInput(dr["SaveToLotPropertyNo"].ToString())); + + if (!(dr["QCItemNo"] is DBNull)) + { + strTemp += CombineXMLValue("qcitemno", CInput(dr["QCItemNo"].ToString())); + + if ((strQCItemNo == defString || strQCItemNo != dr["QCItemNo"].ToString()) && !(dr["ERFMsg"] is DBNull)) + { + strQCItemNo = dr["QCItemNo"].ToString(); + strERFMsg += dr["ERFMsg"].ToString() + ControlChars.Lf; + } + } + else + { + strTemp += CombineXMLValue("qcitemno", ""); + } + if (!(dr["Result"] is DBNull)) + strTemp += CombineXMLValue("result", CInput(dr["Result"].ToString())); + else + strTemp += CombineXMLValue("result", ""); + if (!(dr["Result_INT"] is DBNull)) + strTemp += CombineXMLValue("result_int", CInput(dr["Result_INT"].ToString())); + else + strTemp += CombineXMLValue("result_int", ""); + if (!(dr["FactorSerial"] is DBNull)) + strTemp += CombineXMLValue("factorserial", CInput(dr["FactorSerial"].ToString())); + else + strTemp += CombineXMLValue("factorserial", ""); + if (!(dr["SerialNo"] is DBNull)) + strTemp += CombineXMLValue("serialno", CInput(dr["SerialNo"].ToString())); + else + strTemp += CombineXMLValue("serialno", ""); + + strAttrib += CombineXMLValueTag(strTemp); + } + } + + funChkSPCControl_VarRet = 0; + } + } + catch (Exception ex) + { + throw; + } + return funChkSPCControl_VarRet; + } + private static string funGetFinalLinkName(string strLinkName, DataTable dtKeyIn, int intERFType = defInteger) + { + string funGetFinalLinkNameRet = default(string); + + try + { + // ===== 整理生產批品管項目結果 ========= + string strSPCLinkName = ""; + if (dtKeyIn.Select(" Result = 'HOLD' ").Length > 0) + strSPCLinkName = "HOLD"; + else if (dtKeyIn.Select(" Result = 'WAIT' ").Length > 0) + strSPCLinkName = "WAIT"; + else if (dtKeyIn.Select(" Result = 'WARNING' ").Length > 0) + strSPCLinkName = "WARNING"; + else if (dtKeyIn.Select(" Result = 'ALARM' ").Length > 0) + strSPCLinkName = "ALARM"; + else if (dtKeyIn.Select(" Result = 'ALERT' ").Length > 0) + strSPCLinkName = "ALERT"; + if (funGetLinkNamePriority(strLinkName) < funGetLinkNamePriority(strSPCLinkName)) + { + strLinkName = strSPCLinkName; + if (strLinkName == "HOLD") + intERFType = 1; + } + + funGetFinalLinkNameRet = strLinkName; + } + catch (Exception ex) + { + throw; + } + return funGetFinalLinkNameRet; + } + + // 取得Link Name權重 + private static int funGetLinkNamePriority(string strLinkName) + { + int funGetLinkNamePriorityRet = default(int); + + try + { + int intResult = -1; + // ===== 整理生產批(各品管項目綜合)結果,並存入資料庫 ========= + if (Strings.InStr(strLinkName, "HOLD") > 0) + intResult = 5; + else if (Strings.InStr(strLinkName, "WAIT") > 0) + intResult = 4; + else if (Strings.InStr(strLinkName, "ALARM") > 0) + intResult = 0; + else if (Strings.InStr(strLinkName, "ALERT") > 0) + intResult = 0; + else + intResult = 0; + + funGetLinkNamePriorityRet = intResult; + } + catch (Exception ex) + { + throw; + } + return funGetLinkNamePriorityRet; + } + public static DataTable ConvertXmlToDataTable(DataTable dataTable, string xmlString) + { + XmlDocument XmlDoc = new XmlDocument(); + + if (!(xmlString.Contains("") && xmlString.Contains(""))) + { + xmlString = "" + xmlString + ""; + } + + XmlDoc.LoadXml(xmlString); + + foreach (XmlNode node in XmlDoc.DocumentElement.ChildNodes) + { + DataRow row = dataTable.NewRow(); + foreach (XmlNode childNode in node.ChildNodes) + { + if (dataTable.Columns.Contains(childNode.Name)) + { + switch (dataTable.Columns[childNode.Name].DataType.ToString()) + { + case "System.Int32": + { + row[childNode.Name] = Conversions.ToInteger(childNode.InnerText); + break; + } + default: + { + row[childNode.Name] = childNode.InnerText; + break; + } + } + } + } + dataTable.Rows.Add(row); + } + + return dataTable; + } + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// 0:預設檢察區域設備,非0不檢察區域設備 + private static void funBasisCheck(string CIorCO, DataTable dtLotNo, DataTable dtEquipment, DataTable dtLotList, DataTable dtLotAttrib, DataTable dtLotError, DataTable dtLotComponent, DataTable dtLotCompAttrib, ref DataTable dtTempAttrib, string strLots, string Type = defString, short pRunningMdoe = 0) + { + + DataRow[] drSel; + DataTable dtTempCopmonentAttrib; + try + { + + // 判斷PhaseNo + int PhaseNo = 99; + if (CIorCO == "CI") + { + PhaseNo = 1; + } + else if (CIorCO == "CO") + { + PhaseNo = 2; + } + + // 1.設備檢查 + if (pRunningMdoe == 0 && CIorCO == "CI") + { + + // 1.1 載入區域設備可用設備 + foreach (DataRow r in dtLotNo.Rows) + { + DataTable dtAvailableEquipment_All; + DataTable dtAvailableEquipment_Chamber; + using (var objLot = new clsLot()) + { + dtAvailableEquipment_All = objLot.ShowAvailableEquipment_All(r["LotNo"].ToString()).Tables[0]; + dtAvailableEquipment_Chamber = objLot.ShowAvailableEquipment_All(r["LotNo"].ToString()).Tables["Chamber"]; + } + + drSel = dtAvailableEquipment_All.Select(" AllowExecute=1 "); + + // 1.2 若區域內無可用設備,但卻傳入設備編號則拋出錯誤訊息 + if (drSel.Length == 0) + { + if (dtEquipment.Rows.Count > 0) + { + throw new iMESException.MESException("0000-003000", "[%Area has none Available Equipment%]"); + } + } + else + { + + // 1.3 若傳入設備編號不在區域可用設備中則拋出錯誤訊息 + foreach (DataRow rE in dtEquipment.Rows) + { + drSel = dtAvailableEquipment_All.Select(" AllowExecute=1 And EquipmentNo = '" + rE["EquipmentNo"] + "' ".ToString()); + if (drSel.Length == 0) + { + //判断子设备是否存在 + if (!(dtAvailableEquipment_Chamber is null) && dtAvailableEquipment_Chamber.Rows.Count > 0) + { + drSel = dtAvailableEquipment_Chamber.Select(" AllowExecute=1 And EquipmentNo = '" + rE["EquipmentNo"] + "' ".ToString()); + if (drSel.Length == 0) + { + throw new iMESException.MESException("0000-003000", "[%EquipmentNo%]: " + rE["EquipmentNo"] + " [%Not In Available Equipment%]"); + } + } + else + { + throw new iMESException.MESException("0000-003000", "[%EquipmentNo%]: " + rE["EquipmentNo"] + " [%Not In Available Equipment%]"); + } + } + } + } + + } + + } + + // 2.檢查KeyInAttrib + // 2.1 取得所有傳入Lot的AttribPhase = PhaseNo並且為99 的Keyin TempAttrib + using (var ds = new DataSet()) + { + AppSettings objSetting = new AppSettings(); + //string argstrDataBaseType = "Null"; + //using (var cn = new OleDbConnection(objSetting.GetConnectionString(strDataBaseType: ref argstrDataBaseType))) + //{ + // using (var da = new OleDbDataAdapter("Select A.*,B.ElementName As AttribName, B.InputType, B.DataType, B. ValueType " + " From tblWIPTemp_Attrib A, tblSYSElementBasis B " + " Where A.AttribNo=B.ElementNo And A.AttribSource = 0 " + " and (AttribPhase = 99 or AttribPhase = " + PhaseNo + ") And B.AllowNull = 0 And A.LotNo In " + strLots, cn)) + // { + // da.Fill(ds.Tables.Add("TempAttrib")); + // } + //} + ExecuteSQLQuery_Adapter( + "Select A.*,B.ElementName As AttribName, B.InputType, B.DataType, B. ValueType " + + " From tblWIPTemp_Attrib A, tblSYSElementBasis B " + + " Where A.AttribNo=B.ElementNo And A.AttribSource = 0 " + + " and (AttribPhase = 99 or AttribPhase = " + PhaseNo + ") And B.AllowNull = 0 And A.LotNo In " + strLots, + ds.Tables.Add("TempAttrib"), objSetting.GetConnectionString(), objSetting.GetDataBaseType()); + dtTempAttrib = ds.Tables[0]; + } + + // 2.2 取得所有傳入Lot的AttribPhase = PhaseNo並且為99 的Keyin TempCopmonentAttrib + using (var ds = new DataSet()) + { + AppSettings objSetting = new AppSettings(); + //string argstrDataBaseType1 = "Null"; + //using (var cn = new OleDbConnection(objSetting.GetConnectionString(strDataBaseType: ref argstrDataBaseType1))) + //{ + // using (var da = new OleDbDataAdapter("Select A.*,B.ElementName As AttribName, B.InputType, B.DataType, B. ValueType " + " From tblWIPTemp_ComponentAttrib A, tblSYSElementBasis B " + " Where A.AttribNo=B.ElementNo And A.AttribSource = 0 " + " and (AttribPhase = 99 or AttribPhase = " + PhaseNo + ") And B.AllowNull = 0 And A.LotNo In " + strLots, cn)) + // { + // da.Fill(ds.Tables.Add("TempCopmonentAttrib")); + // } + //} + ExecuteSQLQuery_Adapter( + "Select A.*,B.ElementName As AttribName, B.InputType, B.DataType, B. ValueType " + + " From tblWIPTemp_ComponentAttrib A, tblSYSElementBasis B " + + " Where A.AttribNo=B.ElementNo And A.AttribSource = 0 " + + " and (AttribPhase = 99 or AttribPhase = " + PhaseNo + ") And B.AllowNull = 0 And A.LotNo In " + strLots, + ds.Tables.Add("TempCopmonentAttrib"), objSetting.GetConnectionString(), objSetting.GetDataBaseType()); + dtTempCopmonentAttrib = ds.Tables[0]; + } + + foreach (DataRow rL in dtLotNo.Rows) + { + + switch (Type) + { + case "ASM": // //因為欄位大小寫問題,且以XML檢查為主 + { + + foreach (DataRow rLA in dtLotAttrib.Rows) + { + drSel = dtTempAttrib.Select(" AttribNo = '" + rLA["attribno"] + "' ".ToString()); + if (drSel.Length == 0) + { + throw new iMESException.MESException("0000-200002", "[%LotNo%]:" + + rLA["attribno"] + " ,[%AttribNo%]: " + rLA["attribno"] + " [%NOT PASS ARGUMENTS%]"); + } + } + + + foreach (DataRow rCA in dtLotCompAttrib.Rows) + { + drSel = dtTempCopmonentAttrib.Select(" AttribNo = '" + rCA["attribno"] + "' ".ToString()); + if (drSel.Length == 0) + { + throw new iMESException.MESException("0000-200002", "[%LotNo%]:" + + rCA["attribno"] + " ,[%AttribNo%]: " + rCA["attribno"] + " [%NOT PASS ARGUMENTS%]"); + } + + // 2.3 若為CPASS,並且傳入值為1時,必須存在相對應的Error + else if (drSel[0]["AttribNo"].ToString().ToUpper() == "CPASS" && Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel[0]["AttribValue"], 1, false))) + { + drSel = dtLotError.Select(" LotNo = '" + + rCA["LotNo"] + "' And ComponentNo = '" + rCA["ComponentNo"] + "' "); + if (drSel.Length == 0) + { + throw new iMESException.MESException("0000-200002", "[%LotNo%]:" + + rCA["LotNo"] + " ,[%AttribNo%]: " + rCA["AttribNo"] + " Error Data "); + } + } + } + + break; + } + + case "LotAttrib": //只檢查 LotAttrib + { + // 2.3 LotAttrib 若為not null Attrib未傳入則拋出錯誤訊息 + foreach (DataRow rLA in dtTempAttrib.Select("LotNo = '" + rL["LotNo"] + "' And AttribType = 0 ".ToString())) + { + drSel = dtLotAttrib.Select(" LotNo = '" + rLA["LotNo"] + "' And AttribNo = '" + rLA["AttribNo"] + "' ".ToString()); + if (drSel.Length == 0) + { + throw new iMESException.MESException("0000-200002", "[%LotNo%]:" + + rLA["LotNo"] + " ,[%AttribNo%]: " + rLA["AttribNo"] + " [%NOT PASS ARGUMENTS%]"); + } + } + break; + } + + default: + { + + // 2.3 LotAttrib 若為not null Attrib未傳入則拋出錯誤訊息 + foreach (DataRow rLA in dtTempAttrib.Select("LotNo = '" + rL["LotNo"] + "' And AttribType = 0 ".ToString())) + { + drSel = dtLotAttrib.Select(" LotNo = '" + rLA["LotNo"] + "' And AttribNo = '" + rLA["AttribNo"] + "' ".ToString()); + if (drSel.Length == 0) + { + throw new iMESException.MESException("0000-200002", "[%LotNo%]:" + + rLA["LotNo"] + " ,[%AttribNo%]: " + rLA["AttribNo"] + " [%NOT PASS ARGUMENTS%]"); + } + } + + // 2.4 ComponentAttrib 若為not null Attrib未傳入則報錯 + foreach (DataRow rCA in dtTempCopmonentAttrib.Select("LotNo = '" + rL["LotNo"] + "' And AttribType = 1 ".ToString())) + { + drSel = dtLotCompAttrib.Select(" LotNo = '" + + rCA["LotNo"] + "' And AttribNo = '" + rCA["AttribNo"] + "' "); + if (drSel.Length == 0) + { + throw new iMESException.MESException("0000-200002", "[%LotNo%]:" + + rCA["LotNo"] + " ,[%AttribNo%]: " + rCA["AttribNo"] + " [%NOT PASS ARGUMENTS%]"); + } + + // 2.3 若為CPASS,並且傳入值為1時,必須存在相對應的Error + else if (drSel[0]["AttribNo"].ToString().ToUpper() == "CPASS" && Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel[0]["AttribValue"], 1, false))) + { + drSel = dtLotError.Select(" LotNo = '" + + rCA["LotNo"] + "' And ComponentNo = '" + rCA["ComponentNo"] + "' "); + if (drSel.Length == 0) + { + throw new iMESException.MESException("0000-200002", "[%LotNo%]:" + + rCA["LotNo"] + " ,[%AttribNo%]: " + rCA["AttribNo"] + " Error Data "); + } + } + } + + break; + } + } + + } + } + + catch (iMESException.MESException ex) + { + throw ex; + } + catch (Exception ex) + { + throw ex; + } + finally + { + } + + } + + private void funBasisCheck(string CIorCO, DataTable dtLotNo, DataTable dtEquipment, DataTable dtLotList, DataTable dtLotAttrib, DataTable dtLotError, ref DataTable dtTempAttrib, string strLots, string Type = defString, short pRunningMdoe = 0) + { + + DataRow[] drSel; + DataTable dtTempCopmonentAttrib; + try + { + // 判斷PhaseNo + int PhaseNo = 99; + if (CIorCO == "CI") + { + PhaseNo = 1; + } + else if (CIorCO == "CO") + { + PhaseNo = 2; + } + + // 1.設備檢查 + if (pRunningMdoe == 0 && CIorCO == "CI") + { + // 1.1 載入區域設備可用設備 + foreach (DataRow r in dtLotNo.Rows) + { + DataTable dtAvailableEquipment_All; + using (var objLot = new clsLot()) + { + dtAvailableEquipment_All = objLot.ShowAvailableEquipment_All(r["LotNo"].ToString()).Tables[0]; + } + + drSel = dtAvailableEquipment_All.Select(" AllowExecute=1 "); + + // 1.2 若區域內無可用設備,但卻傳入設備編號則拋出錯誤訊息 + if (drSel.Length == 0) + { + if (dtEquipment.Rows.Count > 0) + throw new iMESException.MESException("0000-003000", "[%Area has none Available Equipment%]"); + + } + else + { + // 1.3 若傳入設備編號不在區域可用設備中則拋出錯誤訊息 + foreach (DataRow rE in dtEquipment.Rows) + { + drSel = dtAvailableEquipment_All.Select(" AllowExecute=1 And EquipmentNo = '" + rE["EquipmentNo"] + "' ".ToString()); + if (drSel.Length == 0) + { + throw new iMESException.MESException("0000-003000", "[%EquipmentNo%]: " + + rE["EquipmentNo"] + " [%Not In Available Equipment%]"); + } + } + } + } + } + + // 2.檢查KeyInAttrib + // 2.1 取得所有傳入Lot的AttribPhase = PhaseNo並且為99 的Keyin TempAttrib + using (var ds = new DataSet()) + { + AppSettings objSetting = new AppSettings(); + + ExecuteSQLQuery_Adapter( + "Select A.*,B.ElementName As AttribName, B.InputType, B.DataType, B. ValueType " + + " From tblWIPTemp_Attrib A, tblSYSElementBasis B " + + " Where A.AttribNo=B.ElementNo And A.AttribSource = 0 " + + " and (AttribPhase = 99 or AttribPhase = " + PhaseNo + ") And B.AllowNull = 0 And A.LotNo In " + strLots, + ds.Tables.Add("TempAttrib"), objSetting.GetConnectionString(), objSetting.GetDataBaseType()); + dtTempAttrib = ds.Tables[0]; + } + + // 2.2 取得所有傳入Lot的AttribPhase = PhaseNo並且為99 的Keyin TempCopmonentAttrib + using (var ds = new DataSet()) + { + AppSettings objSetting = new AppSettings(); + ExecuteSQLQuery_Adapter( + "Select A.*,B.ElementName As AttribName, B.InputType, B.DataType, B. ValueType " + + " From tblWIPTemp_ComponentAttrib A, tblSYSElementBasis B " + + " Where A.AttribNo=B.ElementNo And A.AttribSource = 0 " + + " and (AttribPhase = 99 or AttribPhase = " + PhaseNo + ") And B.AllowNull = 0 And A.LotNo In " + strLots, + ds.Tables.Add("TempCopmonentAttrib"), objSetting.GetConnectionString(), objSetting.GetDataBaseType()); + dtTempCopmonentAttrib = ds.Tables[0]; + } + + foreach (DataRow rL in dtLotNo.Rows) + { + switch (Type) + { + case "ASM": // //因為欄位大小寫問題,且以XML檢查為主 + { + foreach (DataRow rLA in dtLotAttrib.Rows) + { + drSel = dtTempAttrib.Select(" AttribNo = '" + rLA["attribno"] + "' ".ToString()); + if (drSel.Length == 0) + { + throw new iMESException.MESException("0000-200002", "[%LotNo%]:" + + rLA["attribno"] + " ,[%AttribNo%]: " + rLA["attribno"] + " [%NOT PASS ARGUMENTS%]"); + } + } + + break; + } + + case "LotAttrib": //只檢查 LotAttrib + { + // 2.3 LotAttrib 若為not null Attrib未傳入則拋出錯誤訊息 + foreach (DataRow rLA in dtTempAttrib.Select("LotNo = '" + rL["LotNo"] + "' And AttribType = 0 ".ToString())) + { + drSel = dtLotAttrib.Select(" LotNo = '" + rLA["LotNo"] + "' And AttribNo = '" + rLA["AttribNo"] + "' ".ToString()); + if (drSel.Length == 0) + { + throw new iMESException.MESException("0000-200002", "[%LotNo%]:" + + rLA["LotNo"] + " ,[%AttribNo%]: " + rLA["AttribNo"] + " [%NOT PASS ARGUMENTS%]"); + } + } + break; + } + + default: + { + // 2.3 LotAttrib 若為not null Attrib未傳入則拋出錯誤訊息 + foreach (DataRow rLA in dtTempAttrib.Select("LotNo = '" + rL["LotNo"] + "' And AttribType = 0 ".ToString())) + { + drSel = dtLotAttrib.Select(" LotNo = '" + rLA["LotNo"] + "' And AttribNo = '" + rLA["AttribNo"] + "' ".ToString()); + if (drSel.Length == 0) + { + throw new iMESException.MESException("0000-200002", "[%LotNo%]:" + + rLA["LotNo"] + " ,[%AttribNo%]: " + rLA["AttribNo"] + " [%NOT PASS ARGUMENTS%]"); + } + } + + break; + } + } + } + + } + catch (iMESException.MESException ex) + { + throw ex; + } + catch (Exception ex) + { + throw ex; + } + finally + { + } + + } + #endregion + + + + #region EAP 客制接口 + /// + /// 首站进站 + /// + /// + /// + /// + /// + /// + public static bool funTrackIn_Inquiry(ref List aryMessage, ref List aryException, string MONO, string EQPID) + { + bool funTrackIn_Inquiry = default(bool); + //bool r = false; + string strSQL = default(string); + IDbConnection cnnTemp = null; + DbDataReader drTemp = null; + + AppSettings objSetting = new AppSettings(); + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + DataSet dsData = new DataSet(); + + + + string strReturn = ""; + + + + + + + int EQPSTATE = 0; //设备管控闲置状态 + + int nowEQPSTATE = 0; //现在设备管控闲置状态 + + string strLotNo = "";//生产批号 + + try + { + //先检查 设备状态是否是闲置 + + //检查设备是否存在 + strSQL = "SELECT 1 FROM TBLEQPEQUIPMENTBASIS WHERE EQUIPMENTNO='" + EQPID + "' AND ISSUESTATE = 2"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + //throw new iMESException.MESException("0000-202001", +" :设备不存在!"); + clsERP.combineMessage(ref aryMessage, mmsg: EQPID + "[%:设备不存在!%]"); + return false; + } + drTemp.Close(); + + //获取设备管控闲置状态是多少 + strSQL = "Select EQUIPMENTSTATE From TBLEQPSTATECONTROL Where CONTROLNO Is Not Null AND CONTROLTYPE ='EQP Break Down' AND CONTROLNO='Idle'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + EQPSTATE = Conversions.ToInteger(drTemp["EQUIPMENTSTATE"]); + } + else + { + //throw new iMESException.MESException("0000-202001", "闲置状态未设定!"); + clsERP.combineMessage(ref aryMessage, mmsg: "[%设备闲置状态未设定!%]"); + return false; + } + drTemp.Close(); + + + //获取现在设备的状态 + strSQL = "Select EQUIPMENTSTATE From tblEMSEquipmentState WHERE EQUIPMENTNO='" + EQPID + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + nowEQPSTATE = Conversions.ToInteger(drTemp["EQUIPMENTSTATE"]); + } + else + { + //throw new iMESException.MESException("0000-202001", "闲置状态未设定!"); + + clsERP.combineMessage(ref aryMessage, mmsg: EQPID + "[%:状态未设定!%]"); + return false; + } + drTemp.Close(); + + //比较现在的状态和闲置状态是否一致 + if (nowEQPSTATE != EQPSTATE) + { + clsERP.combineMessage(ref aryMessage, mmsg: EQPID + "[%:设备非闲置状态,不能进站!%]"); + return false; + } + + + //根据工单获取生产批 + strSQL = $"SELECT A.BASELOTNO,B.STATUS,B.LotStamp FROM TBLWIPLOTBASIS A INNER JOIN TBLWIPLOTSTATE B ON A.BASELOTNO = B.LOTNO WHERE A.MONO='{MONO}' AND B.STATUS IN (0,1,2,3,4,5) AND A.LotState = '1'"; + ExecuteSQLQuery_Adapter(strSQL, dsData, "TBLWIPLOTBASIS", cnnTemp); + + if (dsData.Tables["TBLWIPLOTBASIS"].Rows.Count == 0) + { + clsERP.combineMessage(ref aryMessage, mmsg: MONO + "[%:无在制生产批!%]"); + return false; + } + + if (dsData.Tables["TBLWIPLOTBASIS"].Rows.Count > 1) + { + clsERP.combineMessage(ref aryMessage, mmsg: MONO + "[%:该工单有多个批次存在,请检查是否已上料!%]"); + return false; + } + + + strLotNo = Conversions.ToString(dsData.Tables["TBLWIPLOTBASIS"].Rows[0]["BASELOTNO"]); + + //调用标准进站 + var datSendTime = default(DateTime); // 送達時間 + object blnRuleCheck = true; + bool blnEXETriggerOP = false; + string strComputerName = string.Empty; // Request Client ComputerName + string strCurUserNo = string.Empty; // Request User -紀錄操作人員 + Dictionary dicPars = new Dictionary(); //固定引數,Request傳入的一般參數 + Dictionary dicPars_DataTable = new Dictionary(); //固定引數,Request傳入的DataTable參數 + + //添加批号 + dicPars.Add("lotno", strLotNo); + dicPars.Add("equipmentno", EQPID); + + + AutoexecutionLot_Lot(ref blnEXETriggerOP, dicPars, dicPars_DataTable, "CI", datSendTime, strCurUserNo, strComputerName, Convert.ToBoolean(blnRuleCheck)); + + funTrackIn_Inquiry = true; + exitfun: + ; + } + catch (Exception ex) + { + // 一行调用,拿到完整异常字符串 + string errorMsg = clsERP.GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + + + + drTemp?.Close(); + + dsData?.Dispose(); + CloseConnection(cnnTemp); + } + return funTrackIn_Inquiry; + + } + + public static bool funTrackIn_InquirybyLot(ref List aryMessage, ref List aryException, string Lotid, string EQPID) + { + bool funTrackIn_Inquiry = default(bool); + //bool r = false; + string strSQL = default(string); + IDbConnection cnnTemp = null; + DbDataReader drTemp = null; + + AppSettings objSetting = new AppSettings(); + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + DataSet dsData = new DataSet(); + + + + string strReturn = ""; + + + + + + + int EQPSTATE = 0; //设备管控闲置状态 + + int nowEQPSTATE = 0; //现在设备管控闲置状态 + + string strLotNo = "";//生产批号 + + try + { + //先检查 设备状态是否是闲置 + + //检查设备是否存在 + strSQL = "SELECT 1 FROM TBLEQPEQUIPMENTBASIS WHERE EQUIPMENTNO='" + EQPID + "' AND ISSUESTATE = 2"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + //throw new iMESException.MESException("0000-202001", +" :设备不存在!"); + clsERP.combineMessage(ref aryMessage, mmsg: EQPID + "[%:设备不存在!%]"); + return false; + } + drTemp.Close(); + + //获取设备管控闲置状态是多少 + strSQL = "Select EQUIPMENTSTATE From TBLEQPSTATECONTROL Where CONTROLNO Is Not Null AND CONTROLTYPE ='EQP Break Down' AND CONTROLNO='Idle'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + EQPSTATE = Conversions.ToInteger(drTemp["EQUIPMENTSTATE"]); + } + else + { + //throw new iMESException.MESException("0000-202001", "闲置状态未设定!"); + clsERP.combineMessage(ref aryMessage, mmsg: "[%设备闲置状态未设定!%]"); + return false; + } + drTemp.Close(); + + + //获取现在设备的状态 + strSQL = "Select EQUIPMENTSTATE From tblEMSEquipmentState WHERE EQUIPMENTNO='" + EQPID + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + nowEQPSTATE = Conversions.ToInteger(drTemp["EQUIPMENTSTATE"]); + } + else + { + //throw new iMESException.MESException("0000-202001", "闲置状态未设定!"); + + clsERP.combineMessage(ref aryMessage, mmsg: EQPID + "[%:状态未设定!%]"); + return false; + } + drTemp.Close(); + + //比较现在的状态和闲置状态是否一致 + if (nowEQPSTATE != EQPSTATE) + { + clsERP.combineMessage(ref aryMessage, mmsg: EQPID + "[%:设备非闲置状态,不能进站!%]"); + return false; + } + + + //根据工单获取生产批 + strSQL = $"SELECT A.BASELOTNO,B.STATUS,B.LotStamp FROM TBLWIPLOTBASIS A INNER JOIN TBLWIPLOTSTATE B ON A.BASELOTNO = B.LOTNO WHERE A.BASELOTNO='{Lotid}' AND B.STATUS IN (0,1,2,3,4,5) AND A.LotState = '1'"; + ExecuteSQLQuery_Adapter(strSQL, dsData, "TBLWIPLOTBASIS", cnnTemp); + + if (dsData.Tables["TBLWIPLOTBASIS"].Rows.Count == 0) + { + clsERP.combineMessage(ref aryMessage, mmsg: Lotid + "[%:无在制生产批!%]"); + return false; + } + + if (dsData.Tables["TBLWIPLOTBASIS"].Rows.Count > 1) + { + clsERP.combineMessage(ref aryMessage, mmsg: Lotid + "[%:请检查是否已上料!%]"); + return false; + } + + + strLotNo = Conversions.ToString(dsData.Tables["TBLWIPLOTBASIS"].Rows[0]["BASELOTNO"]); + + //调用标准进站 + var datSendTime = default(DateTime); // 送達時間 + object blnRuleCheck = true; + bool blnEXETriggerOP = false; + string strComputerName = string.Empty; // Request Client ComputerName + string strCurUserNo = string.Empty; // Request User -紀錄操作人員 + Dictionary dicPars = new Dictionary(); //固定引數,Request傳入的一般參數 + Dictionary dicPars_DataTable = new Dictionary(); //固定引數,Request傳入的DataTable參數 + + //添加批号 + dicPars.Add("lotno", strLotNo); + dicPars.Add("equipmentno", EQPID); + + + AutoexecutionLot_Lot(ref blnEXETriggerOP, dicPars, dicPars_DataTable, "CI", datSendTime, strCurUserNo, strComputerName, Convert.ToBoolean(blnRuleCheck)); + funTrackIn_Inquiry = true; + exitfun: + ; + } + catch (Exception ex) + { + // 一行调用,拿到完整异常字符串 + string errorMsg = clsERP.GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + + + + drTemp?.Close(); + + dsData?.Dispose(); + CloseConnection(cnnTemp); + } + return funTrackIn_Inquiry; + + } + /// + /// 首站出站 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// 来料不良图谱,第 k 位为 '0' 表示该位置不良;不传则不打不良 + /// + public static bool funTrackOut_Inquiry(ref List aryMessage, ref List aryException, string MONO, string EQPID, string PanleId, string Column, string Line, string carrierId, decimal Qty, string MapData = "") + { + bool funTrackOut_Inquiry = default(bool); + //bool r = false; + string strSQL = default(string); + IDbConnection cnnTemp = null; + DbDataReader drTemp = null; + + AppSettings objSetting = new AppSettings(); + + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + DataSet dsData = new DataSet(); + + + + string strReturn = ""; + + + string strMLotNo = "";//母生产批号 + string strNLotNo = "";//子生产批号 + string strProductNo = "";//产品号 + string strProductVersion = "";//产品版本 + string strSeqNoRule = "";//序号规则 + string strSeqNoType = "";//序号类别 + string strSeqNoSize = "";//起始位置 + string strDirection = "";//走向 + string strOPNO = ""; + + string strUnitIdOrPannid = "";//UnitId或者Pannid + + bool bolLastLot = false;//是否是最后一笔 + + DataSet dataSetLotNo = new DataSet(); + + kcWIP.clsLot objLot = new kcWIP.clsLot(); + + Collection CollectionSQL = new Collection(); + + bool bolInsertMONoProperty = false; //插入工单属性 + + decimal decMQTY = 0; //母批数量 + + try + { + //先检查 设备状态是否是闲置 + + //检查设备是否存在 + strSQL = "SELECT 1 FROM TBLEQPEQUIPMENTBASIS WHERE EQUIPMENTNO='" + EQPID + "' AND ISSUESTATE = 2"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + clsERP.combineMessage(ref aryMessage, mmsg: EQPID + "[%:设备不存在!%]"); + return false; + } + drTemp.Close(); + + + + + //根据工单获取生产批 + strSQL = $"SELECT A.BASELOTNO,B.STATUS FROM TBLWIPLOTBASIS A INNER JOIN TBLWIPLOTSTATE B ON A.BASELOTNO = B.LOTNO WHERE A.MONO='{MONO}' AND B.STATUS IN (0,1,2,3,4,5) AND A.LotState = '1'"; + ExecuteSQLQuery_Adapter(strSQL, dsData, "TBLWIPLOTBASIS", cnnTemp); + + if (dsData.Tables["TBLWIPLOTBASIS"].Rows.Count == 0) + { + clsERP.combineMessage(ref aryMessage, mmsg: MONO + "[%:无在制生产批!%]"); + return false; + } + + + + if (dsData.Tables["TBLWIPLOTBASIS"].Rows.Count > 1) + { + //存在多个生产批,如果查出来多个批次,则查找工单属性中的批次进行分批 + strSQL = "SELECT PROPERTYVALUE FROM TBLOEMOPROPERTY WHERE MONO='" + MONO + "' AND LOWER(PROPERTYNO) = LOWER('firstlotno')"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + clsERP.combineMessage(ref aryMessage, mmsg: MONO + "[%:不能存在firstlotno工单属性!%]"); + return false; + } + else + { + strMLotNo = Conversions.ToString(drTemp["PROPERTYVALUE"]); + } + drTemp.Close(); + } + else + { + //只有一笔 + strMLotNo = Conversions.ToString(dsData.Tables["TBLWIPLOTBASIS"].Rows[0]["BASELOTNO"]); + + //只有一笔则插入工单属性 + bolInsertMONoProperty = true; + } + + + if (string.IsNullOrEmpty(strMLotNo)) + { + clsERP.combineMessage(ref aryMessage, mmsg: MONO + "[%:无在制母生产批!%]"); + return false; + } + + + //获取母批的基本信息 + strSQL = $"SELECT A.PRODUCTNO,A.PRODUCTVERSION,B.STATUS,B.CURQTY,B.OPNO,B.LOTSTAMP FROM TBLWIPLOTBASIS A LEFT JOIN TBLWIPLOTSTATE B ON A.BASELOTNO = B.LOTNO WHERE A.BASELOTNO ='{strMLotNo}'"; + ExecuteSQLQuery_Adapter(strSQL, dsData, "TBLWIPLOTBASIS_MLOT", cnnTemp); + + if (dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows.Count == 0) + { + clsERP.combineMessage(ref aryMessage, mmsg: strMLotNo + "[%:批次状态不是执行中,不允许出站!%]"); + return false; + } + + //检查母批状态是否是执行中 STATUS 是否为 1 + if (Conversions.ToInteger(dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows[0]["STATUS"]) != 1) + { + clsERP.combineMessage(ref aryMessage, mmsg: strMLotNo + "[%:母生产批状态不是执行中!%]"); + return false; + } + + + //判断母批是否够分 + if (Convert.ToDecimal(dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows[0]["CURQTY"]) <= Qty) + { + //不够分或者刚好 + bolLastLot = true; //母批则作为最后一批出站,保留母批分批 + + decMQTY = Convert.ToDecimal(dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows[0]["CURQTY"]); + } + + + //判断产品是否绑定了panleid&unit序号规则 + + strProductNo = Conversions.ToString(dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows[0]["PRODUCTNO"]); + strProductVersion = Conversions.ToString(dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows[0]["PRODUCTVERSION"]); + strOPNO = Conversions.ToString(dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows[0]["OPNO"]); + + strSQL = "SELECT PANLEID,UNITID,STARTPOINT,DIRECTION FROM TBLPRDPRODUCTBASIS WHERE PRODUCTNO='" + strProductNo + "' AND PRODUCTVERSION='" + strProductVersion + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (drTemp["PANLEID"].ToString().Trim() != "") + { + strSeqNoRule = drTemp["PANLEID"].ToString().Trim(); + strSeqNoType = "PANLEID"; + strSeqNoSize = drTemp["STARTPOINT"].ToString().Trim(); + strDirection = drTemp["DIRECTION"].ToString().Trim(); + } + + //优先选择UNITID规则 + if (drTemp["UNITID"].ToString().Trim() != "") + { + strSeqNoRule = drTemp["UNITID"].ToString().Trim(); + strSeqNoType = "UNITID"; + strSeqNoSize = drTemp["STARTPOINT"].ToString().Trim(); + strDirection = drTemp["DIRECTION"].ToString().Trim(); + } + } + else + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%产品编号%] :" + strProductNo + " [%产品版本%] :" + strProductVersion + "[%未panleid&unit序号规则%]"); + return false; + } + drTemp.Close(); + + if (strSeqNoRule == "") + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%产品编号%] :" + strProductNo + " [%产品版本%] :" + strProductVersion + "[%未panleid&unit序号规则%]"); + return false; + } + if (strSeqNoSize == "" || strDirection == "") + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%产品编号%] :" + strProductNo + " [%产品版本%] :" + strProductVersion + "[%未维护初始位置和走向%]"); + return false; + } + + + + + + //检查母批是否可以分批 + objLot.ChkLotStamp(strMLotNo, Convert.ToInt32(dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows[0]["LOTSTAMP"]), pOPNo: Convert.ToString(dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows[0]["OPNO"]), pStatus: Convert.ToInt32(dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows[0]["STATUS"])); + + + + //先生成序号 + int intColumn = int.Parse(Column); + int intLine = int.Parse(Line); + + string[,] unitIdOrPannids = new string[intLine, intColumn]; + string[,] locations = new string[intLine, intColumn]; + + //产生位置号与序号(原地逐字抽出为公共方法,行为不变) + if (!funInitDieSerial(ref aryMessage, ref aryException, PanleId, strMLotNo, strProductNo, strProductVersion, strSeqNoRule, strSeqNoType, strSeqNoSize, strDirection, intColumn, intLine, unitIdOrPannids, locations, cnnTemp)) + { + return false; + } + + //(xg)根据 mapdata 字段中为1的数量作为子批数量进行分批(只分良品,不分不良品)-- 龙旗定制 + //(xg)原逻辑: 直接使用报文 Qty 作为子批数量进行分批 + decimal intGoodCount = Qty; + if (!string.IsNullOrEmpty(MapData) && MapData.Length == intColumn * intLine) + { + //(xg)统计 mapdata 中良品(值为1)的数量 + intGoodCount = 0; + foreach (char c in MapData) + { + if (c == '1') + intGoodCount++; + } + //(xg)重新判断母批是否够分,使用良品数量;无良品时不分批 + if (Convert.ToDecimal(dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows[0]["CURQTY"]) <= intGoodCount || intGoodCount == 0) + { + bolLastLot = true; + decMQTY = Convert.ToDecimal(dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows[0]["CURQTY"]); + } + else + { + bolLastLot = false; + decMQTY = Convert.ToDecimal(dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows[0]["CURQTY"]); + } + } + //如果够分批,则执行分批 + if (!bolLastLot) + { + string newSplitLot = string.Empty; //子批 + string newSplitLotXml = string.Empty; //子批 + long LotStamp; + DataTable dtSplitLot; + decimal MCurQty = 0; + string ProductNo = string.Empty; + string ProductVersion = string.Empty; + string oldCarrierNo = string.Empty; + string OPNo = defString; + string ShiftNo = "N/A"; + string userNo = "EAP_AGENT"; + + //开始分批 + //******************************start 开始拆批**************************** + //刷新生产批信息 + LoadLotBasisJoinState_M1001(ref dataSetLotNo, BaseLotNo: strMLotNo); + + //1.先检查拆批的生产批资料是否存在 + if (dataSetLotNo.Tables["BasisJoinState"].Rows.Count == 0) + { + throw new Exception($" 未找{strMLotNo}对应生产批资料!"); + } + + //获取拆批前所需要的资料 + //母批的LotStamp + object lotStampValue = dataSetLotNo.Tables["BasisJoinState"].Rows[0]["LotStamp"]; + LotStamp = lotStampValue == DBNull.Value ? 0 : Convert.ToInt64(lotStampValue); + + dtSplitLot = new DataTable("SplitLot"); + dtSplitLot.Columns.Add("SplitLotNo", Type.GetType("System.String")); + dtSplitLot.Columns.Add("SplitLotQty", Type.GetType("System.Double")); + dtSplitLot.Columns.Add("Action", Type.GetType("System.Int32")); + dtSplitLot.Columns.Add("NodeID", Type.GetType("System.String")); + dtSplitLot.Columns.Add("ReturnType", Type.GetType("System.Int32")); + // 2005/08/15 + dtSplitLot.Columns.Add("ProductNo", Type.GetType("System.String")); + dtSplitLot.Columns.Add("ProductVersion", Type.GetType("System.String")); + // 2008/05/22 + dtSplitLot.Columns.Add("CarrierNo", Type.GetType("System.String")); + // 2021/10/14 生產批歷程欄位新增 + dtSplitLot.Columns.Add("OPNo", Type.GetType("System.String")); + + + //取新批号 + //依数量分批 + MCurQty = Convert.ToDecimal(dataSetLotNo.Tables["BasisJoinState"].Rows[0]["CURQTY"].ToString()); + ProductNo = dataSetLotNo.Tables["BasisJoinState"].Rows[0]["ProductNo"].ToString(); + ProductVersion = dataSetLotNo.Tables["BasisJoinState"].Rows[0]["ProductVersion"].ToString(); + OPNo = dataSetLotNo.Tables["BasisJoinState"].Rows[0]["ProductVersion"].ToString(); + + + + + + //放母批 + DataRow newSplitLotData = dtSplitLot.NewRow(); + newSplitLotData["SplitLotNo"] = strMLotNo; + //(xg)原: newSplitLotData["SplitLotQty"] = MCurQty - Qty; + newSplitLotData["SplitLotQty"] = MCurQty - intGoodCount; + newSplitLotData["Action"] = 0; + newSplitLotData["NodeID"] = ""; + newSplitLotData["ReturnType"] = 0; + newSplitLotData["ProductNo"] = ProductNo; + newSplitLotData["ProductVersion"] = ProductVersion; + newSplitLotData["OPNo"] = OPNo; + dtSplitLot.Rows.Add(newSplitLotData); + + //直接取新批号 [直接回写数据库] + using (kcSYS.clsSYSEng objSYSEng = new kcSYS.clsSYSEng()) + { + newSplitLotXml = objSYSEng.GetSplitLotNo_Multiple(true, 1, strMLotNo); + } + + //获取到xml之后解析 + xmlDoc.LoadXml(newSplitLotXml); + + //获取子批 + newSplitLot = xmlDoc.GetElementsByTagName("InitSplitLotNo").Item(0) + .SelectNodes("LotNo").Item(0).InnerXml; + + + strNLotNo = newSplitLot; + + //放子批 + DataRow newSplitLotData2 = dtSplitLot.NewRow(); + newSplitLotData2["SplitLotNo"] = newSplitLot; + //(xg)原: newSplitLotData2["SplitLotQty"] = Qty; + newSplitLotData2["SplitLotQty"] = intGoodCount; + newSplitLotData2["Action"] = 0; + newSplitLotData2["NodeID"] = ""; + newSplitLotData2["ReturnType"] = 0; + newSplitLotData2["ProductNo"] = ProductNo; + newSplitLotData2["ProductVersion"] = ProductVersion; + newSplitLotData2["OPNo"] = OPNo; + dtSplitLot.Rows.Add(newSplitLotData2); + + //做BR分批 + //objLot.BR_Manual_LotSplit(LotStamp, strMLotNo, 1, userNo, dtSplitLot, ShiftNo: ShiftNo); + + //母批不出站 + BR_Manual_LotSplit_M(LotStamp, strMLotNo, 1, userNo, dtSplitLot, ShiftNo: ShiftNo); + + //******************************end 开始拆批**************************** + + ////开始生产批转移,生产批转移需要走隐藏站规则,因为有客制,所以调用MEStc的功能,防止后续改动导致EAP出错 + string strLinkName = "PASS"; + string strMailGroupNo = ""; + string strMsg = ""; + string strRuleNo = defString; + int intERFType = 0; + string strERFMsg = ""; + string ComputerName = System.Net.Dns.GetHostName(); + BRTransferLot_Bin_M(newSplitLot, "EAP", strLinkName, intERFType, strRuleNo, ComputerName: ComputerName, RuleMsg: strERFMsg); + + } + else + { + //母批作为最后一批直接出站 + + //调用标准进站 + var datSendTime = default(DateTime); // 送達時間 + object blnRuleCheck = true; + bool blnEXETriggerOP = false; + string strComputerName = string.Empty; // Request Client ComputerName + string strCurUserNo = string.Empty; // Request User -紀錄操作人員 + Dictionary dicPars = new Dictionary(); //固定引數,Request傳入的一般參數 + Dictionary dicPars_DataTable = new Dictionary(); //固定引數,Request傳入的DataTable參數 + + //添加批号 + dicPars.Add("lotno", strMLotNo); + dicPars.Add("equipmentno", EQPID); + + //出站明细 + DataTable dtLotAttrib = new DataTable(); //特性 + //添加LotNo列 + dtLotAttrib.Columns.Add("LotNo", typeof(string)); + dtLotAttrib.Columns.Add("AttribNo", typeof(string)); + dtLotAttrib.Columns.Add("AttribValue", typeof(string)); + + + + //查询生产批的绑定特性,这里是出站,所以使用TEMP表 + strSQL = $"SELECT ATTRIBNO,ATTRIBVALUE FROM TBLWIPTEMP_ATTRIB WHERE LOTNO='{strMLotNo}'"; + ExecuteSQLQuery_Adapter(strSQL, dsData, "TBLWIPTEMP_ATTRIB", cnnTemp); + if (dsData.Tables["TBLWIPTEMP_ATTRIB"].Rows.Count > 0) + { + foreach (DataRow dr in dsData.Tables["TBLWIPTEMP_ATTRIB"].Rows) + { + DataRow drLotAttrib = dtLotAttrib.NewRow(); + drLotAttrib["LotNo"] = strMLotNo; + drLotAttrib["AttribNo"] = dr["ATTRIBNO"].ToString(); + if (dr["AttribNo"].ToString() == "GoodQty") + { + drLotAttrib["AttribValue"] = decMQTY; + + } + else if (dr["AttribNo"].ToString() == "ScrapQty") + { + drLotAttrib["AttribValue"] = 0; + } + else if (dr["AttribNo"].ToString() == "DefectQty") + { + drLotAttrib["AttribValue"] = 0; + } + else + { + drLotAttrib["AttribValue"] = dr["ATTRIBVALUE"].ToString(); + } + + dtLotAttrib.Rows.Add(drLotAttrib); + } + } + + + dicPars_DataTable.Add("lotattrib", dtLotAttrib); + + + + AutoexecutionLot_Lot(ref blnEXETriggerOP, dicPars, dicPars_DataTable, "CO", datSendTime, strCurUserNo, strComputerName, Convert.ToBoolean(blnRuleCheck)); + + + + } + + + + + + //个案表开始处理 + + //要对那个批次做个案表处理 + string inLotNo = strMLotNo; + if (strNLotNo != "") + { + //若有子批,则传子批 + inLotNo = strNLotNo; + } + + //查询新批次的MNewLotSerial + string strMNewLotSerial = ""; + + strSQL = $"SELECT A.BASELOTNO,B.LOTSERIAL FROM TBLWIPLOTBASIS A LEFT JOIN TBLWIPLOTSTATE B ON A.BASELOTNO=B.LOTNO WHERE A.BASELOTNO='{inLotNo}'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + clsERP.combineMessage(ref aryMessage, mmsg: inLotNo + "[%:生产批无 LOTSERIAL!%]"); + return false; + } + else + { + strMNewLotSerial = Conversions.ToString(drTemp["LOTSERIAL"]); + } + drTemp.Close(); + + + + + //如果报文中传了carrierid,则子批进行上载具操作,存TBLWIPCARRIERSTATE/TBLWIPCARRIERSTATElLOG表。若没有传carrierid,则不进行上载具操作。 + if (!string.IsNullOrEmpty(carrierId)) + { + //上载具 + + string strCarrierType = ""; //载具类别 + + int CurCarrierPosition = 1; // 当前位置 + + //载具基础资料检查 + strSQL = "Select CarrierNo,CarrierState,CarrierType From tblWIPCarrierState Where CarrierNo Is Not Null And CarrierNo = '" + carrierId + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (drTemp["CarrierState"].ToString().Trim() != "1" && drTemp["CarrierState"].ToString().Trim() != "0") + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%载具编号%] :" + carrierId + "[% 只有待使用和使用中状态的载具才可以上载具!%] "); + return false; + } + + strCarrierType = drTemp["CarrierType"].ToString().Trim(); + } + else + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%载具编号%] :" + carrierId + "[%不存在!%] "); + return false; + } + drTemp.Close(); + + //载具寿命检查 + bool isCheckResult = CheckCarrierLife_M(carrierId, strCarrierType, UserNo: "EAP"); + if (!isCheckResult) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%载具编号%] :" + carrierId + "[%当前载具已经达到预警寿命!%] "); + return false; + } + + //获取现在最大的位置 + strSQL = "Select Count(CarrierPosition) CountPosition From tblWIPCarrierStateDetail Where CarrierNo = '" + carrierId + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + CurCarrierPosition = Conversions.ToInteger(drTemp["CountPosition"]); + } + drTemp.Close(); + + if (CurCarrierPosition == 0) + { + CurCarrierPosition = 1; + } + + using (kcEQP.clsCarrierBasis objCarrierBasis = new kcEQP.clsCarrierBasis()) + { + //检查容量 + objCarrierBasis.CheckPutsOnUnitID(carrierId, inLotNo, CurCarrierPosition); + + + } + + //检查无问题,则上载具,这里支持回复处理 + AddCarrierStateDetail_M(carrierId, "EAP", inLotNo, CurCarrierPosition, UserNo: "EAP", LotSerial: strMNewLotSerial, colSQL: CollectionSQL); + + } + + //记录  然后将对应数据存到客制表TBLWIPPRDSTATE_LQ&TBLWIPPRDLOG_LQ,具体取值参考1.4中的数据库表的明细。 + + + SaveWIPPrdStateLog_M(LotNo: inLotNo, ProductID: PanleId, EQPID: EQPID, OPNo: strOPNO, State: 1, ProductType: "0", CarrierID: carrierId, LotSerial: strMNewLotSerial, colSQL: CollectionSQL); + + + //for (int i = 0; i < intLine; i++) + //{ + // for (int j = 0; j < intColumn; j++) + // { + // WriteLog(unitIdOrPannids[i, j]); + // } + //} + + //写入客制表 TBLPCSDIELOG_LQ(原地逐字抽出为公共方法,行为不变) + funSaveDieLog(PanleId, inLotNo, EQPID, strOPNO, intColumn, intLine, carrierId, strMNewLotSerial, unitIdOrPannids, locations, CollectionSQL); + + //(xg)原: if (!funMarkBadByMapData(ref aryMessage, PanleId, inLotNo, MapData, strSeqNoSize, strDirection, intColumn, intLine, CollectionSQL)) + //(xg)改: 新增 unitIdOrPannids, strMLotNo 参数 — 不良品归属母批 + 同步更新客制状态表 + //解析 mapdata 打不良(来料异常);走位设定与产生 LOCATIONNO 时同源;不良品归属母批,同步更新客制状态表 + if (!funMarkBadByMapData(ref aryMessage, PanleId, inLotNo, MapData, strSeqNoSize, strDirection, intColumn, intLine, CollectionSQL, unitIdOrPannids, strMLotNo)) + { + return false; + } + + + + + if (bolInsertMONoProperty) + { + //这里查询一遍是为了并非调用时防止INSERT失败 + strSQL = "SELECT PROPERTYVALUE FROM TBLOEMOPROPERTY WHERE MONO='" + MONO + "' AND LOWER(PROPERTYNO) = LOWER('firstlotno')"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + //不存在则插入 + strSQL = $"INSERT INTO TBLOEMOPROPERTY (MONO, PROPERTYNO, PROPERTYVALUE, LOTSERIAL) VALUES ('{MONO}', 'firstlotno', '{strMLotNo}', null)"; + CollectionSQL.Add(strSQL); + + strSQL = $"DELETE FROM TBLOEMOPROPERTY WHERE MONO='{MONO}' AND PROPERTYNO='firstlotno'"; + + objReverse.AddReverseUpdateContent(ref strMNewLotSerial, ref strSQL, CollectionSQL); + } + else + { + //若是存在,则不是需要再更新 + + ////存在则更新 + //strSQL = $"UPDATE TBLOEMOPROPERTY SET PROPERTYVALUE = '{strMLotNo}' WHERE MONO = '{MONO}' AND LOWER(PROPERTYNO) = LOWER('firstlotno')"; + //CollectionSQL.Add(strSQL); + } + drTemp.Close(); + } + + if (CollectionSQL.Count > 0) + { + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + } + + + funTrackOut_Inquiry = true; + exitfun: + ; + } + catch (Exception ex) + { + // 一行调用,拿到完整异常字符串 + string errorMsg = clsERP.GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + + if (objLot != null) + { + objLot = null; + } + + drTemp?.Close(); + + dsData?.Dispose(); + CloseConnection(cnnTemp); + } + return funTrackOut_Inquiry; + + } + + private static void funInitlocation(string[,] location, string strSeqNoSize, string strDirection, int intColumn, int intLine) + { + // intColumn = 行数 (row) + // intLine = 列数 (col) + int totalPoints = intColumn * intLine; + int maxNumberLength = totalPoints.ToString().Length; + int index = 1; + + switch (strSeqNoSize) // 起始角 + { + case "左上": // 起始点 (0, 0) + { + if (strDirection == "横向") // S型横向 + { + for (int row = 0; row < intColumn; row++) + { + if (row % 2 == 0) // 偶数行从左到右 + { + for (int col = 0; col < intLine; col++) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + else // 奇数行从右到左 + { + for (int col = intLine - 1; col >= 0; col--) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + } + else if (strDirection == "竖向") // S型竖向 + { + for (int col = 0; col < intLine; col++) + { + if (col % 2 == 0) // 偶数列从上到下 + { + for (int row = 0; row < intColumn; row++) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + else // 奇数列从下到上 + { + for (int row = intColumn - 1; row >= 0; row--) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + } + else if (strDirection == "全部横向") // 单一方向横向:始终从左到右 + { + for (int row = 0; row < intColumn; row++) + { + for (int col = 0; col < intLine; col++) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + else if (strDirection == "全部竖向") // 单一方向竖向:始终从上到下 + { + for (int col = 0; col < intLine; col++) + { + for (int row = 0; row < intColumn; row++) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + break; + } + case "左下": // 起始点 (0, intColumn-1) + { + if (strDirection == "横向") // S型横向 + { + for (int row = intColumn - 1; row >= 0; row--) + { + if ((intColumn - 1 - row) % 2 == 0) // 偶数行(从底部数)从左到右 + { + for (int col = 0; col < intLine; col++) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + else // 奇数行(从底部数)从右到左 + { + for (int col = intLine - 1; col >= 0; col--) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + } + else if (strDirection == "竖向") // S型竖向 + { + for (int col = 0; col < intLine; col++) + { + if (col % 2 == 0) // 偶数列从下到上 + { + for (int row = intColumn - 1; row >= 0; row--) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + else // 奇数列从上到下 + { + for (int row = 0; row < intColumn; row++) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + } + else if (strDirection == "全部横向") // 单一方向横向:始终从左到右 + { + for (int row = intColumn - 1; row >= 0; row--) + { + for (int col = 0; col < intLine; col++) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + else if (strDirection == "全部竖向") // 单一方向纵向:始终从下到上 + { + for (int col = 0; col < intLine; col++) + { + for (int row = intColumn - 1; row >= 0; row--) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + break; + } + case "右上": // 起始点 (intLine-1, 0) + { + if (strDirection == "横向") // S型横向 + { + for (int row = 0; row < intColumn; row++) + { + if (row % 2 == 0) // 偶数行从右到左 + { + for (int col = intLine - 1; col >= 0; col--) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + else // 奇数行从左到右 + { + for (int col = 0; col < intLine; col++) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + } + else if (strDirection == "竖向") // S型竖向 + { + for (int col = intLine - 1; col >= 0; col--) + { + if ((intLine - 1 - col) % 2 == 0) // 偶数列(从右数)从上到下 + { + for (int row = 0; row < intColumn; row++) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + else // 奇数列(从右数)从下到上 + { + for (int row = intColumn - 1; row >= 0; row--) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + } + else if (strDirection == "全部横向") // 单一方向横向:始终从右到左 + { + for (int row = 0; row < intColumn; row++) + { + for (int col = intLine - 1; col >= 0; col--) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + else if (strDirection == "全部竖向") // 单一方向竖向:始终从上到下 + { + for (int col = intLine - 1; col >= 0; col--) + { + for (int row = 0; row < intColumn; row++) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + break; + } + case "右下": // 起始点 (intLine-1, intColumn-1) + { + if (strDirection == "横向") // S型横向 + { + for (int row = intColumn - 1; row >= 0; row--) + { + if ((intColumn - 1 - row) % 2 == 0) // 偶数行(从底部数)从右到左 + { + for (int col = intLine - 1; col >= 0; col--) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + else // 奇数行(从底部数)从左到右 + { + for (int col = 0; col < intLine; col++) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + } + else if (strDirection == "竖向") // S型竖向 + { + for (int col = intLine - 1; col >= 0; col--) + { + if ((intLine - 1 - col) % 2 == 0) // 偶数列(从右数)从下到上 + { + for (int row = intColumn - 1; row >= 0; row--) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + else // 奇数列(从右数)从上到下 + { + for (int row = 0; row < intColumn; row++) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + } + else if (strDirection == "全部横向") // 单一方向横向:始终从右到左 + { + for (int row = intColumn - 1; row >= 0; row--) + { + for (int col = intLine - 1; col >= 0; col--) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + else if (strDirection == "全部竖向") // 单一方向竖向:始终从下到上 + { + for (int col = intLine - 1; col >= 0; col--) + { + for (int row = intColumn - 1; row >= 0; row--) + { + location[col, row] = index.ToString().PadLeft(maxNumberLength, '0'); + index++; + } + } + } + break; + } + } + } + + + /// + /// copy标准,支持回复处理 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + // 新增載具內容 + // 傳入值: 各欄位新增值 + // 傳回值: success(成功), fail(失敗) + public static string AddCarrierStateDetail_M(string CarrierNo, string BCIP, string ContentID, int CarrierPosition = 1, int ContentFlag = 0, string AdditionalXml = "", string ComponentNo = "N/A", string UserNo = defString, string LotSerial = defString, Collection colSQL = null) + { + string AddCarrierStateDetailRet = default(string); + // CarrierPosition:預設放置為第1個位置 + // ContentFlag:0:Tray 1:Stocker + // 200612/15 Ben 新增ComponentNo + + var CollectionSQL = new Collection(); + string strSQLAddField = ""; + string strSQLAddValue = ""; + string strSQL = ""; + kcEQP.clsCarrierBasis objCarrierBasis = new kcEQP.clsCarrierBasis(); + + try + { + // //Combine SQL + strSQLAddField = "Insert Into tblWIPCarrierStateDetail (CarrierNo,CarrierPosition,BCIP,ContentID,Flag,LotNo,ComponentNo"; + strSQLAddValue = " Values ('" + CarrierNo + "'," + CarrierPosition + ",'" + BCIP + "','" + ContentID + "'," + ContentFlag + ",'" + ContentID + "','" + ComponentNo + "'"; + + if (string.IsNullOrEmpty(AdditionalXml)) + { + // 當沒有額外的欄位時,直接給定strSQL + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + } + else + { + // 加上additional的field & value 後傳回 + strSQL = SeparateAddXML_Add(ref strSQLAddField, ref strSQLAddValue, AdditionalXml); + } + CollectionSQL.Add(strSQL); + + + strSQL = $"DELETE FROM tblWIPCarrierStateDetail WHERE CarrierNo='{CarrierNo}' AND LotNo ='{ContentID}'"; + //回复处理 + objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL); + + + + strSQL = " Update tblWIPLotState Set CarrierNo = '" + CarrierNo + "' Where LotNo = '" + ContentID + "' "; + CollectionSQL.Add(strSQL); + + + + strSQL = " Update tblWIPLotState Set CarrierNo = '' Where LotNo = '" + ContentID + "' "; + //回复处理 + objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL); + + + //xuyan 2023/5/31 上载具更改载具状态,载具上有批号 CarrierState=1 + objCarrierBasis.UpdateCarrierState(ref CollectionSQL, CarrierNo, UserNo, 1); + + //收集 + if (colSQL != null) + { + foreach (var item in CollectionSQL) + { + colSQL.Add(item); + } + } + + //執行SQL指令 + //ExecuteSQLNoneQuery_UPD(Convert.ToString(DataBaseType), strConnectionString, CollectionSQL); + + //Return success + AddCarrierStateDetailRet = "success"; + } + catch (Exception e1) + { + // 回傳失敗 + AddCarrierStateDetailRet = "fail"; + + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + + } // New Exception("kcEQP.AddCarrierStateDetail: " & e1.Message) + finally + { + if (objCarrierBasis != null) + { + objCarrierBasis.Dispose(); + } + } + + return AddCarrierStateDetailRet; + + + } + + + + + /// + /// copy 标准,刷生产批信息 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static string LoadLotBasisJoinState_M1001(ref DataSet dsTemp, string BaseLotNo = defString, string OPNo = defString, string Status = defString, string OrgLotNo = defString, string BatchNo = defString, string BoxNo = defString, string BatchSerial = defString, string LotState = defString, string RONo = defString, int ItemNo = defInteger, string MONo = defString, string ProductNo = defString, string ProductVersion = defString, string CustomerNo = defString, int HotLot = defInteger, + DateTime EndWIPDate = default(DateTime), DateTime FromWIPDate = default(DateTime), string LotNo = defString, string LotSerial = defString, string ProcessNo = defString, string NodeId = defString, string BRNo = defString, string PSNo = defString, string PhaseNo = defString, int HaveComponent = defInteger, int HaveLevel = defInteger, string LinkName = defString, string ERFStatus = defString, string AreaNo = defString, string ProcessVersion = defString, string SORGLotNo = defString, string AdditionalXml = "", string CustomerLotNo = defString, string ComponentNo = defString, string FactoryNo = defString, int CurQTY = defInteger, bool blnShowPartialLot = true, int PartialType = defInteger) + { + string LoadLotBasisJoinState = default(string); + // 此 Function 將資料以XML方式取出 + // 傳入值: 索引值 + + IDbConnection cnnTemp = null; + AppSettings objSetting = new AppSettings(); + var drTemp = default(DbDataReader); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + string strSQL = ""; + try + { + // 2013/03/13, Hank, 開啟Report Mode + cnnTemp = CreateConnection(strConnectionString); + + + + // 2016/12/26 YF, 取出作業站多人加工模式MultiOperatorMode + // 2016/10/19 YF, 取出作業站用料選項取MaterialOption + // 2016-08-11, Joe, Add PartialMode + // PS.要優先使用tblWIPLotState的資料,故tblWIPLotState的欄位要放在Select前面 + // 2017/10/27 OwenLiu, 因應部份報工,同時取出流程主檔 PartialType + + + strSQL = "SELECT A.*, B.*, C.OPName, C.OPShortName, C.PartialMode, C.MaterialOption, C.MultiOperatorMode, D.PartialType,E.PRODUCTNAME"; + strSQL += " FROM tblWIPLotState A join tblWIPLotBasis B ON A.BaseLotNo = B.BaseLotNo"; + strSQL += " left join tblOPBasis C ON A.OPNo = C.OPNo"; + strSQL += " left join tblPRSProcessBasis D ON A.ProcessNo = D.ProcessNo AND A.ProcessVersion = D.ProcessVersion"; + strSQL += " INNER JOIN TBLPRDPRODUCTBASIS E ON B.ProductNo=E.PRODUCTNO and B.ProductVersion=E.ProductVersion"; // 20180808 + strSQL += " WHERE A.LotNo IS NOT NULL "; + + // LotBasis condition + if (BaseLotNo != defString) + strSQL = strSQL + " And B.BaseLotNo = '" + BaseLotNo + "'"; + if (OrgLotNo != defString) + strSQL = strSQL + " And B.OrgLotNo like '" + OrgLotNo + "'"; + if (LotState != defString) + { + int i; + string[] aLotState = Strings.Split(LotState, "|"); // 各狀態值用|分隔 + strSQL = strSQL + " And B.LotState In(" + aLotState[0]; + for (i = 1; i <= Information.UBound(aLotState); i++) // 其餘的 + + strSQL = strSQL + "," + aLotState[i]; + strSQL = strSQL + ")"; + } + if (RONo != defString) + strSQL = strSQL + " And B.RONo like '" + RONo + "'"; + if (ItemNo != defInteger) + strSQL = strSQL + " And B.ItemNo = " + ItemNo; + if (MONo != defString) + strSQL = strSQL + " And B.MONo like '" + MONo + "'"; + if (ProductNo != defString) + strSQL = strSQL + " And B.ProductNo like '" + ProductNo + "'"; + if (ProductVersion != defString) + { + int i; + string[] aVersion = Strings.Split(ProductVersion, "|"); // 各狀態值用|分隔 + strSQL = strSQL + " And B.ProductVersion In('" + aVersion[0] + "'"; + for (i = 1; i <= Information.UBound(aVersion); i++) // 其餘的 + strSQL = strSQL + ",'" + aVersion[i] + "'"; + strSQL = strSQL + ")"; + } + if (CustomerNo != defString) + strSQL = strSQL + " And B.CustomerNo = '" + CustomerNo + "'"; + if (HotLot != defInteger) + strSQL = strSQL + " And B.HotLot = " + HotLot; + if (FromWIPDate != defDateTime) + strSQL = strSQL + " And B.WIPDate >= '" + Strings.Format((DateTime)FromWIPDate, "yyyy-MM-dd HH:mm:ss") + "'"; + if (EndWIPDate != defDateTime) + { + // 如果傳入值不包含時間則加上23:59:59 + if (EndWIPDate == EndWIPDate.Date) + strSQL = strSQL + " And B.WIPDate <='" + Strings.Format((DateTime)EndWIPDate, "yyyy-MM-dd") + " 23:59:59" + "'"; + else + strSQL = strSQL + " And B.WIPDate <='" + Strings.Format((DateTime)EndWIPDate, "yyyy/MM/dd HH:mm:ss") + "'"; + } + if (CustomerLotNo != defString) + strSQL += " And B.CustomerLotNo = '" + CustomerLotNo + "'"; + + // LotState condition + // cQueue = 0 + // cRunning = 1 + // cWait = 2 + // cHold = 3 + // cINV = 11 + if (Status != defString) + { + int i; + string[] aStatus = Strings.Split(Status, "|"); // 各狀態值用|分隔 + strSQL = strSQL + " And A.Status In(" + aStatus[0]; + for (i = 1; i <= Information.UBound(aStatus); i++) // 其餘的 + + strSQL = strSQL + "," + aStatus[i]; + strSQL = strSQL + ")"; + } + + if (LotNo != defString) + { + // strSQL = strSQL & " And A.LotNo = '" & LotNo & "'" + int i; + string[] aLotNo = Strings.Split(LotNo, "|"); // 各批號用|分隔 + strSQL = strSQL + " And A.LotNo In('" + aLotNo[0] + "'"; + for (i = 1; i <= Information.UBound(aLotNo); i++) // 其餘的 + + strSQL = strSQL + ",'" + aLotNo[i] + "'"; + strSQL = strSQL + ")"; + } + + if (LotSerial != defString) + strSQL = strSQL + " And A.LotSerial = '" + LotSerial + "'"; + + if (ProcessNo != defString) + { + strSQL = strSQL + " And A.ProcessNo = '" + ProcessNo + "'"; + if (ProcessVersion != defString) + { + int i; + string[] aVersion = Strings.Split(ProcessVersion, "|"); // 各狀態值用|分隔 + strSQL = strSQL + " And A.ProcessVersion In('" + aVersion[0] + "'"; + for (i = 1; i <= Information.UBound(aVersion); i++) // 其餘的 + strSQL = strSQL + ",'" + aVersion[i] + "'"; + strSQL = strSQL + ")"; + } + } + if (OPNo != defString) + strSQL = strSQL + " And A.OPNo = '" + OPNo + "'"; + if (NodeId != defString) + strSQL = strSQL + " And A.NodeId = '" + NodeId + "'"; + if (BRNo != defString) + strSQL = strSQL + " And A.BRNo = '" + BRNo + "'"; + if (PSNo != defString) + strSQL = strSQL + " And A.PSNo = '" + PSNo + "'"; + if (HaveComponent != defInteger) + strSQL = strSQL + " And A.HaveComponent = " + HaveComponent; + if (HaveLevel != defInteger) + strSQL = strSQL + " And A.HaveLevel = " + HaveLevel; + if (LinkName != defString) + strSQL = strSQL + " And A.LinkName = '" + LinkName + "'"; + if (PhaseNo != defString) + { + int i; + string[] aPhase = Strings.Split(PhaseNo, "|"); // 各狀態值用|分隔 + strSQL = strSQL + " And A.PhaseNo In(" + aPhase[0]; + for (i = 1; i <= Information.UBound(aPhase); i++) // 其餘的 + strSQL = strSQL + "," + aPhase[i]; + strSQL = strSQL + ")"; + } + if (SORGLotNo != defString) + strSQL += " And A.ORGLotNo = '" + SORGLotNo + "'"; + + // 2016-08-09, Joe, 不顯示Partial站的Lot + if (blnShowPartialLot == false) + strSQL += " And (PartialMode is null OR PartialMode = 0) "; + + // 2017/10/27 OwenLiu, 增加 PartialType 參數處理 + if (!PartialType.Equals(defInteger)) + strSQL += " AND D.PartialType = " + PartialType; + + // ERF Status + // Status + // 0:Create + // 1:Department + // 2:Customer + // 11:Final + // 12:Abort + // 21:Release + + if (ERFStatus != defString) + { + int i; + string[] aERF = Strings.Split(ERFStatus, "|"); // 各狀態值用|分隔 + strSQL = strSQL + " And A.LotNo In (Select LotNo From tblWIPERFBasis Where Status In (" + aERF[0]; + for (i = 1; i <= Information.UBound(aERF); i++) // 其餘的 + strSQL = strSQL + "," + aERF[i]; + strSQL = strSQL + "))"; + } + if (AreaNo != defString) + strSQL = strSQL + " And A.AreaNo = '" + AreaNo + "'"; + + if (BatchNo != defString) + strSQL = strSQL + " And A.BatchNo = '" + BatchNo + "'"; + + if (BoxNo != defString) + strSQL = strSQL + " And A.BoxNo = '" + BoxNo + "'"; + + if (BatchSerial != defString) + strSQL = strSQL + " And A.BatchSerial = '" + BatchSerial + "'"; + + if (ComponentNo != defString) + { + int i; + string[] aryComp = Strings.Split(ComponentNo, "|"); // 各狀態值用|分隔 + strSQL += " And A.LotNo In (Select Distinct LotNo From tblWIPComponentState Where (ComponentNo='" + aryComp[0] + "'"; + for (i = 1; i <= Information.UBound(aryComp); i++) // 其餘的 + strSQL += " Or ComponentNo='" + aryComp[i] + "'"; + strSQL += "))"; + } + + if (FactoryNo != defString) + strSQL = strSQL + " And A.FactoryNo = '" + FactoryNo + "'"; + + if (CurQTY != defInteger) + strSQL += " And A.CurQTY = " + CurQTY; + + if (AdditionalXml != "") + // 加上additional的condition + strSQL = strSQL + SeparateAddXML_Condition(AdditionalXml); + + // //Select data + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "BasisJoinState", cnnTemp); + // //Combine return value + LoadLotBasisJoinState = CombineXMLReturnValue("loadlotbasisjoinstate", "BasisJoinState", "DataSet", FormatXMLSchema(dsTemp.GetXmlSchema()), dsTemp.GetXml(), ""); + } + catch (Exception e1) + { + LoadLotBasisJoinState = "fail"; + throw; + } // (New Exception("kcWIP.LoadLotBasisJoinState: " & e1.Message)) + + finally + { + CloseConnection(cnnTemp); + //if (!daTemp == null) + // daTemp.Dispose(); + if (dsTemp != null) + dsTemp.Dispose(); + } + return LoadLotBasisJoinState; + } + + + /// + /// COPY 标准 + /// + /// + /// + /// + /// + // 將資料以XML方式取出tblWIPCarrierState + // 傳入值: 索引值 + // 傳回值: XML(成功), fail(失敗) + public string LoadCarrierState_M(string CarrierNo = defString, string AdditionalXml = "", int CarrierState = defInteger) + { + string LoadCarrierStateRet = default(string); + + string strSQL = ""; + IDbConnection cnnTemp = null; + + var dsCarrier = default(DataSet); + + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + // //SQL Command + strSQL = "Select * From tblWIPCarrierState Where CarrierNo Is Not Null "; + + if (CarrierNo != defString) + { + strSQL = strSQL + "And CarrierNo = '" + CarrierNo + "'"; + } + + if (CarrierState != defInteger) + { + strSQL = strSQL + "And CarrierState = '" + CarrierState + "'"; + } + + // Additional Condition + if (!string.IsNullOrEmpty(AdditionalXml)) + { + strSQL = strSQL + SeparateAddXML_Condition(AdditionalXml); + } + + // //Select data + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + // daCarrier = New OleDb.OleDbDataAdapter(cmmTemp) + dsCarrier = new DataSet(); + ExecuteSQLQuery_Adapter(strSQL, dsCarrier, "CarrierState", cnnTemp); + + // //Combine return value + //LoadCarrierStateRet = CombineXMLReturnValue("LoadCarrierState".ToLower(), "CarrierState", "DataSet", FormatXMLSchema(dsCarrier.GetXmlSchema()), dsCarrier.GetXml(), ""); + } + + catch (Exception e1) + { + // 回傳失敗 + LoadCarrierStateRet = "fail"; + + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + } // New Exception("kcEQP.LoadCarrierState: " & e1.Message) + + finally + { + CloseConnection(cnnTemp); + if (dsCarrier != null) + { + dsCarrier.Dispose(); + } + + } + + return LoadCarrierStateRet; + + } + + + /// + /// COPY tc 载具寿命检查 + /// + /// + /// + public static bool CheckCarrierLife_M(string CarrierNo, string CarrierType, string UserNo) + { + bool bolCheckCarrierLife_M = true; + + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + IDbConnection cnnTemp = null; + Collection CollectionSQL = new Collection(); + string strSQL; + + try + { + + cnnTemp = CreateConnection(strConnectionString); + + //载具寿命 + DataTable dt01 = new DataTable(); + strSQL = $" select * from TBLCUSCARRIERLIFE where CARRIERNO = '{CarrierNo}' "; + ExecuteSQLQuery_Adapter(strSQL, dt01, cnnTemp); + + //载具类别寿命设定 + DataTable dt = new DataTable(); + strSQL = $" select * from TBLCUSCARRIERLIFESET where CARRIERTYPE = '{CarrierType}' "; + ExecuteSQLQuery_Adapter(strSQL, dt, cnnTemp); + if (dt.Rows.Count > 0) + { + if (dt01.Rows.Count > 0) + { + string ACCUMULATEQTY = dt01.Rows[0]["ACCUMULATEQTY"].ToString(); //累计数量 + + string ALERTCOUNT = dt.Rows[0]["ALERTCOUNT"].ToString(); //预警次数 + string LIMITCOUNT = dt.Rows[0]["LIMITCOUNT"].ToString(); //单次上限 + + //累计数量达到预警次数 + if (decimal.Parse(ACCUMULATEQTY) >= decimal.Parse(ALERTCOUNT)) + { + bolCheckCarrierLife_M = false; + } + + } + else + { + strSQL = $@" insert into TBLCUSCARRIERLIFE (CARRIERNO,ACCUMULATEQTY,ACCTOTALUSEDQTY,CREATOR,CREATEDATE) + values ('{CarrierNo}',0,0,'{UserNo}',sysdate)"; + CollectionSQL.Add(strSQL); + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + + } + + } + } + catch (Exception ex) + { + throw; + } + finally + { + CloseConnection(cnnTemp); + } + + return bolCheckCarrierLife_M; + } + + + + // 写入客制表 TBLWIPPRDSTATE_LQ(现况)与 TBLWIPPRDLOG_LQ(履历) + // 入参说明: + // LotNo - 子批批号(分批后新批号) + // ProductID - PanelID + // EQPID - 设备编号(可为空) + // OPNo - 作业站编号 + // CarrierID - 载具编号(可为空) + // State - 状态(固定传 1) + // ProductType - 产品类别(固定传 "0") + public static void SaveWIPPrdStateLog_M(string LotNo, string ProductID, string EQPID, + string OPNo, string CarrierID, int State, string ProductType, string LotSerial, Collection colSQL = null) + { + var CollectionSQL = new Collection(); + string strSQL; + + // 空值保护,LOG 表 EQPID/CARRIERID 为 NOT NULL + string strEQPID = string.IsNullOrEmpty(EQPID) ? "" : EQPID.Replace("'", "''"); + string strCarrierID = string.IsNullOrEmpty(CarrierID) ? "" : CarrierID.Replace("'", "''"); + string strLotNo = LotNo.Replace("'", "''"); + string strProductID = ProductID.Replace("'", "''"); + string strOPNo = OPNo.Replace("'", "''"); + string strProdType = ProductType.Replace("'", "''"); + + try + { + //查询有没有进站 + + + + // 插入 TBLWIPPRDSTATE_LQ(现况表,EQPID/CARRIERID 允许空) + strSQL = "INSERT INTO TBLWIPPRDSTATE_LQ " + + "(LOTNO, PRODUCTID, EQPID, STATE, OPNO, CARRIERID, PRODUCTTYPE, CREATEDATE) " + + "VALUES " + + "('" + strLotNo + "', '" + strProductID + "', '" + strEQPID + "', " + + State + ", '" + strOPNo + "', '" + strCarrierID + "', '" + strProdType + "', SYSDATE)"; + CollectionSQL.Add(strSQL); + + + strSQL = $"DELETE FROM TBLWIPPRDSTATE_LQ WHERE LOTNO='{strLotNo}'"; + //回复处理 + objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL); + + // 插入 TBLWIPPRDLOG_LQ(履历表) + strSQL = "INSERT INTO TBLWIPPRDLOG_LQ " + + "(LOTNO, PRODUCTID, EQPID, OPNO, CARRIERID, PRODUCTTYPE, CREATEDATE) " + + "VALUES " + + "('" + strLotNo + "', '" + strProductID + "', '" + strEQPID + "', " + + "'" + strOPNo + "', '" + strCarrierID + "', '" + strProdType + "', SYSDATE)"; + CollectionSQL.Add(strSQL); + + + strSQL = $"DELETE FROM TBLWIPPRDLOG_LQ WHERE LOTNO='{strLotNo}'"; + //回复处理 + objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL); + + if (colSQL != null) + { + foreach (string str in CollectionSQL) + { + colSQL.Add(str); + } + } + else + { + // 提交至数据库(两条 INSERT 在同一事务内执行) + //ExecuteSQLNoneQuery_UPD(Convert.ToString(DataBaseType), strConnectionString, CollectionSQL); + } + + + } + catch (Exception ex) + { + if (ex.InnerException != null) + throw ex.InnerException; + else + throw; + } + } + + /// + /// 进站 + /// + /// + /// + /// + /// + /// + /// + /// + public static bool funTrackIn_Inquiry_LQ(ref List aryMessage, ref List aryException, string EQPID, string ID, string remark) + { + bool funTrackIn_Inquiry = default(bool); + //bool r = false; + string strSQL = default(string); + IDbConnection cnnTemp = null; + DbDataReader drTemp = null; + + AppSettings objSetting = new AppSettings(); + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + var CollectionSQL = new Collection(); + DataSet dsData = new DataSet(); + + + + string strReturn = ""; + string OPNO = ""; + + + + + + + int EQPSTATE = 0; //设备管控闲置状态 + + int nowEQPSTATE = 0; //现在设备管控闲置状态 + + string strLotNo = "";//生产批号 + + try + { + //先检查 设备状态是否是闲置 + + //检查设备是否存在 + strSQL = "SELECT 1 FROM TBLEQPEQUIPMENTBASIS WHERE EQUIPMENTNO='" + EQPID + "' AND ISSUESTATE = 2"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + //throw new iMESException.MESException("0000-202001", +" :设备不存在!"); + clsERP.combineMessage(ref aryMessage, mmsg: EQPID + "[%:设备不存在!%]"); + return false; + } + drTemp.Close(); + + //获取设备管控闲置状态是多少 + strSQL = "Select EQUIPMENTSTATE From TBLEQPSTATECONTROL Where CONTROLNO Is Not Null AND CONTROLTYPE ='EQP Break Down' AND CONTROLNO='Idle'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + EQPSTATE = Conversions.ToInteger(drTemp["EQUIPMENTSTATE"]); + } + else + { + //throw new iMESException.MESException("0000-202001", "闲置状态未设定!"); + clsERP.combineMessage(ref aryMessage, mmsg: "[%设备闲置状态未设定!%]"); + return false; + } + drTemp.Close(); + + + // ============================ + // 自动判断ID类型(通过序号规则) + // LCSIP开头 → CarrierID(通用载具) + // X1088开头 → CarrierID(专用载具) + // 其他 → ProductID(PanelID或UnitID) + // ============================ + string strIDValue = ID; + string strProductID_Auto = ""; + string strCarrierID_Auto = ""; + string strAutoType = ""; + string Type; + + + if (!string.IsNullOrEmpty(strIDValue)) + { + // 自动判断ID类型 + if (strIDValue.StartsWith("LCSIP") || strIDValue.StartsWith("X1088")) + { + // 载具ID + strAutoType = "2"; // CarrierID + strCarrierID_Auto = strIDValue; + } + else + { + // 产品ID(PanelID或UnitID) + strAutoType = "1"; // ProductID + strProductID_Auto = strIDValue; + } + } + + // 根据自动判断结果或手动指定的Type决定处理逻辑 + string strFinalType; + + strFinalType = strAutoType; + //获取生产批批号 + if (strFinalType == "1") + { + if (string.IsNullOrEmpty(strProductID_Auto)) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%Product_id 没有传值%]"); + return false; + } + DataTable dt = new DataTable(); + strSQL = $"select * from TBLWIPPRDSTATE_LQ where PRODUCTID = '{strProductID_Auto}' and state = 1"; + ExecuteSQLQuery_Adapter(strSQL, dt, cnnTemp); + if (dt.Rows.Count != 1) + { + clsERP.combineMessage(ref aryMessage, mmsg: $"[%产品ID({strProductID_Auto})对应多个批次,请检查数据来源。%]"); + return false; + } + strLotNo = dt.Rows[0]["LotNo"].ToString(); + } + else if (strFinalType == "2") + { + if (string.IsNullOrEmpty(strCarrierID_Auto)) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%Carrier_id 没有传值%]"); + return false; + } + DataTable dt = new DataTable(); + strSQL = $"select * from TBLWIPPRDSTATE_LQ where carrierid = '{strCarrierID_Auto}' and state = 1"; + ExecuteSQLQuery_Adapter(strSQL, dt, cnnTemp); + if (dt.Rows.Count > 0) + { + + strLotNo = dt.Rows[0]["LotNo"].ToString(); + } + else + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%找不到对应的生产批%]"); + return false; + } + } + strSQL = $"select * from tblwiplotstate where lotno = '{strLotNo}'"; + + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + OPNO = drTemp["OPNO"].ToString(); + string STATUS = drTemp["STATUS"].ToString(); + string LotSerial = drTemp["LOGGROUPSERIAL"].ToString(); + if (STATUS == "4") + { + var colNextNode = GetNextNode(strLotNo, "Null", defString, AdditionalXml: ""); + using (kcWIP.clsLot objLot = new kcWIP.clsLot()) + { + var drLotState = objLot.GetLotBasisJoinState(LotNo: strLotNo); // 取得最新的LotState + objLot.SetLotStateToNextOP(Conversions.ToLong(drLotState["LotStamp"]), strLotNo, Convert.ToString(colNextNode["NodeID"])); + //objLot.SetLotStateToWait(Conversions.ToLong(drLotState["LotStamp"]), strLotNo, 2, UserNo: "EAP", WaitDescription: "ExeOSReturn finish then GetNextNode failed,can not find next node,linkname:" + strLinkName + "."); + + } + + } + else if (STATUS == "1") + { + funReentryUpdateTime(LotSerial, strLotNo, OPNO, ref CollectionSQL); + goto Reentry; + } + else if (STATUS == "0") + { + funReentryUpdateTime(LotSerial, strLotNo, OPNO, ref CollectionSQL); + } + } + drTemp.Close(); + Check_CIRequest_LOTMaterial(ref aryMessage, EQPID, strLotNo, OPNO); + if (aryMessage.Count > 0) + { + return false; + } + //调用标准进站 + var datSendTime = default(DateTime); // 送達時間 + object blnRuleCheck = true; + bool blnEXETriggerOP = false; + string strComputerName = string.Empty; // Request Client ComputerName + string strCurUserNo = string.Empty; // Request User -紀錄操作人員 + Dictionary dicPars = new Dictionary(); //固定引數,Request傳入的一般參數 + Dictionary dicPars_DataTable = new Dictionary(); //固定引數,Request傳入的DataTable參數 + + //添加批号 + dicPars.Add("lotno", strLotNo); + dicPars.Add("equipmentno", EQPID); + + + AutoexecutionLot_Lot(ref blnEXETriggerOP, dicPars, dicPars_DataTable, "CI", datSendTime, strCurUserNo, strComputerName, Convert.ToBoolean(blnRuleCheck)); + strSQL = $"update TBLWIPPRDSTATE_LQ set eqpid = '{EQPID}',opno = '{OPNO}' where PRODUCTID = '{strProductID_Auto}' and state = 1"; + CollectionSQL.Add(strSQL); + strSQL = $"update TBLWIPLOTLOG_REPORT set CIREMARK = '{remark}' where LoggroupSerial =(select LoggroupSerial from TBLWIPLOTSTATE where LOTNO='{strLotNo}')"; + CollectionSQL.Add(strSQL); + + Reentry: + ; + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + //strLotNo = Conversions.ToString(dsData.Tables["TBLWIPLOTBASIS"].Rows[0]["BASELOTNO"]); + + + funTrackIn_Inquiry = true; + exitfun: + ; + } + catch (Exception ex) + { + // 一行调用,拿到完整异常字符串 + string errorMsg = clsERP.GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + + drTemp?.Close(); + + dsData?.Dispose(); + CloseConnection(cnnTemp); + } + return funTrackIn_Inquiry; + + } + /// + /// 出站 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool funTrackOut_Inquiry_LQ(ref List aryMessage, ref List aryException, string EQPID, string ID, string remark) + { + bool funTrackOut_Inquiry = default(bool); + //bool r = false; + string strSQL = default(string); + IDbConnection cnnTemp = null; + DbDataReader drTemp = null; + + AppSettings objSetting = new AppSettings(); + + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + DataSet dsData = new DataSet(); + + + + string strReturn = ""; + + + string strMLotNo = "";//母生产批号 + string strNLotNo = "";//子生产批号 + string strProductNo = "";//产品号 + string strProductVersion = "";//产品版本 + string strSeqNoRule = "";//序号规则 + string strSeqNoType = "";//序号类别 + string strSeqNoSize = "";//起始位置 + string strDirection = "";//走向 + string strOPNO = ""; + + string strUnitIdOrPannid = "";//UnitId或者Pannid + + bool bolLastLot = false;//是否是最后一笔 + + DataSet dataSetLotNo = new DataSet(); + + kcWIP.clsLot objLot = new kcWIP.clsLot(); + + Collection CollectionSQL = new Collection(); + + bool bolInsertMONoProperty = false; //插入工单属性 + + decimal decMQTY = 0; //母批数量 + + try + { + //先检查 设备状态是否是闲置 + + //检查设备是否存在 + strSQL = "SELECT 1 FROM TBLEQPEQUIPMENTBASIS WHERE EQUIPMENTNO='" + EQPID + "' AND ISSUESTATE = 2"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + clsERP.combineMessage(ref aryMessage, mmsg: EQPID + "[%:设备不存在!%]"); + return false; + } + drTemp.Close(); + + + // ============================ + // 自动判断ID类型(通过序号规则) + // LCSIP开头 → CarrierID(通用载具) + // X1088开头 → CarrierID(专用载具) + // 其他 → ProductID(PanelID或UnitID) + // ============================ + string strIDValue = ID; + string strProductID_Auto = ""; + string strCarrierID_Auto = ""; + string strAutoType = ""; + string Type = ""; + + + if (!string.IsNullOrEmpty(strIDValue)) + { + // 自动判断ID类型 + if (strIDValue.StartsWith("LCSIP") || strIDValue.StartsWith("X1088")) + { + // 载具ID + Type = "2"; // CarrierID + strCarrierID_Auto = strIDValue; + } + else + { + // 产品ID(PanelID或UnitID) + Type = "1"; // ProductID + strProductID_Auto = strIDValue; + } + } + + // 根据自动判断结果或手动指定的Type决定处理逻辑 + + // 17单 需求二/三:依作业站属性自动解绑(TRAY/小载具)+分批出站,在标准判型出站之前 + bool bolAutoUnbindHandled = false; + if (!funAutoUnbindCheckOut_LQ(ref aryMessage, Type, strProductID_Auto, strCarrierID_Auto, EQPID, out bolAutoUnbindHandled)) + { + return false; + } + if (bolAutoUnbindHandled) + { + return true; + } + + + + if (Type == "1") + { + if (strProductID_Auto is null && strProductID_Auto == "") + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%Product_id 没有传值%]"); + return false; + } + DataTable dt = new DataTable(); + strSQL = $"select * from TBLWIPPRDSTATE_LQ where PRODUCTID = '{strProductID_Auto}' and state = 1"; + ExecuteSQLQuery_Adapter(strSQL, dt, cnnTemp); + if (dt.Rows.Count != 1) + { + clsERP.combineMessage(ref aryMessage, mmsg: $"[%产品ID({strProductID_Auto})对应多个批次,请检查数据来源。%]"); + return false; + } + strMLotNo = dt.Rows[0]["LotNo"].ToString(); + } + else if (Type == "2") + { + //if (strCarrierID_Auto is null && strCarrierID_Auto == "") + //{ + // clsERP.combineMessage(ref aryMessage, mmsg: "[%Carrier_id 没有传值%]"); + // return false; + //} + if (strCarrierID_Auto is null || strCarrierID_Auto == "") //17单 M3:原 && 恒不成立,检核形同虚设,应为 || + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%Carrier_id 没有传值%]"); + return false; + } + + DataTable dt = new DataTable(); + strSQL = $"select * from TBLWIPPRDSTATE_LQ where (carrierid = '{strCarrierID_Auto}' or TrayID = '{strCarrierID_Auto}') and state = 1"; + ExecuteSQLQuery_Adapter(strSQL, dt, cnnTemp); + //foreach (DataRow row in dt.Rows) + //{ + if (dt.Rows.Count == 0) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%找不到对应的生产批%]"); + return false; + } + strMLotNo = dt.Rows[0]["LotNo"].ToString(); + } + + //获取母批的基本信息 + strSQL = $"SELECT A.PRODUCTNO,A.PRODUCTVERSION,B.STATUS,B.CURQTY,B.OPNO,B.LOTSTAMP FROM TBLWIPLOTBASIS A LEFT JOIN TBLWIPLOTSTATE B ON A.BASELOTNO = B.LOTNO WHERE A.BASELOTNO ='{strMLotNo}'"; + ExecuteSQLQuery_Adapter(strSQL, dsData, "TBLWIPLOTBASIS_MLOT", cnnTemp); + + + if (dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows.Count == 0) + { + clsERP.combineMessage(ref aryMessage, mmsg: strMLotNo + "[%:批次状态不是执行中,不允许出站!%]"); + return false; + } + + //检查母批状态是否是执行中 STATUS 是否为 1 + if (Conversions.ToInteger(dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows[0]["STATUS"]) != 1) + { + clsERP.combineMessage(ref aryMessage, mmsg: strMLotNo + "[%:母生产批状态不是执行中!%]"); + return false; + } + + //检查是否是用当前设备进站 + strSQL = "SELECT EQUIPMENTNO FROM TBLWIPTEMP_EQUIPMENT WHERE LotNo='" + strMLotNo + "' "; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (EQPID != drTemp["EQUIPMENTNO"].ToString()) + { + clsERP.combineMessage(ref aryMessage, mmsg: EQPID + "[%:当前设备不是进站设备,不允许出站!%]"); + return false; + } + } + drTemp.Close(); + //调用标准出站 + var datSendTime = default(DateTime); // 送達時間 + object blnRuleCheck = true; + bool blnEXETriggerOP = false; + string strComputerName = string.Empty; // Request Client ComputerName + string strCurUserNo = string.Empty; // Request User -紀錄操作人員 + Dictionary dicPars = new Dictionary(); //固定引數,Request傳入的一般參數 + Dictionary dicPars_DataTable = new Dictionary(); //固定引數,Request傳入的DataTable參數 + + //添加批号 + dicPars.Add("lotno", strMLotNo); + dicPars.Add("equipmentno", EQPID); + + //出站明细 + DataTable dtLotAttrib = new DataTable(); //特性 + //添加LotNo列 + dtLotAttrib.Columns.Add("LotNo", typeof(string)); + dtLotAttrib.Columns.Add("AttribNo", typeof(string)); + dtLotAttrib.Columns.Add("AttribValue", typeof(string)); + + decMQTY = decimal.Parse(dsData.Tables["TBLWIPLOTBASIS_MLOT"].Rows[0]["CURQTY"].ToString()); + + //查询生产批的绑定特性,这里是出站,所以使用TEMP表 + strSQL = $"SELECT ATTRIBNO,ATTRIBVALUE FROM TBLWIPTEMP_ATTRIB WHERE LOTNO='{strMLotNo}'"; + ExecuteSQLQuery_Adapter(strSQL, dsData, "TBLWIPTEMP_ATTRIB", cnnTemp); + if (dsData.Tables["TBLWIPTEMP_ATTRIB"].Rows.Count > 0) + { + foreach (DataRow dr in dsData.Tables["TBLWIPTEMP_ATTRIB"].Rows) + { + DataRow drLotAttrib = dtLotAttrib.NewRow(); + drLotAttrib["LotNo"] = strMLotNo; + drLotAttrib["AttribNo"] = dr["ATTRIBNO"].ToString(); + if (dr["AttribNo"].ToString() == "GoodQty") + { + drLotAttrib["AttribValue"] = decMQTY; + + } + else if (dr["AttribNo"].ToString() == "ScrapQty") + { + drLotAttrib["AttribValue"] = 0; + } + else if (dr["AttribNo"].ToString() == "DefectQty") + { + drLotAttrib["AttribValue"] = 0; + } + else + { + drLotAttrib["AttribValue"] = dr["ATTRIBVALUE"].ToString(); + } + + dtLotAttrib.Rows.Add(drLotAttrib); + } + } + + + dicPars_DataTable.Add("lotattrib", dtLotAttrib); + + // ============================ + // 出站成功后,插入TBLWIPCONT_LOTRECORD记录(remark生产数据) + // ============================ + if (!string.IsNullOrEmpty(strMLotNo) && !string.IsNullOrEmpty(remark)) + { + string strLotSerial = ""; + string strBaseLotNo = ""; + string strOPNos = ""; + string strLogGroupSerial = ""; + string strEventUserNo = ""; + + strSQL = $"SELECT LOTSERIAL, BASELOTNO, OPNO, LOGGROUPSERIAL, EVENTUSERNO FROM TBLWIPLOTSTATE WHERE LOTNO = '{strMLotNo}'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strLotSerial = drTemp["LOTSERIAL"] is DBNull ? "" : drTemp["LOTSERIAL"].ToString(); + strBaseLotNo = drTemp["BASELOTNO"] is DBNull ? "" : drTemp["BASELOTNO"].ToString(); + strOPNos = drTemp["OPNO"] is DBNull ? "" : drTemp["OPNO"].ToString(); + strLogGroupSerial = drTemp["LOGGROUPSERIAL"] is DBNull ? "" : drTemp["LOGGROUPSERIAL"].ToString(); + strEventUserNo = drTemp["EVENTUSERNO"] is DBNull ? "" : drTemp["EVENTUSERNO"].ToString(); + } + drTemp.Close(); + + string strEventTime = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); + strSQL = $"INSERT INTO TBLWIPCONT_LOTRECORD (BASELOTNO, LOTNO, LOTSERIAL, OPNO, LOTRECORD, USERNO, EVENTTIME, LOGGROUPSERIAL) " + + $"VALUES ('{strBaseLotNo}', '{strMLotNo}', '{strLotSerial}', '{strOPNos}', '{remark}', '{strEventUserNo}', " + + $"TO_DATE('{strEventTime}', 'SYYYY-MM-DD HH24:MI:SS'), '{strLogGroupSerial}')"; + CollectionSQL.Add(strSQL); + } + AutoexecutionLot_Lot(ref blnEXETriggerOP, dicPars, dicPars_DataTable, "CO", datSendTime, strCurUserNo, strComputerName, Convert.ToBoolean(blnRuleCheck)); + #region 出站扣料逻辑 + // 字符串类型 + string LotSerial = ""; + string OPNo = ""; + string InventoryNo = ""; + string MONo = ""; + string CurUnitNo = ""; + string ProductNo = ""; + string ProductVersion = ""; + string BaseLotNo = ""; + string BRNo = ""; + string LogGroupSerial = ""; + long lngLotStamp = 0; + decimal decCurQty = 0; + int intMaterialOption = 0; + int PhaseNo = 0; + DataTable dtMaterial = new DataTable(); + DataTable dtMaterialLot = new DataTable(); + DateTime datEventTime = DateTime.Now; + // 2016/10/26 YF, 取出作業站的用料選項 + // 2018/2/9, Ning, CurUnitNo改取自tblWIPLotState + // 1.取出Temp LotState的資料 + if (strDataBaseType.ToUpper() == "ORACLE") + { + strSQL = "Select A.LotSerial, A.OPNo, A.InventoryNo, A.MONo, B.CurUnitNo, A.ProductNo, A.ProductVersion, A.BaseLotNo, " + " B.BRNo, B.LogGroupSerial, B.LotStamp, B.CurQty, B.PhaseNo, C.MaterialOption " + " From tblWIPTemp_LotState A, tblWIPLotState B, tblOPBasis C " + " Where A.LotNo = '" + strMLotNo + "'" + " And A.LotNo = B.LotNo " + " And B.OPNo = C.OPNo "; + } + else + { + strSQL = "Select A.LotSerial, A.OPNo, A.InventoryNo, A.MONo, B.CurUnitNo, A.ProductNo, A.ProductVersion, A.BaseLotNo, " + " B.BRNo, B.LogGroupSerial, B.LotStamp, B.CurQty, B.PhaseNo, C.MaterialOption " + " From tblWIPTemp_LotState A With (NoLock), tblWIPLotState B With (NoLock), tblOPBasis C With (NoLock) " + " Where A.LotNo = '" + strMLotNo + "'" + " And A.LotNo = B.LotNo " + " And B.OPNo = C.OPNo "; + } + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + LotSerial = drTemp["LotSerial"].ToString(); + OPNo = drTemp["OPNo"].ToString(); + InventoryNo = drTemp["InventoryNo"].ToString(); + MONo = drTemp["MONo"].ToString(); + CurUnitNo = drTemp["CurUnitNo"].ToString(); + ProductNo = drTemp["ProductNo"].ToString(); + ProductVersion = drTemp["ProductVersion"].ToString(); + BaseLotNo = drTemp["BaseLotNo"].ToString(); + BRNo = drTemp["BRNo"].ToString(); + LogGroupSerial = drTemp["LogGroupSerial"].ToString(); + lngLotStamp = Conversions.ToLong(drTemp["LotStamp"]); + decCurQty = Convert.ToDecimal(drTemp["CurQty"]); + intMaterialOption = Conversions.ToInteger(drTemp["MaterialOption"]); + PhaseNo = Conversions.ToInteger(drTemp["PhaseNo"]); // 2020/11/26 Steven Mantis:0082084 [PAD]eRunCard_調整 BR 生產記錄 + } + else + { + throw new iMESException.MESException("0000-202003", "[%LotNo%] : " + strMLotNo); + } + drTemp.Close(); + using (var obj = new clsLot()) + { + + + // 4.Material + // 2016/10/26 YF, 依用料選項來執行扣料的方式 + switch (intMaterialOption) + { + case 0: + { + // 發料點(線邊倉或工單) + obj.SHR_COMaterial(strMLotNo, LogGroupSerial, LotSerial, LotSerial, "EAP", datEventTime, InventoryNo, MONo, OPNo, ref cnnTemp, ref CollectionSQL, dicPars_DataTable["equipment"], dtMaterial, dtMaterialLot); + break; + } + + case 1: + { + // 設備 + var objHandler = new clsMaterialHandler(); + + if (false) + { + // 採先進先出扣料 + objHandler.SHR_COMaterialByEQP_FIFO(strMLotNo, LogGroupSerial, LotSerial, ref CollectionSQL, ref dtMaterial, ref dtMaterialLot, dicPars_DataTable["equipment"], datEventTime); + } + else + { + // 採輸入料批扣料 + objHandler.SHR_COMaterialByEQP(strMLotNo, LogGroupSerial, LotSerial, ref CollectionSQL, ref dtMaterial, ref dtMaterialLot, dicPars_DataTable["equipment"], datEventTime); + } + + + + // Case 2 + // 生產線, 待組裝版再實作 + + // Case 3 + // 工位, 待組裝版再實作 + + objHandler = null; + break; + } + + default: + { + throw new iMESException.MESException("0000-003000", "[%MaterialOption%]:" + intMaterialOption + " [%NOT DEFINE%]!"); + } + } + } + #endregion + + + + if (CollectionSQL.Count > 0) + { + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + } + + + funTrackOut_Inquiry = true; + exitfun: + ; + } + catch (Exception ex) + { + // 一行调用,拿到完整异常字符串 + string errorMsg = clsERP.GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + + if (objLot != null) + { + objLot = null; + } + + drTemp?.Close(); + + dsData?.Dispose(); + CloseConnection(cnnTemp); + } + return funTrackOut_Inquiry; + + } + + public static void funReentryUpdateTime(string LotSerial, string LotNo, string OPNO, ref Collection CollectionSQL) + { + try + { + strSQL = $"update TBLWIPLOTLOG_REPORT set STARTTIME = SYSDATE,CHECKINTIME = SYSDATE where LOGGROUPSERIAL = '{LotSerial}'"; + CollectionSQL.Add(strSQL); + //strSQL = $"update TBLWIPLOTLOG set STARTTIME = SYSDATE where LOGGROUPSERIAL = '{LotSerial}'"; + //CollectionSQL.Add(strSQL); + strSQL = $"insert into tblcusentry(LOTSERIAL,LotNO,STARTTIME,OPNO) Values('{LotSerial}','{LotNo}',SYSDATE,'{OPNO}')"; + CollectionSQL.Add(strSQL); + //回复处理 + strSQL = $"DELETE FROM tblcusentry WHERE LOTSERIAL='{LotSerial}'"; + Collection argcolSQL_Rows = null; + objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows); + } + catch (Exception ex) + { + throw; + } + finally + { + + } + } + + #endregion + + #region 进出站对物料的管控 + public static DataSet Check_CIRequest_LOTMaterial(ref List aryMessage, string EquipmentNo, string LotNo, string OPNo) + { + DataSet Check_CIRequest_LOTMaterialRet = default(DataSet); + // Dim result As Boolean = False + var result = new DataSet(); + + var All_result = new DataSet(); + var dsTemp = default(DataSet); + string InXML, OutXML; + string MONO; + string Materialoption = ""; + string LotQty = defString; + string strMessage = ""; + string strError = ""; + try + { + object[] aryPars; + + aryPars = clsCom.funGetMethodParameters("kcEQP", "clsEQPBasis", "ShowEquipmentBasis"); + aryPars[0] = EquipmentNo; + dsTemp = clsCom.funExecuteMethod("kcEQP", "clsEQPBasis", "ShowEquipmentBasis", ref aryPars) as DataSet; + + foreach (DataTable item in dsTemp.Tables) + All_result.Tables.Add(item.Copy()); + + // 檢查設備是否存在 + if (All_result.Tables["EQPEquipmentBasis"] == null || All_result.Tables["EQPEquipmentBasis"].Rows.Count <= 0) + { + throw new iMESException.MESException("0000-200003", "[%EQPNO%]:" + EquipmentNo + " [%IS NOT EXIST%]"); + } + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(All_result.Tables["EQPEquipmentBasis"].Rows[0]["IssueState"], 2, false))) + { + throw new iMESException.MESException("0000-200015", "[%EQPNO%]:" + EquipmentNo + " [%PLEASE CHECK ISSUE STATE%]"); + } + + aryPars = clsCom.funGetMethodParameters("kcWIP", "clsLot", "ShowLotBasisJoinState"); + aryPars[0] = LotNo; + dsTemp = clsCom.funExecuteMethod("kcWIP", "clsLot", "ShowLotBasisJoinState", ref aryPars) as DataSet; + + foreach (DataTable item in dsTemp.Tables) + All_result.Tables.Add(item.Copy()); + + // 檢查生產批是否存在 + if (All_result.Tables["BasisJoinState"] == null || All_result.Tables["BasisJoinState"].Rows.Count <= 0) + { + throw new iMESException.MESException("0000-200003", "[%LOTNO%]:" + LotNo + " [%IS NOT EXIST%]"); + } + if (All_result.Tables["BasisJoinState"].Rows[0]["CURQTY"] == null || Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(All_result.Tables["BasisJoinState"].Rows[0]["CURQTY"], 0, false))) + { + throw new iMESException.MESException("0000-200017", "[%LOTNO%]:" + LotNo + " [%LOTCURQTY%] [%CANT BE%] 0"); + } + else if (All_result.Tables["BasisJoinState"].Rows[0]["CURQTY"] == null || Convert.ToBoolean(Operators.ConditionalCompareObjectLess(All_result.Tables["BasisJoinState"].Rows[0]["CURQTY"], 0, false))) + { + throw new iMESException.MESException("0000-200017", "[%LOTNO%]:" + LotNo + " [%LOTCURQTY%] [%MUST BE GREATER THAN%] 0 "); + } + else + { + LotQty = All_result.Tables["BasisJoinState"].Rows[0]["CURQTY"].ToString(); + MONO = All_result.Tables["BasisJoinState"].Rows[0]["MONO"].ToString(); + } + + + aryPars = clsCom.funGetMethodParameters("kcOP", "clsOPBasis", "ShowOPBasis"); + aryPars[0] = OPNo; + dsTemp = clsCom.funExecuteMethod("kcOP", "clsOPBasis", "ShowOPBasis", ref aryPars) as DataSet; + + foreach (DataTable item in dsTemp.Tables) + All_result.Tables.Add(item.Copy()); + + // 檢查作業站編號是否存在 + if (All_result.Tables["OPBasis"] == null || All_result.Tables["OPBasis"].Rows.Count <= 0) + { + throw new iMESException.MESException("0000-200003", "[%OPNO%]:" + OPNo + " [%IS NOT EXIST%]"); + } + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(All_result.Tables["OPBasis"].Rows[0]["IssueState"], 2, false))) + { + throw new iMESException.MESException("0000-200015", "[%OPNO%]:" + OPNo + " [%PLEASE CHECK ISSUE STATE%]"); + } + else + { + Materialoption = All_result.Tables["OPBasis"].Rows[0]["Materialoption"].ToString(); + } + + aryPars = clsCom.funGetMethodParameters("kcOE", "clsOEBasis", "ShowMOMaterialList"); + aryPars[0] = MONO; + aryPars[2] = OPNo; + dsTemp = clsCom.funExecuteMethod("kcOE", "clsOEBasis", "ShowMOMaterialList", ref aryPars) as DataSet; + + foreach (DataTable item in dsTemp.Tables) + All_result.Tables.Add(item.Copy()); + + DataTable dtMOMaterialList; + dtMOMaterialList = new DataTable("materiallist"); + dtMOMaterialList.Columns.Add("materialno", Type.GetType("System.String")); + dtMOMaterialList.Columns.Add("materiallotno", Type.GetType("System.String")); + dtMOMaterialList.Columns.Add("materiallevel", Type.GetType("System.String")); + dtMOMaterialList.Columns.Add("checklotno", Type.GetType("System.String")); + dtMOMaterialList.Columns.Add("checkmtlpass", Type.GetType("System.String")); + dtMOMaterialList.Columns.Add("useqty", Type.GetType("System.String")); + dtMOMaterialList.Columns.Add("unitno", Type.GetType("System.String")); + + + aryPars = clsCom.funGetMethodParameters("kcWIP", "clsLot", "ShowChkLotCI_Material"); + aryPars[0] = LotNo; + aryPars[1] = OPNo; + aryPars[2] = EquipmentNo; + aryPars[3] = true; + dsTemp = clsCom.funExecuteMethod("kcWIP", "clsLot", "ShowChkLotCI_Material", ref aryPars) as DataSet; + foreach (DataTable item in dsTemp.Tables) + All_result.Tables.Add(item.Copy()); + + DataRow drData; + foreach (DataRow r in All_result.Tables["all_materiallist"].Rows) + { + drData = dtMOMaterialList.NewRow(); + // drData("materialno") = r("materialno").ToString + drData["materialno"] = r["inputmaterialno"].ToString(); + drData["materiallotno"] = r["materiallotno"].ToString(); // 沒有物料批號資料時請填N/A + drData["materiallevel"] = r["materiallevel"].ToString(); // 0:Material(物料)。1:Product(半成品)。 + drData["unitno"] = r["unitno"].ToString(); + drData["checklotno"] = r["checklotno"].ToString(); // 0:False 1:True + drData["checkmtlpass"] = r["checkmtlpass"].ToString(); // -1: 不用查核 0:fail查核失敗, 上料數不足 1:pass查核成功, 上料數足夠 + dtMOMaterialList.Rows.Add(drData); + + // 若有傳出的DataTable中有錯誤訊息已 ;分號 做分隔 + if (!string.IsNullOrEmpty(r["errorcode"].ToString()) | !string.IsNullOrEmpty(r["errormessage"].ToString())) + { + if (string.IsNullOrEmpty(strError)) + { + strError = r["errorcode"].ToString(); + } + else + { + strError = strError + ";" + r["errorcode"].ToString(); + } + + if (string.IsNullOrEmpty(strMessage)) + { + strMessage = "[%materialno%]:" + r["materialno"].ToString() + " " + r["errormessage"].ToString(); + } + else + { + strMessage = strMessage + ";" + "[%materialno%]:" + r["materialno"].ToString() + " " + r["errormessage"].ToString(); + } + + } + + } + + if (!string.IsNullOrEmpty(strMessage)) + { + throw new iMESException.MESException(strError, strMessage); + } + + result.Tables.Add(dtMOMaterialList); + } + + catch (Exception ex) + { + throw; + } + finally + { + Check_CIRequest_LOTMaterialRet = result; + + if (dsTemp != null) + dsTemp.Dispose(); + if (result != null) + result.Dispose(); + if (All_result != null) + All_result.Dispose(); + } + + return Check_CIRequest_LOTMaterialRet; + + } + + + + #endregion + + + #region "MakingCode明码查询" + /// + /// 明码查询接口:根据PanelSN查MAKINGCODE和UNITSN,并校验设备可用性 + /// + public static bool funMakingCode(ref List aryMessage, ref List aryException, string PanelSN, string EQPID, ref string strMAKINGCODE, ref string strUNITSN) + { + bool funMakingCode = default(bool); + string strSQL = default(string); + IDbConnection cnnTemp = null; + DbDataReader drTemp = null; + + AppSettings objSetting = new AppSettings(); + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + string strLotNo = ""; + + try + { + // ============================ + // 1. 校验设备是否存在 + // ============================ + strSQL = "SELECT 1 FROM TBLEQPEQUIPMENTBASIS WHERE EQUIPMENTNO='" + EQPID + "' AND ISSUESTATE = 2"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + clsERP.combineMessage(ref aryMessage, mmsg: EQPID + "[%:设备不存在!%]"); + return false; + } + drTemp.Close(); + + // ============================ + // 2. 根据PanelSN(作为ProductID)查询LotNo + // ============================ + strSQL = "SELECT LOTNO FROM TBLWIPPRDSTATE_LQ WHERE PRODUCTID = '" + PanelSN + "' AND STATE = '1'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%PanelSN(" + PanelSN + ")未找到对应批次!%]"); + return false; + } + strLotNo = drTemp["LOTNO"].ToString(); + drTemp.Close(); + + // ============================ + // 3. 校验设备:根据Lot状态决定校验逻辑 + // STATUS=0(待进站):检查设备是否可用(参考frmBR_L_CI_GEN加载可用设备逻辑) + // STATUS=1(已进站):检查所选设备是否是当前批次进站设备 + // ============================ + strSQL = "SELECT STATUS FROM TBLWIPLOTSTATE WHERE LOTNO = '" + strLotNo + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%批次(" + strLotNo + ")状态未知,不允许查询!%]"); + return false; + } + int lotStatus = Convert.ToInt32(drTemp["STATUS"]); + drTemp.Close(); + + if (lotStatus == 0) + { + // STATUS=0 待进站:参考frmBR_L_CI_GEN带出所有可用设备,检查设备是否在可用设备列表中 + DataTable dtAvailableEquipment_All; + DataTable dtAvailableEquipment_Chamber; + using (var objLot = new clsLot()) + { + var dsAvailable = ShowAvailableEquipment_All(strLotNo); + dtAvailableEquipment_All = dsAvailable.Tables[0]; + + } + + // 检查设备是否在可用设备列表中(AllowExecute=1) + DataRow[] drAvailable = dtAvailableEquipment_All.Select("AllowExecute=1 And EquipmentNo = '" + EQPID + "'"); + if (drAvailable.Length == 0) + { + + clsERP.combineMessage(ref aryMessage, mmsg: "[%设备(" + EQPID + ")不在批次(" + strLotNo + ")的可用设备列表中,不允许查询!%]"); + return false; + + } + } + else if (lotStatus == 1) + { + // STATUS=1 已进站:检查所选设备是否是当前批次进站设备 + strSQL = "SELECT A.LOTNO FROM TBLWIPLOTSTATE A " + + "LEFT JOIN TBLWIPTEMP_EQUIPMENT B ON A.LOTNO = B.LOTNO " + + "WHERE A.LOTNO = '" + strLotNo + "' AND A.STATUS = 1 AND B.EQUIPMENTNO = '" + EQPID + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%批次(" + strLotNo + ")未在设备(" + EQPID + ")上进站,不允许查询!%]"); + return false; + } + drTemp.Close(); + } + else + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%批次(" + strLotNo + ")状态为(" + lotStatus + "),不支持该状态的明码查询!%]"); + return false; + } + + // ============================ + // 4. 查询 TBLPRDPRODUCTBASIS 获取 MAKINGCODE + // ============================ + strSQL = "SELECT A.MAKINGCODE FROM TBLPRDPRODUCTBASIS A " + + "INNER JOIN TBLWIPLOTBASIS B ON A.PRODUCTNO = B.PRODUCTNO AND A.PRODUCTVERSION = B.PRODUCTVERSION " + + "WHERE B.BASELOTNO = '" + strLotNo + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strMAKINGCODE = drTemp["MAKINGCODE"].ToString(); + } + else + { + strMAKINGCODE = ""; + } + drTemp.Close(); + + // ============================ + // 5. 查询 TBLPCSDIELOG_LQ 获取 Panel 对应的 Unit 信息 + // ============================ + strSQL = "SELECT UNITID,BadFlag FROM TBLPCSDIELOG_LQ WHERE PANLEID = '" + PanelSN + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + var listUnitSN = new List(); + int location = 1; + while (drTemp.Read()) + { + string unitId = drTemp["UNITID"].ToString(); + int badFlag = 0; + if (Convert.ToInt16(drTemp["BadFlag"].ToString()) == 0) + { + badFlag = 1; + + } + else + { + badFlag = 0; + } + if (!string.IsNullOrEmpty(unitId)) + { + listUnitSN.Add("SN" + location.ToString() + ":" + unitId + ":" + badFlag); + location++; + } + } + drTemp.Close(); + strUNITSN = string.Join(";", listUnitSN); + + funMakingCode = true; + exitfun: + ; + } + catch (Exception ex) + { + string errorMsg = clsERP.GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + drTemp?.Close(); + CloseConnection(cnnTemp); + } + return funMakingCode; + } + public static DataSet ShowAvailableEquipment_All(string LotNo, bool GetAccessory = false, bool GetMaterial = false, bool GetRecipe = false, string AdditionalXml = "", bool ChkCapacity = true, bool MultiQCList = false) + { + DataSet ShowAvailableEquipment_AllRet = default(DataSet); + + // PS1.Lot已被派工至非指定機台或非Area上的機台(未處理) + // PS2.派工的部份先不加入,因派工機制尚待加強,故先不納入考量. + + IDbConnection cnnTemp = null; + // Dim daTemp As New OleDb.OleDbDataAdapter + var dsTemp = new DataSet(); + DbDataReader drTemp = null; + + DataRow[] drSel; + string strAreaNo, strSerialNo, EquipmentNo, strDesc; + string strEquipmentState = ""; + bool blnAllowExecute; + bool blnAssign = false; // 是否有指定機台 + bool blnDispatch = false; // 是否有派工 + int i, j; + + string strEQPCapability = string.Empty; // 設備能力 + int intOPReference; // 參數要參考0:Product,1:Module + string strOPNo, strReferenceNo, strReferenceVersion; + string strProductNo, strProductVersion; + + strDesc = ""; + strProductNo = ""; + strProductVersion = ""; + AppSettings objSetting = new AppSettings(); + try + { + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + // 1.取出Lot相關資料. + strSQL = "Select A.AreaNo,A.OPReference, A.LotSerial,A.OPNo,B.ProductNo,B.ProductVersion,A.ModuleNo,A.ModuleVersion From tblWIPLotState A,TBLWIPLOTBASIS B Where A.LotNo=B.BASELotNo And A.LotNo='" + LotNo + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strAreaNo = drTemp["AreaNo"].ToString(); + strSerialNo = drTemp["LotSerial"].ToString(); + strOPNo = drTemp["OPNo"].ToString(); + intOPReference = Conversions.ToInteger(drTemp["OPReference"]); + + // 0122190: 【美迪凯】配件管控失效 + // 製程模塊(Module)不支援禁用設備設定、指定配件, + // 若生產批進到模組製程中, 設備與配件需取得產品上的設定。 + strReferenceNo = drTemp["ProductNo"].ToString(); + strReferenceVersion = drTemp["ProductVersion"].ToString(); + strProductNo = drTemp["ProductNo"].ToString(); + strProductVersion = drTemp["ProductVersion"].ToString(); + } + else + { + throw new iMESException.MESException("0000-200003", "[%Get temp data fail%]: [%LotState%]" + Constants.vbCrLf + "[%LotNo%]: " + LotNo); + // Throw New iMESException.MESException("0000-200003", "[Get LotNo:" & LotNo & " Lot State join Temp Lot State,is not exist.]") + } + drTemp.Close(); + + + // 1.1 設系統參數SelectAllAreaEQP (0:否, 1:是),判斷是否要選擇該作業站的所有機台,2010/01/06,by yumei + // 2010/11/24,sammi.加上Module. + string strParameterValue; + + strSQL = "Select ParameterValue From tblSYSParameter Where Upper(ParameterNo)='SELECTALLAREAEQP'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strParameterValue = drTemp["ParameterValue"].ToString(); + } + else + { + strParameterValue = ""; + } + drTemp.Close(); + + + if (strParameterValue == "1") + { + // 取出產品或Module作業站的所有區域 + string strAreaNo_All = ""; + strSQL = "Select AreaNo From tblPRDOPArea" + " Where ProductNo='" + strReferenceNo + "'" + " And ProductVersion='" + strReferenceVersion + "'" + " And OPNo='" + strOPNo + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drTemp.Read()) + { + // 配合後面sql in語法使用,要加單引號 + if (string.IsNullOrEmpty(strAreaNo_All)) + { + strAreaNo_All = "'" + drTemp["AreaNo"] + "'".ToString(); + } + else + { + strAreaNo_All = strAreaNo_All + "," + "'" + drTemp["AreaNo"] + "'".ToString(); + } + } + drTemp.Close(); + + + if (string.IsNullOrEmpty(strAreaNo_All)) + { + strAreaNo = "'" + strAreaNo + "'"; + } + else + { + strAreaNo = strAreaNo_All; + } + } + else + { + strAreaNo = "'" + strAreaNo + "'"; + } + + // 2.取出CheckIn Confirm不可使用的機台狀態 + // {生產}允許使用,不過必須檢查Capacity + strSQL = "Select EquipmentState From tblEMSViolateStatusChange " + " Where ViolativeState In (Select EquipmentState From tblEQPStateControl " + " Where Upper(ControlType) ='WIP TRACKING' And Upper(ControlNo) = 'CHECKINCONFIRM')" + " And EquipmentState <> 1"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strEquipmentState = strEquipmentState + "," + drTemp["EquipmentState"].ToString(); + while (drTemp.Read()) + strEquipmentState = strEquipmentState + "," + drTemp["EquipmentState"].ToString(); + // 去除第一個逗號 + strEquipmentState = Strings.Mid(strEquipmentState, 2, Strings.Len(strEquipmentState) - 1); + } + drTemp.Close(); + + + // 2.5 檢查是否有設定產品作業站的設備能力 (Equipment Capability) Larry 2007/12/21 + // 2010/11/23,sammi.改寫 + strSQL = "Select POA.AttribValue" + " From tblPRDOP PO,tblPRDOPAttrib POA " + " Where PO.SerialNo = POA.SerialNo " + " And PO.ProductNo='" + strReferenceNo + "'" + " And PO.ProductVersion='" + strReferenceVersion + "'" + " And PO.OPNo='" + strOPNo + "'" + " And UPPER (POA.AttribNo) = UPPER ('EQPCapability') "; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strEQPCapability = drTemp["AttribValue"].ToString(); + } + else + { + strEQPCapability = string.Empty; + } + drTemp.Close(); + + + // 3.以AreaNo取出所有機台. + // 有設定Equipment Capability的話 要過濾掉OFF狀態的設備 + if (!string.IsNullOrEmpty(strEQPCapability)) + { + // EQPSwitch 0:OFF 1:ON + // 當有設定PRDOPAttrib.EQPCapability時就只取 EQPSwitch=1(ON)的狀態 + + strSQL = " SELECT * "; + strSQL += " FROM (SELECT AreaEQP.*, EQPCapability.Capability, EQPCapability.EQPSwitch "; + strSQL += " FROM (SELECT EquipmentType, EquipmentNo, EquipmentName, "; + if (strDataBaseType != "oracle") + { + strSQL += " IsNull(EquipmentClass, '') AS EquipmentClass, "; + strSQL += " IsNull(Capacity, -1) AS Capacity, "; + strSQL += " IsNull(LoadPort, 0) AS EQPLoadPort, QCListNo "; + } + else + { + strSQL += " Nvl(EquipmentClass, '') AS EquipmentClass, "; + strSQL += " Nvl(Capacity, -1) AS Capacity, "; + strSQL += " Nvl(LoadPort, 0) AS EQPLoadPort, QCListNo "; + } + strSQL += " FROM tblEQPEquipmentBasis "; + strSQL += " WHERE IssueState = 2 And EquipmentNo IN ( "; + strSQL += " SELECT ObjectNo "; + strSQL += " FROM tblSMDAreaRelation "; + strSQL += " WHERE ContainAreaNo in (" + strAreaNo + ") "; + strSQL += " AND ObjectType = 2) "; + strSQL += " OR EquipmentNo IN ( "; + strSQL += " SELECT EquipmentNo "; + strSQL += " FROM tblEQPGroupDetail "; + strSQL += " WHERE EquipmentGroup IN ( "; + strSQL += " SELECT ObjectNo "; + strSQL += " FROM tblSMDAreaRelation "; + strSQL += " WHERE ContainAreaNo in (" + strAreaNo + ") "; + strSQL += " AND ObjectType = 4))) AreaEQP "; + strSQL += " LEFT OUTER JOIN "; + strSQL += " (SELECT * "; + strSQL += " FROM tblEMSEQPCapabilityStatus "; + strSQL += " WHERE UPPER(Capability) = '" + strEQPCapability.ToUpper() + "') EQPCapability "; + strSQL += " ON AreaEQP.EquipmentNo = EQPCapability.EquipmentNo "; + strSQL += " ) A "; + strSQL += " WHERE A.EQPSwitch = 1 "; + + + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + // daTemp.SelectCommand = cmmTemp + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "AreaEquipment_A", cnnTemp); + } + + else + { + strSQL = "Select EquipmentType,EquipmentNo, EquipmentName, "; + if (strDataBaseType != "oracle") + { + strSQL += " IsNull(EquipmentClass,'') as EquipmentClass , IsNull(Capacity,-1) as Capacity , IsNull(LoadPort,0) as EQPLoadPort, QCListNo "; + } + else + { + strSQL += " Nvl(EquipmentClass,'') as EquipmentClass , Nvl(Capacity,-1) as Capacity , Nvl(LoadPort,0) as EQPLoadPort, QCListNo "; + } + strSQL += " From tblEQPEquipmentBasis" + " Where IssueState = 2 And (EquipmentNo In (Select ObjectNo From tblSMDAreaRelation " + " Where ContainAreaNo in (" + strAreaNo + ") And ObjectType = 2)" + " Or EquipmentNo In (Select EquipmentNo From tblEQPGroupDetail " + " Where EquipmentGroup In (Select ObjectNo From tblSMDAreaRelation " + " Where ContainAreaNo in (" + strAreaNo + ") And ObjectType = 4)))"; + + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + // daTemp.SelectCommand = cmmTemp + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "AreaEquipment_A", cnnTemp); + + } + + //子设备禁用 + strSQL = "select equipmentno from tblPRDEQPConstraint WHERE PRODUCTNO='" + strReferenceNo + "' AND OPNO='" + strOPNo + "'"; + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PRDEQPConstraint_SubEquipment", cnnTemp); + + // 使用主設備查詢子設備 + // 2021/06/08 TsungYu ===================================================================================== + string strEQP = string.Empty; + string strChamber = string.Empty; + string strParameterChamber = string.Empty; + + strSQL = "Select ParameterValue From tblSYSParameter Where Upper(ParameterNo) = 'CHAMBERMANAGE'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strParameterChamber = drTemp["ParameterValue"].ToString(); + } + else + { + strParameterChamber = ""; + } + drTemp.Close(); + + + // 2021/8/26,Ning, 98778: 客户:浏阳泰科; 系统MESSeries 6.0.5.15; 问题:生产执行进站报错。 + if (strParameterChamber == "1" && dsTemp.Tables["AreaEquipment_A"].Rows.Count > 0) + { + foreach (DataRow dr in dsTemp.Tables["AreaEquipment_A"].Rows) + strEQP += string.Format("'{0}',", dr["EquipmentNo"].ToString()); + // If strEQP = String.Empty Then + // Throw New iMESException.MESException("0000-200015", "[%AreaNo%]: " & strAreaNo & " [%Can not find equipmentno data%]") + // End If + strEQP = strEQP.TrimEnd(','); + + strSQL = "select EquipmentType,EquipmentNo,EquipmentName,BelongEquipmentNo, "; + if (strDataBaseType != "oracle") + { + strSQL += " IsNull(EquipmentClass, '') AS EquipmentClass, "; + strSQL += " IsNull(Capacity, -1) AS Capacity, "; + strSQL += " IsNull(LoadPort, 0) AS EQPLoadPort, QCListNo "; + } + else + { + strSQL += " Nvl(EquipmentClass, '') AS EquipmentClass, "; + strSQL += " Nvl(Capacity, -1) AS Capacity, "; + strSQL += " Nvl(LoadPort, 0) AS EQPLoadPort, QCListNo "; + } + strSQL += " from tblEQPEquipmentBasis where BelongEquipmentNo in (" + strEQP + ") And IssueState = 2 order by EquipmentNo"; + strSQL += " "; + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + // daTemp.SelectCommand = cmmTemp + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "Chamber", cnnTemp); + + string strChamberEquipmentNo = string.Empty; + + + foreach (DataRow dr in dsTemp.Tables["Chamber"].Rows) + { + // clsAE不存在新增欄位 + if (dsTemp.Tables["Chamber"].Columns.Contains("AllowExecute") == false) + { + var colChamberAE = new DataColumn("AllowExecute", Type.GetType("System.Int16")); + colChamberAE.DefaultValue = 0; + dsTemp.Tables["Chamber"].Columns.Add(colChamberAE); + } + // clsDescription不存在新增欄位 + if (dsTemp.Tables["Chamber"].Columns.Contains("Description") == false) + { + // Description,不可執行的說明,Default="". + var colChamberDE = new DataColumn("Description", Type.GetType("System.String")); + colChamberDE.DefaultValue = ""; + dsTemp.Tables["Chamber"].Columns.Add(colChamberDE); + } + + EquipmentNo = dr["EquipmentNo"].ToString(); + blnAllowExecute = true; + // 檢查子機台 + // 檢查是否為可用狀態 + if (!string.IsNullOrEmpty(strEquipmentState)) + { + strSQL = "Select EquipmentNo From tblEMSEquipmentState " + " Where EquipmentNo = '" + EquipmentNo + "' And EquipmentState In (" + strEquipmentState + ")"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) // 不可使用 + { + blnAllowExecute = false; + strDesc += "EquipmentState is not available."; + } + drTemp.Close(); + + } + // 检查禁用设备 + if (dsTemp.Tables["PRDEQPConstraint_SubEquipment"].Rows.Count > 0) + { + DataRow[] drTemp_SubEQP; + drTemp_SubEQP = dsTemp.Tables["PRDEQPConstraint_SubEquipment"].Select("EquipmentNo='" + dr["EquipmentNo"] + "'"); + if (drTemp_SubEQP.Length > 0) + { + blnAllowExecute = false; + strDesc = "[%Equipment Is Constraint%]"; + } + } + if (ChkCapacity) + { + // 可使用的情況下,檢查Capacity(-1不限制Capacity).已在機台上的量+目前此批的量. + if (blnAllowExecute && Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(dr["Capacity"], -1, false))) + { + strSQL = "Select Nvl(Sum(CurQty),0) As SumCurQty From tblWIPLotState " + " Where LotNo In (Select LotNo From tblWIPTemp_Equipment " + " Where EquipmentNo='" + EquipmentNo + "')" + " Or LotNo = '" + LotNo + "'"; + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (Convert.ToBoolean(Operators.ConditionalCompareObjectGreater(drTemp["SumCurQty"], dr["Capacity"], false))) + { + blnAllowExecute = false; + strDesc += "[%Capacity is full%]"; + } + } + drTemp.Close(); + + } + } + + // 2007/10/24 Lena + // 可使用的情況下,檢查 LoadPort(上貨區數量)(<=0 不限制LoadPort) + if (blnAllowExecute && Convert.ToBoolean(Operators.ConditionalCompareObjectGreater(dr["EQPLoadPort"], 0, false))) + { + strSQL = "Select Count(*) as LotQty From tblWIPTemp_Equipment " + " Where EquipmentNo = '" + EquipmentNo + "'"; + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (Convert.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(drTemp["LotQty"], dr["EQPLoadPort"], false))) + { + blnAllowExecute = false; // 不可使用, 已超過 LoadPort 設定的數量 + strDesc += "[%LoadPort is full.%]"; + } + } + drTemp.Close(); + + } + // 變更狀態. + dr.BeginEdit(); + if (blnAllowExecute) + { + dr["AllowExecute"] = 1; // 可用 + // 組合予後面使用,可使用的,才加入. + strChamberEquipmentNo += ",'" + EquipmentNo + "'"; + } + else + { + dr["Description"] = strDesc; + + } // 不可用說明 + dr.EndEdit(); + } + } + + + + // ========================================================================================================== + + + // 4.Add Column + // RecipeGroup + var colRG = new DataColumn("RecipeGroup", Type.GetType("System.String")); + colRG.DefaultValue = "N/A"; + dsTemp.Tables["AreaEquipment_A"].Columns.Add(colRG); + // RecipeVersion,Default=0. + var colRV = new DataColumn("RecipeVersion", Type.GetType("System.String")); + colRV.DefaultValue = 0; + dsTemp.Tables["AreaEquipment_A"].Columns.Add(colRV); + // EquipmentSource,1:參數指定機台,2:Area上的機台,Default=2. + var colES = new DataColumn("EquipmentSource", Type.GetType("System.Int32")); + colES.DefaultValue = 2; + dsTemp.Tables["AreaEquipment_A"].Columns.Add(colES); + // DispatchOrder,-1:沒有被派工,其他:派工順序,Default=-1. + var colDO = new DataColumn("DispatchOrder", Type.GetType("System.Int32")); + colDO.DefaultValue = -1; + dsTemp.Tables["AreaEquipment_A"].Columns.Add(colDO); + // AllowExecute,0:No,1:Yes,Default=0. + var colAE = new DataColumn("AllowExecute", Type.GetType("System.Int16")); + colAE.DefaultValue = 0; + dsTemp.Tables["AreaEquipment_A"].Columns.Add(colAE); + // Description,不可執行的說明,Default="". + var colDE = new DataColumn("Description", Type.GetType("System.String")); + colDE.DefaultValue = ""; + dsTemp.Tables["AreaEquipment_A"].Columns.Add(colDE); + + // Kevin 2014/01/05,模治具處理 + // 取出產品設定的模治具 + strSQL = " Select * From tblPRDAccessory" + " Where ProductNo ='" + strReferenceNo + "'" + " And ProductVersion = '" + strReferenceVersion + "'" + " And OPNo ='" + strOPNo + "'" + " Order By AccessoryType,AccessoryNo"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + // daTemp.SelectCommand = cmmTemp + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PRDAccessory", cnnTemp); + + + // 5.指定機台,可能有多台,指定機台一定在Area的集合內. + string strAssEQP = ""; + if (strDataBaseType != "oracle") + { + strSQL = "Select A.EquipmentNo,IsNull(A.RecipeGroup,'N/A') As RecipeGroup,IsNull(B.RecipeVersion,0) As RecipeVersion " + " From tblPRDOPEQPRecipe A left outer join (Select RecipeGroup,RecipeVersion From tblEQPRecipeBasis Where CurVersion=1) B " + " On A.RecipeGroup=B.RecipeGroup " + " Where A.SerialNo='" + strSerialNo + "'"; + } + else + { + strSQL = "Select A.EquipmentNo,Nvl(A.RecipeGroup,'N/A') As RecipeGroup,Nvl(B.RecipeVersion,0) As RecipeVersion " + " From tblPRDOPEQPRecipe A,(Select RecipeGroup,RecipeVersion From tblEQPRecipeBasis Where CurVersion=1) B " + " Where A.RecipeGroup=B.RecipeGroup(+) " + " And A.SerialNo='" + strSerialNo + "'"; + } + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drTemp.Read()) + { + blnAssign = true; + EquipmentNo = drTemp["EquipmentNo"].ToString(); + drSel = dsTemp.Tables["AreaEquipment_A"].Select("EquipmentNo='" + EquipmentNo + "'"); + if (drSel.Length > 0) + { + drSel[0].BeginEdit(); + drSel[0]["RecipeGroup"] = drTemp["RecipeGroup"]; + drSel[0]["RecipeVersion"] = drTemp["RecipeVersion"]; + drSel[0]["EquipmentSource"] = 1; // 來自參數指定機台 + drSel[0].EndEdit(); + strAssEQP += "," + EquipmentNo; + } + } + drTemp.Close(); + + + // 有指定機台的情況下,紀錄其他非指定機台不可使用的原因. + if (blnAssign) + { + strDesc = "Have assigned equipment(" + Strings.Mid(strAssEQP, 2) + "),but current equipment is not assigned."; + drSel = dsTemp.Tables["AreaEquipment_A"].Select("EquipmentSource=2"); + var loopTo = drSel.Length - 1; + for (j = 0; j <= loopTo; j++) + { + drSel[j].BeginEdit(); + drSel[j]["Description"] = strDesc; + drSel[j].EndEdit(); + } + } + + // 6.檢查各機台的可用性. + string strEquipmentNo = ""; + string strRecipe = ""; + string strSel = ""; + + if (blnAssign) + strSel += " And EquipmentSource=1"; // 取出指定機台 + if (blnDispatch) + strSel += " And DispatchOrder<>-1"; // 取出派工機台 + + if (string.IsNullOrEmpty(strSel)) + { + drSel = dsTemp.Tables["AreaEquipment_A"].Select(); + } + else + { + strSel = Strings.Replace(strSel, "And", "", 1, 1, CompareMethod.Text); + drSel = dsTemp.Tables["AreaEquipment_A"].Select(strSel); + } + + var loopTo1 = drSel.Length - 1; + for (i = 0; i <= loopTo1; i++) + { + blnAllowExecute = true; + strDesc = ""; + EquipmentNo = drSel[i]["EquipmentNo"].ToString(); + + // 檢查是否為可用狀態 + if (!string.IsNullOrEmpty(strEquipmentState)) + { + strSQL = "Select EquipmentNo From tblEMSEquipmentState " + " Where EquipmentNo = '" + EquipmentNo + "' And EquipmentState In (" + strEquipmentState + ")"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) // 不可使用 + { + blnAllowExecute = false; + strDesc += "EquipmentState is not available."; + } + drTemp.Close(); + + } + + if (ChkCapacity) + { + // 可使用的情況下,檢查Capacity(-1不限制Capacity).已在機台上的量+目前此批的量. + if (blnAllowExecute && Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drSel[i]["Capacity"], -1, false))) + { + strSQL = "Select Nvl(Sum(CurQty),0) As SumCurQty From tblWIPLotState " + + " Where LotNo In (Select LotNo From tblWIPTemp_Equipment " + + " Where EquipmentNo='" + EquipmentNo + "')" + " Or LotNo = '" + LotNo + "'"; + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (Convert.ToBoolean(Operators.ConditionalCompareObjectGreater(drTemp["SumCurQty"], drSel[i]["Capacity"], false))) + { + blnAllowExecute = false; + strDesc += "[%Capacity is full%]"; + } + } + drTemp.Close(); + + } + } + + // 2007/10/24 Lena + // 可使用的情況下,檢查 LoadPort(上貨區數量)(<=0 不限制LoadPort) + if (blnAllowExecute && Convert.ToBoolean(Operators.ConditionalCompareObjectGreater(drSel[i]["EQPLoadPort"], 0, false))) + { + strSQL = "Select Count(*) as LotQty From tblWIPTemp_Equipment " + " Where EquipmentNo = '" + EquipmentNo + "'"; + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (Convert.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(drTemp["LotQty"], drSel[i]["EQPLoadPort"], false))) + { + blnAllowExecute = false; // 不可使用, 已超過 LoadPort 設定的數量 + strDesc += "[%LoadPort is full.%]"; + } + } + drTemp.Close(); + + } + + // Kevin 2014/01/05,模治具處理 + // 檢查設備可用性,依產品-作業站-模治具設定決定可用的設備,只要設備沒有掛上設定之模治具就不能使用,CI不開放選取 + // 先判斷是否有設定資料,有的話才要檢查 + if (blnAllowExecute && dsTemp.Tables["PRDAccessory"].Rows.Count > 0) + { + + if (dsTemp.Tables["AccStateTemp"] != null) + { + dsTemp.Tables.Remove("AccStateTemp"); + } + + // 取出AccState + strSQL = "Select A.*,B.AccessoryState,B.AccumulateQty,B.AccSpareQty,C.ScrapLife,C.LifeManage,C.LifeScript,C.LifeTolerance,C.RepairCycle,D.StateName " + " From tblEMSEQPAccState A left join tblEMSAccessoryState B on A.AccessoryNo=B.AccessoryNo " + " And A.AccessoryVersion=B.AccessoryVersion left join tblEQPAccessoryLife C " + " on A.AccessoryType=C.Accessory " + " left join tblEQPAccStateBasis D On B.AccessoryState = D.AccessoryState " + " Where A.EquipmentNo = '" + EquipmentNo + "'" + " Order By A.AccessoryType,A.AccessoryNo"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + // daTemp.SelectCommand = cmmTemp + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "AccStateTemp", cnnTemp); + + + bool blnPRDAcc = false; // 是否有產品設定的模治具 + string strAccessoryType = ""; + var aryShowAccType = new ArrayList(); + var aryShowAccNo = new ArrayList(); + + if (dsTemp.Tables["AccStateTemp"].Rows.Count > 0) + { + // 檢查設備是否都有掛產品指定之模治具,相同類別允許掛多個,但至少要有一個 + foreach (DataRow drPRD in dsTemp.Tables["PRDAccessory"].Rows) + { + + // 檢查是否是同個模治具類別 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(strAccessoryType, drPRD["AccessoryType"], false))) + { + if (blnPRDAcc) + { + // 如果已有產品設定的模治具則跳至下一筆 + goto lblAccCheck; + } + } + else + { + // 第一個物料類別不判斷blnPRDAcc + if (!string.IsNullOrEmpty(strAccessoryType)) + { + // 不同模治具類別時,如果上個模治具類別沒有符合的資料,則此設備不可用 + if (blnPRDAcc == false) + { + // 只要有一種類別模治具不符合就是False + blnAllowExecute = false; + } + } + + // 記錄此次模治具類別 + strAccessoryType = drPRD["AccessoryType"].ToString(); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drPRD["AccessoryNo"], "*", false))) + { + // 如果模治具編號為*代表只有指定模治具類別 + foreach (DataRow drAcc in dsTemp.Tables["AccStateTemp"].Rows) + { + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drAcc["AccessoryType"], drPRD["AccessoryType"], false))) + { + // 有符合的代表有掛指定的模治具類別 + blnPRDAcc = true; + // 移除此次加入的類別 + aryShowAccType.Remove(drPRD["AccessoryType"]); + // 有符合一筆即可 + goto lblAccCheck; + } + else + { + blnPRDAcc = false; + if (!aryShowAccType.Contains(drPRD["AccessoryType"])) + { + aryShowAccType.Add(drPRD["AccessoryType"]); + } + } + } + } + else + { + // 如果模治具編號不為*代表有指定模治具 + foreach (DataRow drAcc in dsTemp.Tables["AccStateTemp"].Rows) + { + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drAcc["AccessoryType"], drPRD["AccessoryType"], false)) && Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drAcc["AccessoryNo"], drPRD["AccessoryNo"], false))) + { + // 有符合的代表有掛指定的模治具類別 + blnPRDAcc = true; + // 移除此次加入的編號 + aryShowAccNo.Remove(drPRD["AccessoryNo"]); + // 有符合一筆即可 + break; + } + else + { + blnPRDAcc = false; + if (!aryShowAccNo.Contains(drPRD["AccessoryNo"])) + { + aryShowAccNo.Add(drPRD["AccessoryNo"]); + } + } + } + } + lblAccCheck: + ; + + } + + // 多判斷一次最後一個類別 + if (blnPRDAcc == false) + { + // 只要有一種類別模治具不符合就是False + blnAllowExecute = false; + } + + if (blnAllowExecute == false) + { + // 設備沒有掛載產品設定的模治具 + // 不可用說明 + strDesc += "Equipment don't use Product Setup's Accessorys"; + if (aryShowAccType.Count > 0) + { + strDesc += ", AccessoryType:"; + for (int k = 0, loopTo2 = aryShowAccType.Count - 1; k <= loopTo2; k++) + strDesc = strDesc + aryShowAccType[k] + ",".ToString(); + strDesc = strDesc.TrimEnd(','); + } + if (aryShowAccNo.Count > 0) + { + strDesc += ", AccessoryNo:"; + for (int k = 0, loopTo3 = aryShowAccNo.Count - 1; k <= loopTo3; k++) + strDesc = strDesc + aryShowAccNo[k] + ",".ToString(); + strDesc = strDesc.TrimEnd(','); + } + } + } + else + { + // 設備沒掛模治具就一定沒有掛設定的必需模治具 + // 不可用說明 + blnAllowExecute = false; + strDesc += "There is Product Accessory Setup, Equipment don't use any Accessorys"; + } + } + + // 變更狀態. + drSel[i].BeginEdit(); + if (blnAllowExecute) + { + drSel[i]["AllowExecute"] = 1; // 可用 + // 組合予後面使用,可使用的,才加入. + strEquipmentNo += ",'" + EquipmentNo + "'"; + if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drSel[i]["RecipeGroup"], "N/A", false))) + { + strRecipe = strRecipe + ",('" + drSel[i]["RecipeGroup"] + "','" + drSel[i]["RecipeVersion"] + "')".ToString(); + } + } + else + { + drSel[i]["Description"] = strDesc; + + } // 不可用說明 + drSel[i].EndEdit(); + } + + // =================================== + // 子設備 TsungYu 2021/06/08 + if (strParameterChamber == "1" && dsTemp.Tables["AreaEquipment_A"].Rows.Count > 0) + { + var parentColFIAcc = new DataColumn[1]; + var childColChamber = new DataColumn[1]; + parentColFIAcc[0] = dsTemp.Tables["AreaEquipment_A"].Columns["EquipmentNo"]; + childColChamber[0] = dsTemp.Tables["Chamber"].Columns["BelongEquipmentNo"]; + + DataRelation tmpReAcc; + tmpReAcc = new DataRelation("Chamber", parentColFIAcc, childColChamber, false); + dsTemp.Relations.Add(tmpReAcc); + } + // =================================== + + if (!string.IsNullOrEmpty(strEquipmentNo)) + { + // 去除第一個逗號 + strEquipmentNo = Strings.Mid(strEquipmentNo, 2, Strings.Len(strEquipmentNo) - 1); + string[] artEquipmentNo; + artEquipmentNo = strEquipmentNo.Split(','); + + // '=================================== + // '子設備 TsungYu 2021/06/08 + // If strParameterChamber = "1" Then + // Dim parentColFIAcc(0) As DataColumn + // Dim childColChamber(0) As DataColumn + // parentColFIAcc(0) = dsTemp.Tables("AreaEquipment_A").Columns("EquipmentNo") + // childColChamber(0) = dsTemp.Tables("Chamber").Columns("BelongEquipmentNo") + + // Dim tmpReAcc As DataRelation + // tmpReAcc = New DataRelation("Chamber", parentColFIAcc, childColChamber, False) + // dsTemp.Relations.Add(tmpReAcc) + // End If + // '=================================== + + // 取出模治具,GetAccessory是用來決定介面要不要看到EQP掛的模治具的變數 + if (GetAccessory) + { + // Kevin 15/01/26,調整In的寫法 + for (int m = 0, loopTo4 = artEquipmentNo.Length - 1; m <= loopTo4; m++) + { + // 取出AccState + strSQL = "Select A.*,B.AccessoryState,B.AccumulateQty,B.AccSpareQty,C.ScrapLife,C.LifeManage,C.LifeScript,C.LifeTolerance,C.RepairCycle,D.StateName " + " From tblEMSEQPAccState A left join tblEMSAccessoryState B on A.AccessoryNo=B.AccessoryNo " + " And A.AccessoryVersion=B.AccessoryVersion left join tblEQPAccessoryLife C " + " on A.AccessoryType=C.Accessory " + " left join tblEQPAccStateBasis D On B.AccessoryState = D.AccessoryState " + " Where A.EquipmentNo = " + artEquipmentNo[m] + " Order By A.AccessoryType,A.AccessoryNo"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + // daTemp.SelectCommand = cmmTemp + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "AccState", cnnTemp); + + } + + // 建立Relation + var parentColFIAcc = new DataColumn[1]; + var childColFIAcc = new DataColumn[1]; + parentColFIAcc[0] = dsTemp.Tables["AreaEquipment_A"].Columns["EquipmentNo"]; + childColFIAcc[0] = dsTemp.Tables["AccState"].Columns["EquipmentNo"]; + // 建立主從關係(RelationName會影響WinForm資料的顯示) + DataRelation tmpReAcc; + tmpReAcc = new DataRelation("Accessory", parentColFIAcc, childColFIAcc, false); + dsTemp.Relations.Add(tmpReAcc); + } + + // 取出物料 + if (GetMaterial) + { + // Kevin 15/01/26,調整In的寫法 + for (int m = 0, loopTo5 = artEquipmentNo.Length - 1; m <= loopTo5; m++) + { + // 取出MaterialState + strSQL = "Select EquipmentNo,MaterialNo,MaterialLotNo,Qty,UnitNo,InputDate From tblEMSEQPMaterialState " + " Where EquipmentNo = " + artEquipmentNo[m]; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + // daTemp.SelectCommand = cmmTemp + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "MaterialState", cnnTemp); + + } + + if (dsTemp.Tables["MaterialState"].Rows.Count == 0) + { + dsTemp.Tables.Remove("MaterialState"); + } + else + { + // 建立Relation + var parentColFI = new DataColumn[1]; + var childColFI = new DataColumn[1]; + + parentColFI[0] = dsTemp.Tables["AreaEquipment_A"].Columns["EquipmentNo"]; + childColFI[0] = dsTemp.Tables["MaterialState"].Columns["EquipmentNo"]; + + // 建立主從關係(RelationName會影響WinForm資料的顯示) + DataRelation tmpRe1; + tmpRe1 = new DataRelation("Material", parentColFI, childColFI, false); + dsTemp.Relations.Add(tmpRe1); + } + } + + // 取出Recipe + if (GetRecipe && !string.IsNullOrEmpty(strRecipe)) + { + strRecipe = Strings.Mid(strRecipe, 2); // 去除第一個逗號 + // 取出RecipeDetail(因RecipeVersion要做為Key,故將Number轉為字串) + if (strDataBaseType != "oracle") + { + // strRecipe = Replace(strRecipe, "','", "+") + strRecipe = Strings.Replace(strRecipe, "','", ""); + strSQL = "Select RecipeGroup,STR(RecipeVersion, 1) As RecipeVersion,RecipeNo,RecipeValue From tblEQPRecipeDetail " + " Where (RecipeGroup+Str(RecipeVersion,1)) In (" + strRecipe + ")"; + } + else + { + strSQL = "Select RecipeGroup,Substr(RecipeVersion,1) As RecipeVersion,RecipeNo,RecipeValue From tblEQPRecipeDetail " + " Where (RecipeGroup,RecipeVersion) In (" + strRecipe + ")"; + } + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + // daTemp.SelectCommand = cmmTemp + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "RecipeDetail", cnnTemp); + + + if (dsTemp.Tables["RecipeDetail"].Rows.Count == 0) + { + dsTemp.Tables.Remove("RecipeDetail"); + } + else + { + // 建立Relation + var parentColFI = new DataColumn[2]; + var childColFI = new DataColumn[2]; + + parentColFI[0] = dsTemp.Tables["AreaEquipment_A"].Columns["RecipeGroup"]; + childColFI[0] = dsTemp.Tables["RecipeDetail"].Columns["RecipeGroup"]; + parentColFI[1] = dsTemp.Tables["AreaEquipment_A"].Columns["RecipeVersion"]; + childColFI[1] = dsTemp.Tables["RecipeDetail"].Columns["RecipeVersion"]; + + // 建立主從關係(RelationName會影響WinForm資料的顯示) + DataRelation tmpRe1; + tmpRe1 = new DataRelation("Recipe", parentColFI, childColFI, false); + dsTemp.Relations.Add(tmpRe1); + } + } + } + + // 2012/12/26 YF, 檢查產品所設定的設備能力 + var tmp = dsTemp.Tables; + var argdtEquipment = tmp["AreaEquipment_A"]; + using (var objLot = new clsLot()) + { + objLot.funCheckEquipmentCapability(ref cnnTemp, ref argdtEquipment, strReferenceNo, strReferenceVersion, strOPNo); + } + + + // 2012/12/26 YF, 檢查產品所設定的禁用設備 + var tmp1 = dsTemp.Tables; + var argdtEquipment1 = tmp1["AreaEquipment_A"]; + using (var objLot = new clsLot()) + { + objLot.funCheckEquipmentConstraint(ref cnnTemp, ref argdtEquipment1, strReferenceNo, strReferenceVersion, strOPNo); + } + // 現行製程模組不支持設備禁用設定,因此判斷設備禁用的設定應再統一查詢產品資料中的 禁用設備的設定 + if (intOPReference == 1) + { + var tmp2 = dsTemp.Tables; + var argdtEquipment2 = tmp2["AreaEquipment_A"]; + using (var objLot = new clsLot()) + { + objLot.funCheckEquipmentConstraint(ref cnnTemp, ref argdtEquipment2, strProductNo, strProductVersion, strOPNo); + } + } + + if (MultiQCList == true) + { + // 2021/3/18,Ning,QCListNo:列出所有設定為CheckIn的點檢表編號, 若有多筆, 則以逗號串起 + var tmp3 = dsTemp.Tables; + var argdtEquipment3 = tmp3["AreaEquipment_A"]; + using (var objLot = new clsLot()) + { + objLot.funFillEquipmentQCListNo(ref cnnTemp, ref argdtEquipment3); + } + } + + // Return + ShowAvailableEquipment_AllRet = dsTemp; + } + + catch (Exception e1) + { + ShowAvailableEquipment_AllRet = null; + throw; + } + + finally + { + CloseConnection(cnnTemp); + + if (dsTemp != null) + dsTemp.Dispose(); + + } + return ShowAvailableEquipment_AllRet; + + } + + #endregion + + + #region "LotMessage批次信息查询接口" + /// + /// 批次信息查询接口:根据PanelSN查LotNo,再查询批次相关的客户、产品、工艺、当前工序信息 + /// + public static bool funLotMessage(ref List aryMessage, ref List aryException, string PanelSN, string EQPID, + ref string strLOTNO, ref string strPROCESSNO, ref string strOPNO, ref string strPRODUCTNO, ref string strCUSTOMERNO) + { + bool funLotMessage = default(bool); + string strSQL = default(string); + IDbConnection cnnTemp = null; + DbDataReader drTemp = null; + + AppSettings objSetting = new AppSettings(); + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + string strLotNo = ""; + + try + { + // ============================ + // 1. 根据PanelSN(作为ProductID)查询LotNo + // ============================ + strSQL = "SELECT LOTNO FROM TBLWIPPRDSTATE_LQ WHERE PRODUCTID = '" + PanelSN + "' AND STATE = '1'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%PanelSN(" + PanelSN + ")未找到对应批次!%]"); + return false; + } + strLotNo = drTemp["LOTNO"].ToString(); + strLOTNO = strLotNo; + drTemp.Close(); + + // ============================ + // 2. 查询批次信息:产品、客户、流程编号、当前工序 + // TBLWIPLOTBASIS: PRODUCTNO, CUSTOMERNO + // TBLWIPLOTSTATE: PROCESSNO (流程编号), OPNO (当前工序) + // ============================ + strSQL = "SELECT A.PRODUCTNO, A.CUSTOMERNO, B.PROCESSNO, B.OPNO " + + "FROM TBLWIPLOTBASIS A " + + "LEFT JOIN TBLWIPLOTSTATE B ON A.BASELOTNO = B.LOTNO " + + "WHERE A.BASELOTNO = '" + strLotNo + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strPRODUCTNO = drTemp["PRODUCTNO"].ToString(); + strCUSTOMERNO = drTemp["CUSTOMERNO"].ToString(); + strPROCESSNO = drTemp["PROCESSNO"].ToString(); + strOPNO = drTemp["OPNO"].ToString(); + } + else + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%批次(" + strLotNo + ")未找到批次基础信息!%]"); + return false; + } + drTemp.Close(); + + funLotMessage = true; + exitfun: + ; + } + catch (Exception ex) + { + string errorMsg = clsERP.GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + drTemp?.Close(); + CloseConnection(cnnTemp); + } + return funLotMessage; + } + #endregion + + + #region "MACBLUE MAC&蓝牙地址生成接口" + /// + /// MAC&蓝牙地址生成:根据UnitId查批次→产品→序号规则,按规则生成MAC和蓝牙地址 + /// + public static string funMACBLUE(string request) + { + string strResult = ""; + IDbConnection cnnTemp = null; + DbDataReader drTemp = null; + + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + string strUnitId = ""; + string strLotNo = ""; + string strProductNo = ""; + string strMACRuleNo = ""; + string strBlueToothRuleNo = ""; + string strGeneratedMACID = ""; + string strGeneratedBlueToothID = ""; + + MACBLUEResponse response = new MACBLUEResponse(); + + try + { + var Parameters = JsonConvert.DeserializeObject>(request); + strUnitId = Parameters.ContainsKey("unitid") ? Parameters["unitid"] : ""; + if (string.IsNullOrEmpty(strUnitId)) + throw new Exception("[%unitid不能为空!%]"); + + // 1. 根据unitid查LotNo + string strSQL = "SELECT LOTNO FROM TBLWIPPRDSTATE_LQ WHERE PRODUCTID = '" + strUnitId + "' AND STATE = '1' AND PRODUCTTYPE = '1'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + throw new Exception("[%未找到UnitId(" + strUnitId + ")对应的批次!%]"); + strLotNo = drTemp["LOTNO"].ToString(); + drTemp.Close(); + + // 2. 根据LotNo查ProductNo + strSQL = "SELECT PRODUCTNO FROM TBLWIPLOTBASIS WHERE BASELOTNO = '" + strLotNo + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + throw new Exception("[%未找到批次(" + strLotNo + ")对应的产品!%]"); + strProductNo = drTemp["PRODUCTNO"].ToString(); + drTemp.Close(); + + // 3. 查产品对应的MAC和蓝牙序号规则编号 + strSQL = "SELECT MACID, BLUETOOTH FROM TBLPRDPRODUCTBASIS WHERE PRODUCTNO = '" + strProductNo + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + throw new Exception("[%未找到产品(" + strProductNo + ")的MAC/蓝牙规则!%]"); + strMACRuleNo = drTemp["MACID"].ToString(); + strBlueToothRuleNo = drTemp["BLUETOOTH"].ToString(); + drTemp.Close(); + + // 4. 生成MAC序号 + if (!string.IsNullOrEmpty(strMACRuleNo)) + strGeneratedMACID = funGenerateSerialWithRange(cnnTemp, strMACRuleNo, strUnitId, "MAC"); + else + strGeneratedMACID = ""; + + // 5. 生成蓝牙序号 + if (!string.IsNullOrEmpty(strBlueToothRuleNo)) + strGeneratedBlueToothID = funGenerateSerialWithRange(cnnTemp, strBlueToothRuleNo, strUnitId, "BLUETOOTH"); + else + strGeneratedBlueToothID = ""; + + // 6. 存表:更新 TBLWIPPRDSTATE_LQ & TBLWIPPRDLOG_LQ + if (!string.IsNullOrEmpty(strGeneratedMACID) || !string.IsNullOrEmpty(strGeneratedBlueToothID)) + { + strSQL = "UPDATE TBLWIPPRDSTATE_LQ SET MACID = '" + strGeneratedMACID + "', BLUETOOTHID = '" + strGeneratedBlueToothID + "' WHERE PRODUCTID = '" + strUnitId + "' AND STATE = '1'"; + ExecuteSQLNoneQuery(strDataBaseType, strConnectionString, ref strSQL); + + strSQL = "INSERT INTO TBLWIPPRDLOG_LQ (LOTNO, PRODUCTID, EQPID, OPNO, CARRIERID, PRODUCTTYPE, CREATEDATE, MACID, BLUETOOTHID) " + + "SELECT LOTNO, PRODUCTID, EQPID, OPNO, CARRIERID, PRODUCTTYPE, CREATEDATE, MACID, BLUETOOTHID " + + "FROM TBLWIPPRDSTATE_LQ WHERE PRODUCTID = '" + strUnitId + "' AND STATE = '1'"; + ExecuteSQLNoneQuery(strDataBaseType, strConnectionString, ref strSQL); + } + + response.code = "0000"; + response.message = "MACBLUE successfully"; + response.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + response.data = new MACBLUEResponseData { macid = strGeneratedMACID, bluetooth = strGeneratedBlueToothID }; + } + catch (iMESException.MESException ex) + { + response.code = "1111"; + response.message = "MACBLUE :" + ex.Message; + } + catch (Exception ex) + { + response.code = "1111"; + response.message = "MACBLUE :" + ex.Message; + } + finally + { + drTemp?.Close(); + CloseConnection(cnnTemp); + } + strResult = JsonConvert.SerializeObject(response); + return strResult; + } + + /// + /// 根据序号规则编号生成带起始/结束值约束的完整序号(含前缀+流水号) + /// + private static string funGenerateSerialWithRange(IDbConnection cnnTemp, string SerialTypeNo, string UnitId, string SerialType) + { + string strSQL = ""; + DbDataReader drTemp = null; + DataSet dsTemp = new DataSet(); + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + + // 检查 UnitId 是否已有对应的值 + string checkField = SerialType == "MAC" ? "MACID" : "BLUETOOTHID"; + string strExistSQL = "SELECT " + checkField + " FROM TBLWIPPRDSTATE_LQ WHERE PRODUCTID = '" + UnitId + "' AND STATE = '1'"; + drTemp = ExecuteSQLQuery_Reader(strExistSQL, cnnTemp); + if (drTemp.Read()) + { + string existVal = drTemp[0] is DBNull ? "" : drTemp[0].ToString(); + drTemp.Close(); + if (!string.IsNullOrEmpty(existVal)) + return existVal; + } + drTemp.Close(); + + // 读取序号规则 Basis(检查启用) + strSQL = "SELECT * FROM TBLSYSSERIALRULEBASIS WHERE SERIALTYPENO = '" + SerialTypeNo + "' AND ENABLE = 1"; + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "SerialRuleBasis", cnnTemp); + if (dsTemp.Tables["SerialRuleBasis"].Rows.Count == 0) + throw new Exception("[%序号规则(" + SerialTypeNo + ")不存在或未启用!%]"); + + // 读取序号规则所有明细则(含前缀 UD 和流水号 SN) + strSQL = "SELECT * FROM TBLSYSSERIALRULEDETAIL WHERE SERIALTYPENO = '" + SerialTypeNo + "' ORDER BY ITEMNO"; + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "RuleDetail", cnnTemp); + if (dsTemp.Tables["RuleDetail"].Rows.Count == 0) + throw new Exception("[%序号规则(" + SerialTypeNo + ")未配置明细!%]"); + + int intSerLen = 0; + int intDecimalType = 1; + int intPadLeft = 1; + int intSNIndex = -1; + string strStartNum = ""; + string strEndNum = ""; + + // 添加 Value 列,并处理每个明细项 + dsTemp.Tables["RuleDetail"].Columns.Add("Value"); + for (int i = 0; i < dsTemp.Tables["RuleDetail"].Rows.Count; i++) + { + string sourceType = dsTemp.Tables["RuleDetail"].Rows[i]["SOURCETYPE"].ToString(); + switch (sourceType) + { + case "SN": + intSerLen = Convert.ToInt32(dsTemp.Tables["RuleDetail"].Rows[i]["SERIALLENGTH"]); + intDecimalType = Convert.ToInt32(dsTemp.Tables["RuleDetail"].Rows[i]["DECIMALTYPE"]); + intPadLeft = 1; + if (dsTemp.Tables["RuleDetail"].Columns.Contains("PADLEFT")) + intPadLeft = Convert.ToInt32(dsTemp.Tables["RuleDetail"].Rows[i]["PADLEFT"]); + intSNIndex = i; + + // 读取 STARTNUM / ENDNUM + if (dsTemp.Tables["RuleDetail"].Columns.Contains("STARTNUM") && dsTemp.Tables["RuleDetail"].Rows[i]["STARTNUM"] != DBNull.Value) + strStartNum = dsTemp.Tables["RuleDetail"].Rows[i]["STARTNUM"].ToString(); + if (dsTemp.Tables["RuleDetail"].Columns.Contains("ENDNUM") && dsTemp.Tables["RuleDetail"].Rows[i]["ENDNUM"] != DBNull.Value) + strEndNum = dsTemp.Tables["RuleDetail"].Rows[i]["ENDNUM"].ToString(); + break; + + case "UD": + dsTemp.Tables["RuleDetail"].Rows[i]["Value"] = dsTemp.Tables["RuleDetail"].Rows[i]["USERDEFINE"].ToString(); + break; + + default: + dsTemp.Tables["RuleDetail"].Rows[i]["Value"] = dsTemp.Tables["RuleDetail"].Rows[i]["USERDEFINE"].ToString(); + break; + } + } + + if (intSNIndex < 0) + throw new Exception("[%序号规则(" + SerialTypeNo + ")未配置流水号!%]"); + + // 转换 STARTNUM/ENDNUM 为十进制 + long lngStartNum = 0; + long lngEndNum = long.MaxValue; + if (!string.IsNullOrEmpty(strStartNum)) + lngStartNum = funBaseToDecimal(strStartNum, intDecimalType); + if (!string.IsNullOrEmpty(strEndNum)) + lngEndNum = funBaseToDecimal(strEndNum, intDecimalType); + + // 读取当前最大序号 + strSQL = "SELECT MAXSERIALNO FROM TBLSYSSERIALCREATEMAX WHERE SERIALTYPE = '" + SerialType + "' AND SERIALSTRING = '" + SerialTypeNo + "' AND SERIALLENGTH = " + intSerLen + " AND DECIMALTYPE = " + intDecimalType; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + long lngMaxSerialNo; + bool blnInsert; + if (drTemp.Read()) + { + blnInsert = false; + lngMaxSerialNo = Convert.ToInt64(drTemp["MAXSERIALNO"]); + } + else + { + blnInsert = true; + lngMaxSerialNo = 0; + } + drTemp.Close(); + + // 起始值约束 + if (!string.IsNullOrEmpty(strStartNum) && lngMaxSerialNo < lngStartNum) + lngMaxSerialNo = lngStartNum - 1; + + long lngNewSerialNo = lngMaxSerialNo + 1; + + // 结束值检查 + if (!string.IsNullOrEmpty(strEndNum) && lngNewSerialNo > lngEndNum) + throw new Exception("[%" + SerialType + "序号已达到最大值(" + strEndNum + "),无法继续生成!%]"); + + // 生成流水号字符串 + string strNewSerial = funDecimalToBase(lngNewSerialNo, intDecimalType); + if (intPadLeft == 1) + strNewSerial = strNewSerial.PadLeft(intSerLen, '0'); + + // 长度检查 + if (strNewSerial.Length > intSerLen) + throw new Exception("[%" + SerialType + "序号超出长度限制(" + intSerLen + "): " + strNewSerial + "%]"); + + // 组装完整序号(前缀 + 流水号) + string strFullSerial = ""; + for (int j = 0; j < dsTemp.Tables["RuleDetail"].Rows.Count; j++) + { + if (j == intSNIndex) + strFullSerial += strNewSerial; + else + strFullSerial += dsTemp.Tables["RuleDetail"].Rows[j]["Value"].ToString(); + } + + // 重复检查:在 TBLWIPPRDSTATE_LQ 中查找完整序号 + int retryCount = 0; + int maxRetry = 100; + while (retryCount < maxRetry) + { + strSQL = "SELECT 1 FROM TBLWIPPRDSTATE_LQ WHERE " + checkField + " = '" + strFullSerial + "' AND PRODUCTID <> '" + UnitId + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + drTemp.Close(); + break; + } + drTemp.Close(); + retryCount++; + lngNewSerialNo++; + if (!string.IsNullOrEmpty(strEndNum) && lngNewSerialNo > lngEndNum) + throw new Exception("[%" + SerialType + "序号已达到最大值(" + strEndNum + "),无法继续生成!%]"); + strNewSerial = funDecimalToBase(lngNewSerialNo, intDecimalType); + if (intPadLeft == 1) + strNewSerial = strNewSerial.PadLeft(intSerLen, '0'); + if (strNewSerial.Length > intSerLen) + throw new Exception("[%" + SerialType + "序号超出长度限制(" + intSerLen + "): " + strNewSerial + "%]"); + // 重新组装完整序号 + strFullSerial = ""; + for (int j = 0; j < dsTemp.Tables["RuleDetail"].Rows.Count; j++) + { + if (j == intSNIndex) + strFullSerial += strNewSerial; + else + strFullSerial += dsTemp.Tables["RuleDetail"].Rows[j]["Value"].ToString(); + } + } + if (retryCount >= maxRetry) + throw new Exception("[%生成" + SerialType + "序号失败:重试次数过多!%]"); + + // 更新 TBLSYSSERIALCREATEMAX + if (blnInsert) + { + strSQL = "INSERT INTO TBLSYSSERIALCREATEMAX (SERIALTYPE, SERIALSTRING, SERIALLENGTH, DECIMALTYPE, MAXSERIALNO) " + + "VALUES ('" + SerialType + "', '" + SerialTypeNo + "', " + intSerLen + ", " + intDecimalType + ", " + lngNewSerialNo + ")"; + } + else + { + strSQL = "UPDATE TBLSYSSERIALCREATEMAX SET MAXSERIALNO = " + lngNewSerialNo + + " WHERE SERIALTYPE = '" + SerialType + "' AND SERIALSTRING = '" + SerialTypeNo + "'" + + " AND SERIALLENGTH = " + intSerLen + " AND DECIMALTYPE = " + intDecimalType + + " AND MAXSERIALNO = " + lngMaxSerialNo; + } + ExecuteSQLNoneQuery(strDataBaseType, strConnectionString, ref strSQL); + + return strFullSerial; + } + + /// + /// 将指定进制字符串转10进制 + /// + private static long funBaseToDecimal(string strValue, int decimalType) + { + strValue = strValue.Trim().ToUpper(); + long result = 0; + int baseVal = decimalType == 1 ? 10 : decimalType == 2 ? 16 : decimalType == 4 ? 34 : 36; + + foreach (char c in strValue) + { + int digit; + if (c >= '0' && c <= '9') + digit = c - '0'; + else + { + digit = c - 'A' + 10; + if (decimalType == 4) + { + if (c >= 'J') digit--; + if (c >= 'P') digit--; + } + } + result = result * baseVal + digit; + } + return result; + } + + /// + /// 将10进制转指定进制字符串 + /// + private static string funDecimalToBase(long value, int decimalType) + { + if (value == 0) return "0"; + string chars; + int baseVal; + if (decimalType == 1) { baseVal = 10; chars = "0123456789"; } + else if (decimalType == 2) { baseVal = 16; chars = "0123456789ABCDEF"; } + else if (decimalType == 4) { baseVal = 34; chars = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ"; } + else { baseVal = 36; chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; } + + string result = ""; + while (value > 0) + { + result = chars[(int)(value % baseVal)] + result; + value /= baseVal; + } + return result; + } + #endregion + + + #region "自动进出站,搬迁标准进出站" + + // 0102096: [6.0.5] EAP自動報工架構_SDD210906_05-01/ Execute_CI_LOT + public static object AutoexecutionLot_Lot(ref bool blnEXETriggerOP, Dictionary dicPars, Dictionary dicPars_DataTable, string FunctionID, DateTime ArriveTime, string UserNo, string ComputerName, bool blnRuleCheck = true) + { + object AutoexecutionLot_LotRet = default(object); + var dtLotState = new DataTable(); // Load Afer TriggerOP + var objLot = new kcWIP.clsLot(); + var objSYS = new clsSYSUserLog(); + var objWIP = new kcWIP.clsWIP(); + var objUSR = new iMESUserManager.clsUSRSecurity(); + //var objclsWIP = new clsWIP(); + var objEMS = new kcEMS.clsEMSEquipment(); + var objReverse = new udReverse.clsReverse(); + DataRow drAdd; + IDbConnection cnnTemp = null; + var drTemp = default(DbDataReader); + //OleDbCommand cmmTemp; + AppSettings objSetting = new AppSettings(); + + string strException; + string strResult; + int PhaseNo; + string AreaNo = defString; + string OPNo = defString; + string PSNo = defString; + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); // Create connection + + string strServiceName = "ExecuteLot"; + + + var dtLotNo = new DataTable(); + dtLotNo.Columns.Add("LotNo", System.Type.GetType("System.String")); + var drLotAdd = dtLotNo.NewRow(); + drLotAdd["LotNo"] = dicPars["lotno"]; + dtLotNo.Rows.Add(drLotAdd); + string LotNo = dtLotNo.Rows[0]["LotNo"].ToString(); + + string InXML = ""; + string OutXML = ""; + + string strRetrunMsg = ""; + + var dtChkRuleLot2 = new DataTable("ChkRuleLot"); // minya 20200315 + string strEquipmentNo = defString; + string strERFMsg = ""; + try + { + + // 1.依InXml資料與Lot目前狀態比對是否符合 + DataRow drLotState = null; + var strKernelModule = default(string); + var strKernelFunctionName = default(string); + + // 檢查USER過帐权限 + DataRow drUser; + if (!string.IsNullOrEmpty(UserNo)) + { + drUser = objUSR.GetUserSecurity(UserNo, 2); + if (string.IsNullOrEmpty(drUser["UserNo"].ToString())) + { + UserNo = "EAP_AGENT"; + drUser = objUSR.GetUserSecurity(UserNo, 2); + if (string.IsNullOrEmpty(drUser["UserNo"].ToString())) + { + throw new iMESException.MESException("0000-200015", "[%Please provide curuser or set EAP_Agent correct, then execute Lot%] !"); + } + } + } + else + { + UserNo = "EAP_AGENT"; + drUser = objUSR.GetUserSecurity(UserNo, 2); + if (string.IsNullOrEmpty(drUser["UserNo"].ToString())) + { + throw new iMESException.MESException("0000-200015", "[%Please provide curuser or set EAP_Agent correct, then execute Lot%] !"); + } + } + + if (!dicPars.ContainsKey("equipmentno")) + { + throw new iMESException.MESException("0000-200002", "[%EquipmentNo%] [%NOT FOUND%]"); + } + else + { + strEquipmentNo = dicPars["equipmentno"]; + } + + // 2.取得生產批現況資訊 + string refBRNO = defString; + string refBRExecutionFile = defString; + + string strLots = "("; + foreach (DataRow drTempLotNo in dtLotNo.Rows) + strLots += "'" + drTempLotNo["LotNo"].ToString() + "',"; + strLots = strLots.TrimEnd(','); + strLots += ")"; + + if (funLoadLotStatusJoinOPBusinessRule(strLots, ref dtLotNo) < 0) + { + throw new iMESException.MESException("0000-200091", "[%funLoadLotStatusJoinOPBusinessRule fail%]!"); + } + if (!(dtLotNo == null) && dtLotNo.Rows.Count > 0) // 取出區域與作業站 + { + OPNo = dtLotNo.Rows[0]["OPNo"].ToString(); + AreaNo = dtLotNo.Rows[0]["AreaNo"].ToString(); + PSNo = dtLotNo.Rows[0]["PSNo"].ToString(); + } + + // 檢查User是否有此OP的權限------------------------------------------------------------------------------------------------ + // Gary Lu 20121114:這個作業站不在群組內才要進行權限檢查 + if (objUSR.ChkUserOPPriv(UserNo, OPNo) == false) + { + throw new iMESException.MESException("0000-202015", "[%UserNo%]:" + UserNo + "[%NOTHINGSTATE%][%OPPRIVILEGE%], [%OPNo%]:" + OPNo); + } + + // 檢查User是否有產品區段設定權限------------------------------------------------------------------------------------------------ + if (objUSR.ChkUserPSPriv(UserNo, PSNo) == false) + { + throw new iMESException.MESException("0000-200062", "[%EmployeeNo%]:" + UserNo + "[%has no PS Privilege%], [%PSNo%]:" + PSNo); + } + + objUSR = null; + + // 6.取得班別 + string ShiftNo = "N/A"; + using (var obj = new clsUSRDepartment()) + { + ShiftNo = obj.GetShift(UserNo); + } + + + // 0 : Sucess + // -1 : Program Error + // -2 : LotInfo Error + // -3 : Each Lot Has Different BR + // -4 : RefLotNo Didn't Setting KERNELMODULE(tblOPBusinessRuleBasis) + // -5 : RefLotNo Didn't Setting KERNELFUNCTIONNAME(tblOPBusinessRuleBasis) + // -6 : LotStatus Error + switch (ChkLotStateAndBRNo(strLots, FunctionID, OPNo)) + { + case -1: + { + throw new iMESException.MESException("0000-200091", "[%ChkLotStateAndBRNo fail%]!"); + } + case -2: + { + throw new iMESException.MESException("0000-200091", "[%LotNo And OPNo fail!%]"); + } + case -3: + { + throw new iMESException.MESException("0000-200091", "[%Each Lot Has Different BR%]"); + } + case -4: + { + throw new iMESException.MESException("0000-200091", "[%RefLotNo%] " + LotNo + "; [%Not Setting KERNELMODULE(tblOPBusinessRuleBasis)%]"); + } + case -5: + { + throw new iMESException.MESException("0000-200091", "[%RefLotNo%] " + LotNo + "; [%Not Setting KERNELFUNCTIONNAME(tblOPBusinessRuleBasis)%]"); + } + case -6: + { + throw new iMESException.MESException("0000-200091", "[%LotStatus Error%]"); + } + } + + foreach (DataRow drTempLotNo in dtLotNo.Rows) + { + if (dtLotNo.Rows.IndexOf(drTempLotNo) == 0) + { + refBRNO = drTempLotNo["BRNO"].ToString(); + refBRExecutionFile = drTempLotNo["EXECUTIONFILE"].ToString(); + } + else if (drTempLotNo["BRNO"].ToString() != refBRNO) + { + // LotBR 與首批不一致 + throw new iMESException.MESException("0000-200091", "[%LotNo%]:" + drTempLotNo["LotNo"].ToString() + " [%BR%] [%Is Not THE SAME%]"); + } + + funCheckStateByLot(ref strKernelModule, ref strKernelFunctionName, drTempLotNo["LotNo"].ToString(), drTempLotNo, FunctionID, OPNo); + } + + if (FunctionID == "CO") + { + if (refBRExecutionFile.ToUpper() != "BR_L_CO_GEN_M.DLL" && refBRExecutionFile.ToUpper() != "BR_L_CO_GEN.DLL") + { + //0156845: [6.0.7]调整EAP接口查核支援BR逻辑,增加查核brno + if (!ExeBrnoIfSupport(refBRExecutionFile.ToUpper(), refBRNO)) + { + throw new iMESException.MESException("0000-200091", "[%Only Support L_CO_GEN Now%] [%NOWUSE%]:" + refBRNO + ""); + } + + } + } + else if (refBRExecutionFile.ToUpper() != "BR_L_CI_GEN.DLL") + { + //0156845: [6.0.7]调整EAP接口查核支援BR逻辑,增加查核brno + if (!ExeBrnoIfSupport(refBRExecutionFile.ToUpper(), refBRNO)) + { + throw new iMESException.MESException("0000-200091", "[%Only Support L_CI_GEN Now%] [%NOWUSE%]:" + refBRNO + ""); + } + } + + // 3.Execution Trigger OP + if (!dtLotNo.Columns.Contains("blnEXETriggerOP")) + { + using (var dcTemp = new DataColumn()) + { + dcTemp.ColumnName = "blnEXETriggerOP"; + dcTemp.DataType = Type.GetType("System.Boolean"); + dcTemp.DefaultValue = false; + dtLotNo.Columns.Add(dcTemp); + } + } + + foreach (DataRow drTempLot in dtLotNo.Rows) + { + // If drTempLot("Status") = 0 Then + string DescriptionTmp = defString; + long NewLotStampTmp = defInteger; + switch (objLot.TriggerOP(ref DescriptionTmp, ref NewLotStampTmp, Convert.ToString(drTempLot["LotNo"]), UserNo: UserNo)) + { + + case "hold_exceedtime": + { + tcEAI.clsWIP.BRERFCreateExecute(pUserId: UserNo, pLotNo: Convert.ToString(drTempLot["LotNo"]), pERFType: 1, pHoldTime: 0, pRuleNo: "EXCEEDTIME"); + throw new iMESException.MESException("0000-200091", "LotNO:" + + drTempLot["LotNo"] + "[%VIOLATE TIME CONTROL,CREATE ERF%]!"); + } + case "futurehold": + { + tcEAI.clsWIP.BRERFCreateExecute(pUserId: UserNo, pLotNo: Convert.ToString(drTempLot["LotNo"]), pERFType: 3, pHoldTime: 0); + throw new iMESException.MESException("0000-200091", "LotNO:" + + drTempLot["LotNo"] + "[%FUTUREHOLD SET,CREATE ERF%]!"); + } + case "futurewait": + { + throw new iMESException.MESException("0000-200091", "LotNO:" + drTempLot["LotNo"] + "[%FUTUREWAIT%]!"); + } + case "futureos": + { + throw new iMESException.MESException("0000-200091", "LotNO:" + drTempLot["LotNo"] + "[%FUTURE OS%]!"); + } + + default: + { + // 2020/03/11 Shih Kai, 68676 :自动进出站BR检核-TriggerOP後增加補做TriggerPhase + // Trigger Phase + drLotState = objLot.GetLotBasisJoinState(LotNo: drTempLot["LotNo"].ToString()); // 取得最新的LotState + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drLotState["OPReference"], 0, false))) // by Product + { + PhaseNo = objLot.GetBusinessRulePhase(drLotState["ProductNo"].ToString(), drLotState["ProductVersion"].ToString(), drLotState["OPNo"].ToString(), drLotState["BRNo"].ToString()); + } + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drLotState["OPReference"], 1, false))) // by Module + { + PhaseNo = objLot.GetBusinessRulePhase(drLotState["ModuleNo"].ToString(), drLotState["ModuleVersion"].ToString(), drLotState["OPNo"].ToString(), drLotState["BRNo"].ToString()); + } + else + { + throw new iMESException.MESException("0000-200015", "LotNo:" + + drTempLot["LotNo"] + ",[%OPREFERENCE ERROR%]!"); + } + + // 剛做完TriggerOP,不用再執行Attrib的變更 + objLot.TriggerPhase_LotState(Convert.ToString(drTempLot["LotNo"]), PhaseNo, UserNo); + + drTempLot["blnEXETriggerOP"] = true; + break; + } + } + } + + + var drLotRow = objLot.GetLotBasisJoinState(LotNo: LotNo); // 取得最新的LotState + + string strLotStamp = drLotRow["LotStamp"].ToString(); + string strLotSerial = drLotRow["LotSerial"].ToString(); + string strLogGroupSerial = drLotRow["LogGroupSerial"].ToString(); + int intPhaseNo = Conversions.ToInteger(drLotRow["PhaseNo"]); + + blnEXETriggerOP = true; + + // 4.ReLoad Lotstate Afer Trigger OP In dtLotState + funLoadLotStatusJoinOPBusinessRule(strLots, ref dtLotState); + + + // 20200309 Edison Mantis : 68289: [SEMI WAFER]通用性CI/CO BR檢核 + // 區域設備檢核 Key in Lot Attrib檢核 Component Attrib檢核, Check Control Rule + // =============================================== 68289 Start =============================================== + + // 5.Xml轉Table + + DataTable dtLotList = new DataTable(), dtLotAttrib = new DataTable(), dtLotError = new DataTable(), dtLotComponent = new DataTable(), dtLotCompAttrib = new DataTable(), dtEquipment = new DataTable(), dtTempAttrib = new DataTable(), dtComponentError = new DataTable(); + DataTable dtAccessory = null; + + // 將批號加入資料表以便檢查設備 + dtLotList.Columns.Add("LotNo"); + DataRow drLotNo; + drLotNo = dtLotList.NewRow(); + drLotNo["LotNo"] = LotNo; + dtLotList.Rows.Add(drLotNo); + + if (dicPars_DataTable.Keys.Contains("lotattrib")) + { + dtLotAttrib = dicPars_DataTable["lotattrib"]; + } + if (dicPars_DataTable.Keys.Contains("loterror")) + { + dtLotError = dicPars_DataTable["loterror"]; + } + if (dicPars_DataTable.Keys.Contains("lotcompoment")) + { + dtLotComponent = dicPars_DataTable["lotcompoment"]; + } + if (dicPars_DataTable.Keys.Contains("lotcomponentattrib")) + { + dtLotCompAttrib = dicPars_DataTable["lotcomponentattrib"]; + } + if (dicPars_DataTable.Keys.Contains("equipment")) + { + dtEquipment = dicPars_DataTable["equipment"]; + } + else + { + dtEquipment.Columns.Add("EquipmentNo"); + DataRow drEQP; + drEQP = dtEquipment.NewRow(); + drEQP["EquipmentNo"] = strEquipmentNo; + dtEquipment.Rows.Add(drEQP); + } + if (dicPars_DataTable.Keys.Contains("tempattrib")) + { + dtTempAttrib = dicPars_DataTable["tempattrib"]; + } + if (dicPars_DataTable.Keys.Contains("componenterror")) + { + dtComponentError = dicPars_DataTable["componenterror"]; + } + if (dicPars_DataTable.Keys.Contains("accessorylist")) + { + dtAccessory = dicPars_DataTable["accessorylist"]; + } + + if (dtAccessory == null) + { + dtAccessory = objEMS.LoadEQPACCStateJoinAccState_EAP(EquipmentNo: strEquipmentNo); + } + + string strCANodeName, strComponentNodeName; + string strLinkName = "PASS"; + string strMailGroupNo = ""; + string strMsg = ""; + string strRuleNo = defString; + int intERFType = 0; + DataTable dtLotRuleData = default(DataTable); + //DataTable dtLotRuleData = default(DataTable), dtCompRuleData = default(DataTable); + + var dtLotAttrib_Temp = new DataTable(); + //dtLotAttrib_Temp.Columns.Add("LotNo", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("AttribNo", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("AttribType", Type.GetType("System.Int32")); + dtLotAttrib_Temp.Columns.Add("AttribSequence", Type.GetType("System.Int32")); + dtLotAttrib_Temp.Columns.Add("AttribSource", Type.GetType("System.Int32")); + dtLotAttrib_Temp.Columns.Add("AttribPhase", Type.GetType("System.Int32")); + dtLotAttrib_Temp.Columns.Add("AttribValue", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("SaveToLotPropertyNo", Type.GetType("System.String")); + // 2021/12/1 缺少QCItemNo,於標準BRcheckin會出錯 + dtLotAttrib_Temp.Columns.Add("TestValue", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("QCItemNo", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("Result", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("Result_INT", Type.GetType("System.Int32")); + dtLotAttrib_Temp.Columns.Add("FactorSerial", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("SerialNo", Type.GetType("System.Int32")); + dtLotAttrib_Temp.Columns.Add("MEMO", Type.GetType("System.String")); + dtLotAttrib_Temp.Columns.Add("ComponentNo", Type.GetType("System.String")); + // SPC + dtLotAttrib_Temp.Columns["TestValue"].Expression = "AttribValue"; + + var dtLotCompAttrib_Temp = new DataTable(); + dtLotCompAttrib_Temp.Columns.Add("LotNo", Type.GetType("System.String")); + dtLotCompAttrib_Temp.Columns.Add("ComponentNo", Type.GetType("System.String")); + dtLotCompAttrib_Temp.Columns.Add("AttribNo", Type.GetType("System.String")); + dtLotCompAttrib_Temp.Columns.Add("AttribValue", Type.GetType("System.String")); + dtLotCompAttrib_Temp.Columns.Add("AttribType", Type.GetType("System.Int32")); + dtLotCompAttrib_Temp.Columns.Add("AttribSequence", Type.GetType("System.Int32")); + dtLotCompAttrib_Temp.Columns.Add("AttribSource", Type.GetType("System.Int32")); + dtLotCompAttrib_Temp.Columns.Add("AttribPhase", Type.GetType("System.Int32")); + dtLotCompAttrib_Temp.Columns.Add("SaveToLotPropertyNo", Type.GetType("System.String")); + + if (blnRuleCheck) + { + + // 預設 + strCANodeName = "componentattrib"; + strComponentNodeName = "component"; + // Call XmlToTable(InXML, dtEquipment, dtLotList, dtLotAttrib, dtLotError, dtLotComponent, dtLotCompAttrib, strLots, LotNo, strCANodeName, strComponentNodeName, refBRNO) 'refBRNO minya 20200312 + + // dtLotAttrib若不包含欄位:LotNo,會出錯誤 + if (!(dtLotAttrib == null)) + { + if (!dtLotAttrib.Columns.Contains("LotNo")) + { + dtLotAttrib.Columns.Add("LotNo"); + if (!(dtLotNo == null) && dtLotNo.Rows.Count > 0) + { + foreach (DataRow dr in dtLotAttrib.Rows) + dr["LotNo"] = dtLotNo.Rows[0]["LotNo"].ToString(); + } + } + } + // 6. 基本檢查 + funBasisCheck(CIorCO: FunctionID, dtLotNo: dtLotNo, dtEquipment: dtEquipment, dtLotList: dtLotList, dtLotAttrib: dtLotAttrib, dtLotError: dtLotError, dtLotComponent: dtLotComponent, dtLotCompAttrib: dtLotCompAttrib, dtTempAttrib: ref dtTempAttrib, strLots: strLots); + + // 7.格式化Rule Check 資料 並進行ChkControlRule---------------------------------------------------------------------------------------------- + string strBatchComponent = ""; + string strAttrib = ""; + string strCAttrib = ""; + string strError = ""; + string strTemp = ""; + + // 7.1 需要判 Rule 的生產批 + var dtChkRuleLot = new DataTable("ChkRuleLot"); + string strRuleLot = ""; + dtChkRuleLot.Columns.Add("LotNo", Type.GetType("System.String")); + + foreach (DataRow rL in dtLotNo.Rows) + { + strRuleLot += CombineXMLValueTag( + CombineXMLValue("lotno", CInput(rL["LotNo"].ToString()))); + dtChkRuleLot.Rows.Add(rL["LotNo"].ToString()); + } + + // 7.2 格式化資料Component + foreach (DataRow rC in dtLotComponent.Rows) + { + strBatchComponent += CombineXMLValueTag( + CombineXMLValue("lotno", CInput(rC["LotNo"].ToString())) + + CombineXMLValue("componentno", CInput(rC["ComponentNo"].ToString()))); + } + + // 7.3 格式化-Key In Attrib + // KeyIn Attrib + //20240102,13871,0155146: [6.0.7]EAP接口Execute_CO_LOT,出站输入特性参数时,EAP和产品作业站输入一致,但是会提示报错 + DataTable attribtemp = null; + using (var obj = new kcWIP.clsLot()) + { + attribtemp = obj.ShowTemp_Attrib(LotNo).Tables[0]; + } + + + if (!(attribtemp == null)) + { + attribtemp.DefaultView.RowFilter = "(AttribPhase = " + intPhaseNo + " or AttribPhase = 99) And AttribSource <> 0"; // CurPhase & All的所有Attrib,除了KeyIn + for (int i = 0; i <= attribtemp.DefaultView.Count - 1; i++) + { + strTemp = CombineXMLValue("lotno", LotNo) + + CombineXMLValue("attribno", CInput(attribtemp.DefaultView[i]["AttribNo"].ToString())) + + CombineXMLValue("attribtype", attribtemp.DefaultView[i]["AttribType"].ToString()) + + CombineXMLValue("attribsequence", attribtemp.DefaultView[i]["AttribSequence"].ToString()) + + CombineXMLValue("attribsource", attribtemp.DefaultView[i]["AttribSource"].ToString()) + + CombineXMLValue("attribphase", attribtemp.DefaultView[i]["AttribPhase"].ToString()) + + CombineXMLValue("savetolotpropertyno", CInput(attribtemp.DefaultView[i]["SaveToLotPropertyNo"].ToString())); + if (attribtemp.DefaultView[i]["AttribValue"] is DBNull) + strTemp += CombineXMLValue("attribvalue", ""); + else + strTemp += CombineXMLValue("attribvalue", CInput(attribtemp.DefaultView[i]["AttribValue"].ToString())); + strAttrib += CombineXMLValueTag(strTemp); + } + //還原顯示 + attribtemp.DefaultView.RowFilter = "AttribSource <> 0 And AttribSource <> 1 And (AttribPhase = " + intPhaseNo + " or AttribPhase = 99)"; // Source = Not KeyIn, Not Calculate ,CurPhase and All + + //Temp:Attrib_KeyIn + for (int i = 0; i <= dtLotAttrib.Rows.Count - 1; i++) + { + if (dtLotAttrib.Rows[i]["AttribValue"] is DBNull) + dtLotAttrib.Rows[i]["AttribValue"] = ""; + + DataRow[] drChk = attribtemp.Select("AttribNo='" + dtLotAttrib.Rows[i]["AttribNo"] + "'"); + if (drChk.Length == 0) + { + throw new iMESException.MESException("0000-203010", "[%AttribNo%]:" + dtLotAttrib.Rows[i]["AttribNo"].ToString()); + } + else + { + strTemp = CombineXMLValue("lotno", LotNo) + + CombineXMLValue("attribno", CInput(dtLotAttrib.Rows[i]["AttribNo"].ToString())) + + CombineXMLValue("attribtype", drChk[0]["AttribType"].ToString()) + + CombineXMLValue("attribsequence", drChk[0]["AttribSequence"].ToString()) + + CombineXMLValue("attribsource", drChk[0]["AttribSource"].ToString()) + + CombineXMLValue("attribphase", drChk[0]["AttribPhase"].ToString()) + + CombineXMLValue("attribvalue", CInput(dtLotAttrib.Rows[i]["AttribValue"].ToString())) + + CombineXMLValue("savetolotpropertyno", CInput(drChk[0]["SaveToLotPropertyNo"].ToString())); + if (drChk[0]["QCItemNo"] is DBNull) + strTemp += CombineXMLValue("qcitemno", ""); + else + strTemp += CombineXMLValue("qcitemno", CInput(drChk[0]["QCItemNo"].ToString())); + strAttrib += CombineXMLValueTag(strTemp); + } + } + } + + // 7.4.格式化 Component Attrib + foreach (DataRow rCA in dtLotCompAttrib.Rows) + { + DataSet dsTemp; + using (var obj = new kcWIP.clsLot()) + { + dsTemp = obj.ShowTemp_ComponentAttrib(LotNo); + } + + for (int x = 0, loopTo1 = dsTemp.Tables[0].Rows.Count - 1; x <= loopTo1; x++) + { + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(rCA["AttribNo"], dsTemp.Tables[0].Rows[x]["AttribNo"], false))) + { + strCAttrib = strCAttrib + CombineXMLValueTag( + CombineXMLValue("lotno", LotNo) + + CombineXMLValue("componentno", CInput(dsTemp.Tables[0].Rows[x]["ComponentNo"].ToString())) + + CombineXMLValue("attribno", CInput(rCA["AttribNo"].ToString())) + + CombineXMLValue("attribtype", dsTemp.Tables[0].Rows[x]["AttribType"].ToString()) + + CombineXMLValue("attribsequence", dsTemp.Tables[0].Rows[x]["AttribSequence"].ToString()) + + CombineXMLValue("attribsource", dsTemp.Tables[0].Rows[x]["AttribSource"].ToString()) + + CombineXMLValue("attribphase", dsTemp.Tables[0].Rows[x]["AttribPhase"].ToString()) + + CombineXMLValue("attribvalue", CInput(rCA["AttribValue"].ToString())) + + CombineXMLValue("savetolotpropertyno", CInput(dsTemp.Tables[0].Rows[x]["SaveToLotPropertyNo"].ToString()))); + + DataRow drTemp_Rows; + drTemp_Rows = dtLotCompAttrib_Temp.NewRow(); + drTemp_Rows["LotNo"] = LotNo; + drTemp_Rows["ComponentNo"] = dsTemp.Tables[0].Rows[x]["ComponentNo"]; + drTemp_Rows["AttribNo"] = rCA["AttribNo"]; + drTemp_Rows["AttribType"] = dsTemp.Tables[0].Rows[x]["AttribType"]; + drTemp_Rows["AttribSequence"] = dsTemp.Tables[0].Rows[x]["AttribSequence"]; + drTemp_Rows["AttribSource"] = dsTemp.Tables[0].Rows[x]["AttribSource"]; + drTemp_Rows["AttribPhase"] = dsTemp.Tables[0].Rows[x]["AttribPhase"]; + drTemp_Rows["AttribValue"] = rCA["AttribValue"].ToString(); + drTemp_Rows["SaveToLotPropertyNo"] = dsTemp.Tables[0].Rows[x]["SaveToLotPropertyNo"]; + dtLotCompAttrib_Temp.Rows.Add(drTemp_Rows); + } + } + } + + // 7.5 格式化不良原因 + foreach (DataRow rE in dtLotError.Rows) + { + strError = strError + CombineXMLValueTag( + CombineXMLValue("lotno", CInput(rE["LotNo"].ToString())) + + CombineXMLValue("componentno", CInput(rE["ComponentNo"].ToString())) + + CombineXMLValue("errorno", CInput(rE["ErrorNo"].ToString())) + + CombineXMLValue("errorqty", rE["ErrorQty"].ToString()) + + CombineXMLValue("errorlevel", rE["ErrorLevel"].ToString())); + } + + // 7.6 Control Rule Check------------------------------------------------------------------------------------------------------------- + DataSet dsTestValue = null; + + //if (ChkControlRule_BatchComponent(dtChkRuleLot, true, UserNo, strRuleLot, strBatchComponent, ref strAttrib, ref strCAttrib, ref strLinkName, ref strMsg, ref strRuleNo, ref intERFType, ref dtLotRuleData, ref dtCompRuleData, ref strMailGroupNo, ref dsTestValue, strError) < 0) + if (tcEAI.clsEAP.ChkControlRule(ref dsTestValue, ref dtChkRuleLot, LotNo, UserNo, Conversions.ToLong(strLotStamp), ref strAttrib, ref strLinkName, ref strMsg, ref strRuleNo, ref intERFType, ref strMailGroupNo, strError) < 0) + + { + throw new iMESException.MESException("0000-200091", "[%LotNo%]:" + LotNo + ",Check Control Rule [%FUNCTION%][%Fail%]."); + } + + // Check SPC Contorl + if (funChkSPCControl_Var(UserNo, LotNo, ref strAttrib, dsTestValue, ref strLinkName, ref intERFType, ref strERFMsg, dtEquipment) < 0) + { + throw new iMESException.MESException("0000-200091", "[%LotNo%]:" + LotNo + ",Check SPC Contorl [%FUNCTION%][%Fail%]."); + } + strERFMsg = tcEAI.clsEAP.TranslateMsg(strERFMsg); + + //strAttrib to dtLotAttrib_Temp + dtLotAttrib_Temp = ConvertXmlToDataTable(dtLotAttrib_Temp, strAttrib); + + // 取得RuleNo + DataRow[] drSelHoldRule; + if (!(dtLotRuleData == null) && dtLotRuleData.Rows.Count > 0) + { + if (strLinkName == "HOLD") + { + drSelHoldRule = dtLotRuleData.Select("Linkname= 'HOLD'"); + if (drSelHoldRule.Length > 0) + { + strRuleNo = drSelHoldRule[0]["RuleNo"].ToString(); + } + } + } + + // 2020/03/12 Lena, 將 InXml 中的 LiknName、Lot Attrib、Component Attrib 置換為 Control Rule Check 後的結果 + string strLinkNameTagName = "linkname".ToLower(); + string strLAttribTagName = "attrib".ToLower(); + string strCAttribTagName = strCANodeName.ToLower(); + + int intStartIndex, intEndIndex; + string strHand, strLast, strChang; + string strInXml = InXML; + DataRow[] drSel; + + // LinkName + if (!string.IsNullOrEmpty(strLinkName)) + { + intStartIndex = Strings.InStr(strInXml, "<" + strLinkNameTagName + ">"); + intEndIndex = Strings.InStr(strInXml, ""); + if (intStartIndex > 0 && intEndIndex > 0) + { + strHand = strInXml.Substring(0, intStartIndex - 1); + strLast = Strings.Mid(strInXml, intEndIndex + strLinkNameTagName.Length + 3); + string argname = "LinkName"; + string argtype = "String"; + string argdesc = ""; + strChang = CombineXMLParameter(strLinkNameTagName, argname, argtype, strLinkName, argdesc); + strInXml = strHand + strChang + strLast; + } + } + + // Lot Attrib + if (!string.IsNullOrEmpty(strAttrib)) + { + intStartIndex = Strings.InStr(strInXml, "<" + strLAttribTagName + ">"); + intEndIndex = Strings.InStr(strInXml, ""); + if (intStartIndex > 0 && intEndIndex > 0) + { + strHand = strInXml.Substring(0, intStartIndex - 1); + strLast = Strings.Mid(strInXml, intEndIndex + strLAttribTagName.Length + 3); // strLAttribTagName.Length + 3 = 的長度 + string argtype1 = "String"; + string argdesc1 = ""; + strChang = CombineXMLParameterMultiValue(strLAttribTagName, strLAttribTagName, argtype1, strAttrib, argdesc1); + strInXml = strHand + strChang + strLast; + } + } + + // Component Attrib + if (!string.IsNullOrEmpty(strCAttrib)) + { + intStartIndex = Strings.InStr(strInXml, "<" + strCAttribTagName + ">"); + intEndIndex = Strings.InStr(strInXml, ""); + if (intStartIndex > 0 && intEndIndex > 0) + { + strHand = strInXml.Substring(0, intStartIndex - 1); + strLast = Strings.Mid(strInXml, intEndIndex + strCAttribTagName.Length + 3); // strCAttribTagName.Length + 3 = 的長度 + string argtype2 = "String"; + string argdesc2 = ""; + strChang = CombineXMLParameterMultiValue(strCAttribTagName, strCAttribTagName, argtype2, strCAttrib, argdesc2); + strInXml = strHand + strChang + strLast; + } + } + + InXML = strInXml; + + dtChkRuleLot2 = dtChkRuleLot.Copy(); + + + } + + // 將LotStamp替換為TriggerOP後的LotStamp + if (blnEXETriggerOP) + { + string strLotStampTagName = "lotstamp".ToLower(); + + int intStartIndex, intEndIndex; + string strHand, strLast, strChang; + string strInXml = InXML; + DataRow[] drSel; + + // 取得LotStamp + intStartIndex = Strings.InStr(strInXml, "<" + strLotStampTagName + ">"); + intEndIndex = Strings.InStr(strInXml, ""); + if (intStartIndex > 0 && intEndIndex > 0) + { + strHand = strInXml.Substring(0, intStartIndex - 1); + strLast = Strings.Mid(strInXml, intEndIndex + strLotStampTagName.Length + 3); + string argname1 = "LotStamp"; + string argtype3 = "Long"; + string argvalue = Conversions.ToInteger(dtLotState.Rows[0]["LotStamp"]).ToString(); + string argdesc3 = ""; + strChang = CombineXMLParameter(strLotStampTagName, argname1, argtype3, argvalue, argdesc3); + strInXml = strHand + strChang + strLast; + InXML = strInXml; + } + } + + string strcheckinresult = ""; // BR_CheckIn回傳success or fail + using (var obj = new kcWIP.clsLot()) + { + if (FunctionID == "CO") + { + // 5.取出GoodQty,GoodUnitNo--------------------------------------------------------------------------------------------------- + DataRow[] drSel; + double GoodQty = 0d; + + drSel = dtLotAttrib_Temp.Select("AttribNo='GoodQty'"); + if (drSel.Length == 0) + { + throw new iMESException.MESException("0000-200001", "[%CheckOut%] [%GoodQty%] [%not found%]"); + } + else + { + GoodQty = Convert.ToDouble(drSel[0]["AttribValue"]); + } + // 進站之前已扣料過。 + strcheckinresult = obj.BR_CheckOut(Conversions.ToLong(strLotStamp), LotNo, strLinkName, dtLotAttrib_Temp, dtEquipment, null, null, (decimal)GoodQty, UserNo); + + strRetrunMsg = strcheckinresult; + // 9.Return Value + if (!string.IsNullOrEmpty(strRetrunMsg)) + { + strResult = "fail"; + throw new iMESException.MESException("0000-200011", "[%LotNo%] : " + LotNo + "[%Execute%] [%Fail%]."); + } + else + { + strException = ""; + strResult = "success"; + } + } + + else + { + strcheckinresult = obj.BR_CheckIn(Conversions.ToLong(strLotStamp), LotNo, strLinkName, dtLotAttrib_Temp, dtEquipment, UserNo, ShiftNo, dtAccessory: dtAccessory); + strRetrunMsg = strcheckinresult; + + // 9.Return Value + if (strRetrunMsg == "success") + { + strException = ""; + strResult = "success"; + } + else + { + strResult = "fail"; + throw new iMESException.MESException("0000-200011", "[%LotNo%] : " + LotNo + "[%Execute%] [%Fail%]."); + } + } + } + + + + objSYS.AddEventLog(strServiceName, UserNo, "LotNo", LotNo, DateTime.Now, "ExecuteLot", ComputerName: ComputerName); + + if (FunctionID == "CO") + { + //开始生产批转移,生产批转移需要走隐藏站规则,因为有客制,所以调用MEStc的功能,防止后续改动导致EAP出错 + BRTransferLot_Bin_M(LotNo, UserNo, strLinkName, intERFType, strRuleNo, ComputerName: ComputerName, RuleMsg: strERFMsg); + } + else + { + // Call BRTransferLot(LotNo, UserNo, strLinkName, 1) + tcEAI.clsEAP.BRTransferLot_Bin(LotNo, UserNo, strLinkName, intERFType, strRuleNo, ComputerName: ComputerName, RuleMsg: strERFMsg); + + } + + + lblExitProcedure: + ; + } + + + catch (iMESException.MESException ex) + { + + if (FunctionID == "CI") + { + if (dtLotNo.Columns.Contains("blnEXETriggerOP")) + { + // CheckIn失敗將狀態變更回Queue + foreach (DataRow drTempLotInfo in dtLotNo.Rows) + { + if (Convert.ToBoolean(drTempLotInfo["blnEXETriggerOP"])) + { + DataRow[] drSel = dtLotState.Select("LotNO='" + drTempLotInfo["LotNo"] + "'".ToString()); + // Call objReverse.ExecuteReverse(drSel(0)("LotNo"), "AutoExe", Now, , , , , drSel(0)("LotStamp")) + // Call objLot.ExeReverseTriggerOP(drSel(0)("LotNo"), drSel(0)("LotSerial"), drSel(0)("LogGroupSerial"), drSel(0)("LotStamp")) + ExeReverseTriggerOP_NotUseUndo(UserNo, Convert.ToString(drSel[0]["LotNo"]), Convert.ToString(drSel[0]["LotSerial"]), Conversions.ToInteger(drSel[0]["LotStamp"]), ComputerName); + } + } + } + } + + strResult = "fail"; + strRetrunMsg = ex.Message; + + objSYS.AddErrorLog_ErrorCode(strServiceName, UserNo, "LotNo", LotNo, DateTime.Now, ex.Message + " : " + ex.StackTrace, ComputerName: ComputerName, ErrorCode: Convert.ToString(ex.ErrorCode)); + + throw ex; + } + + catch (Exception ex) + { + + if (FunctionID == "CI") + { + // CheckIn失敗將狀態變更回Queue + if (dtLotNo.Columns.Contains("blnEXETriggerOP")) + { + foreach (DataRow drTempLotInfo in dtLotNo.Rows) + { + if (Convert.ToBoolean(drTempLotInfo["blnEXETriggerOP"])) + { + DataRow[] drSel = dtLotState.Select("LotNO='" + drTempLotInfo["LotNo"] + "'".ToString()); + // Call objReverse.ExecuteReverse(drSel(0)("LotNo"), "AutoExe", Now, , , , , drSel(0)("LotStamp")) + // Call objLot.ExeReverseTriggerOP(drSel(0)("LotNo"), drSel(0)("LotSerial"), drSel(0)("LogGroupSerial"), drSel(0)("LotStamp")) + ExeReverseTriggerOP_NotUseUndo(UserNo, Convert.ToString(drSel[0]["LotNo"]), Convert.ToString(drSel[0]["LotSerial"]), Conversions.ToInteger(drSel[0]["LotStamp"]), ComputerName); + } + } + } + } + + strResult = "fail"; + strRetrunMsg = ex.Message; + objSYS.AddErrorLog_ErrorCode(strServiceName, UserNo, "LotNo", LotNo, DateTime.Now, ex.Message + " : " + ex.StackTrace, ComputerName: ComputerName); + + throw ex; + } + + finally + { + if (!(drTemp == null)) + drTemp.Close(); + if (!(objLot == null)) + { + objLot.Dispose(); + objLot = null; + } + if (!(objSYS == null)) + { + objSYS.Dispose(); + objSYS = null; + } + AutoexecutionLot_LotRet = strRetrunMsg; + CloseConnection(cnnTemp); + } + + return AutoexecutionLot_LotRet; + } + + + public static short funLoadLotStatusJoinOPBusinessRule(string strLotNo, ref DataTable dtLots) + { + short funLoadLotStatusJoinOPBusinessRuleRet = default(short); + + funLoadLotStatusJoinOPBusinessRuleRet = -1; + + try + { + + using (var ds = new DataSet()) + { + AppSettings objSetting = new AppSettings(); + string argstrDataBaseType = "Null"; + + ExecuteSQLQuery_Adapter( + " Select State.*, Basis.MONo, Basis.ProductNo, Basis.ProductVersion, BusinessRule.EXECUTIONFILE,BusinessRule.KERNELMODULE ,BusinessRule.KERNELFUNCTIONNAME,PRDPhase.PHASENO CurPhaseNo, G.SerialNo From tblWIPLotState State " + + " Left Join tblOPBusinessRuleBasis BusinessRule On BusinessRule.BRNO = State.BRNO " + + " Left Join (Select PHASENO,FromNode From tblPRDOPBusinessruleRelation Group by PHASENO,FROMNODE)PRDPhase On State.BRNO =PRDPhase.FROMNODE " + + " Left Join tblWIPTemp_LotState G ON State.LotNo=G.LotNo " + + " Left Join tblWIPLotBasis Basis ON State.LotNo=Basis.BASELOTNO " + + " Where State.LotNo In " + strLotNo, + ds.Tables.Add("LotState"), objSetting.GetConnectionString(), objSetting.GetDataBaseType()); + dtLots = ds.Tables[0]; + + funLoadLotStatusJoinOPBusinessRuleRet = 0; + + } + } + catch (Exception e1) + { + funLoadLotStatusJoinOPBusinessRuleRet = -1; + throw; + } + + return funLoadLotStatusJoinOPBusinessRuleRet; + + + } + + + public static short ChkLotStateAndBRNo(string strLotNo, string FunctionID, string OPNo) + { + short ChkLotStateAndBRNoRet = default(short); + + ChkLotStateAndBRNoRet = -1; + var dtTemp = new DataTable(); + + try + { + + using (var ds = new DataSet()) + { + AppSettings objSetting = new AppSettings(); + //根据生产批号查询产品编号以及产品版本 + ExecuteSQLQuery_Adapter( + " select ProductNo,ProductVersion from tblWIPLotbasis where BaseLotNo in " + strLotNo, + dtTemp, objSetting.GetConnectionString(), objSetting.GetDataBaseType()); + string condition = " where OPNo='" + OPNo + "' "; + if (dtTemp.Rows.Count > 0) + { + if (dtTemp.Rows[0]["ProductNo"].ToString() != "") + { + condition += " and ProductNo='" + dtTemp.Rows[0]["ProductNo"].ToString() + "'"; + } + if (dtTemp.Rows[0]["ProductVersion"].ToString() != "") + { + condition += " and ProductVersion='" + dtTemp.Rows[0]["ProductVersion"].ToString() + "'"; + } + } + //string argstrDataBaseType = "Null"; + //using (var cn = new OleDbConnection(objSetting.GetConnectionString(strDataBaseType: ref argstrDataBaseType))) + //{ + // using (var da = new OleDbDataAdapter(" Select State.*, BusinessRule.EXECUTIONFILE,BusinessRule.KERNELMODULE ,BusinessRule.KERNELFUNCTIONNAME,PRDPhase.PHASENO CurPhaseNo From tblWIPLotState State " + " Left Join tblOPBusinessRuleBasis BusinessRule On BusinessRule.BRNO = State.BRNO " + " Left Join (Select PHASENO,FromNode From tblPRDOPBusinessruleRelation Group by PHASENO,FROMNODE)PRDPhase On State.BRNO =PRDPhase.FROMNODE " + " Where State.LotNo In " + strLotNo + " And OPNo ='" + OPNo + "' ", cn)) + // { + // da.Fill(ds.Tables.Add("LotState")); + // } + //} + ExecuteSQLQuery_Adapter( + " Select State.*, BusinessRule.EXECUTIONFILE,BusinessRule.KERNELMODULE ,BusinessRule.KERNELFUNCTIONNAME,PRDPhase.PHASENO CurPhaseNo From tblWIPLotState State " + + " Left Join tblOPBusinessRuleBasis BusinessRule On BusinessRule.BRNO = State.BRNO " + + " Left Join (Select PHASENO,FromNode From tblPRDOPBusinessruleRelation " + condition + " Group by PHASENO,FROMNODE)PRDPhase On State.BRNO =PRDPhase.FROMNODE " + + " Where State.LotNo In " + strLotNo + " And OPNo ='" + OPNo + "' ", + ds.Tables.Add("LotState"), objSetting.GetConnectionString(), objSetting.GetDataBaseType()); + dtTemp = ds.Tables[0]; + + if (dtTemp.Rows.Count == 0) + { + ChkLotStateAndBRNoRet = -2; + return ChkLotStateAndBRNoRet; + } + + if (dtTemp.DefaultView.ToTable(true, "BRNo").Rows.Count > 1) + { + ChkLotStateAndBRNoRet = -3; + return ChkLotStateAndBRNoRet; + } + + foreach (DataRow drTemp in dtTemp.Rows) + { + + if (drTemp["BRNO"].ToString().Contains("SPC")) + { + ChkLotStateAndBRNoRet = -6; + return ChkLotStateAndBRNoRet; + } + + switch (FunctionID) + { + case "CI": + { + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drTemp["CurPhaseNO"], 0, false)) && Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drTemp["CurPhaseNO"], 1, false))) + { + ChkLotStateAndBRNoRet = -6; + return ChkLotStateAndBRNoRet; + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drTemp["Status"], 0, false)) && Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drTemp["Status"], 1, false))) + { + ChkLotStateAndBRNoRet = -6; + return ChkLotStateAndBRNoRet; + } + + break; + } + + case "CO": + { + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drTemp["CurPhaseNO"], 2, false))) + { + ChkLotStateAndBRNoRet = -6; + return ChkLotStateAndBRNoRet; + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drTemp["Status"], 1, false))) + { + ChkLotStateAndBRNoRet = -6; + return ChkLotStateAndBRNoRet; + } + + break; + } + + } + } + + ChkLotStateAndBRNoRet = 0; + + } + } + catch (Exception e1) + { + ChkLotStateAndBRNoRet = -1; + throw; + } + + return ChkLotStateAndBRNoRet; + + + } + + + + + + //0156845: [6.0.7] 调整EAP接口查核支援BR逻辑 + public static bool ExeBrnoIfSupport(string brdll, string brno) + { + bool blnExecResult = false; + DbDataReader drTemp; + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + IDbConnection cnnTemp = null; + try + { + cnnTemp = CreateConnection(strConnectionString); + string strSQL = "select * from TBLSYSEAPBRNOBASIS where UPPER(BRDLL)='" + brdll + "' and UPPER(BRNO)='" + brno + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + blnExecResult = true; + } + drTemp.Close(); + } + catch (Exception ex) + { + blnExecResult = false; + throw; + } + finally + { + CloseConnection(cnnTemp); + } + return blnExecResult; + } + + + + + + + + #endregion + + #region "panleid&unit序号生成" + public static DataTable InitPanleIdOrUnitId(bool ReserveSerialNo = false, long SerialCount = defInteger, string SerialTypeNo = defString, string LotNo = defString, string PanleId = defString, string ProductNo = defString, string SerialType = defString, string AdditionalXml = "", string location = "") + { + DataTable InitPanleIdOrUnitId = default(DataTable); + + AppSettings objSetting = new AppSettings(); + IDbConnection cnnTemp = null; + string strSQL = defString; + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + DataSet dsTemp = new DataSet(); + dsTemp.Tables.Add("InitPanleIdOrUnitId"); + dsTemp.Tables["InitPanleIdOrUnitId"].Columns.Add("SeqNo"); + + string strSerialString = ""; // 序號編碼字串 + + DbDataReader drTemp = null; + + var datEventTime = DateTime.Now; + + var intSer_Len = default(int); // 流水號長度. + var intSer_DT = default(int); // 流水號進位方式-1:10進位,2:16進位,3:36進位. + var intSNIndex = -1; // 流水號所在Index位置 + int intPadLeft = 1; // 流水號是否向左補零 0:不補零,1:自動補零 + + if (SerialCount == defInteger) + SerialCount = 1L; // 沒有傳入產生序號數量則預設值產生一筆序號 + var colParameters = new Collection(); + + var objArgs = new object(); + var arySerial = new ArrayList(); // 流水號陣列 + + DataRow drNew; + + + string strProductNo = ProductNo; + + + + try + { + // 取出編碼規則 + strSQL = "Select * From tblSYSSerialRuleBasis Where SERIALTYPENO = '" + SerialTypeNo + "'AND ENABLE = 1 "; + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "SerialRuleBasis", cnnTemp); + + if (dsTemp.Tables["SerialRuleBasis"].Rows.Count == 0) + { + throw new Exception(SerialTypeNo + "[%:序号类别编号不存在或者没有启用!%]"); + } + + + // 取出分批編碼明細 + strSQL = "Select * From tblSYSSerialRuleDetail Where SERIALTYPENO='" + SerialTypeNo + "' Order By ItemNo "; + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "SerialRuleDetail", cnnTemp); + + if (dsTemp.Tables["SerialRuleDetail"].Rows.Count == 0) + { + throw new Exception(SerialTypeNo + "[%:序号类别编号不存在或者没有启用!%]"); + } + + // 新增欄位紀錄該編碼項目此次編碼內容 + dsTemp.Tables["SerialRuleDetail"].Columns.Add("Value"); + + for (int i = 0, loopTo = dsTemp.Tables["SerialRuleDetail"].Rows.Count - 1; i <= loopTo; i++) + { + + // 依照不同編碼項目取得值 + switch (dsTemp.Tables["SerialRuleDetail"].Rows[i]["SourceType"].ToString()) + { + + case "SN": + { + + // 進位方式(1:10進位,2:16進位,3:36進位) + intSer_DT = Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["DecimalType"]); + intSer_Len = Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]); + if (dsTemp.Tables["SerialRuleDetail"].Columns.Contains("PadLeft")) + { + intPadLeft = Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["PadLeft"]); + } + intSNIndex = i; + break; + } + + case "UD": + { + + // 序號編碼項目 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += dsTemp.Tables["SerialRuleDetail"].Rows[i]["UserDefine"].ToString(); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = dsTemp.Tables["SerialRuleDetail"].Rows[i]["UserDefine"].ToString(); + break; + } + + case "D1": + case "D2": + case "M1": + case "M2": + case "M3": + case "Y1": + case "Y2": + case "Y4": + case "W2": + { + + // 序號編碼項目 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + string tableTmp = dsTemp.Tables["SerialRuleDetail"].Rows[i]["SourceType"].ToString(); + strSerialString += funExeSerialCreate_Date(ref datEventTime, ref tableTmp); + } + + string tableTmp2 = dsTemp.Tables["SerialRuleDetail"].Rows[i]["SourceType"].ToString(); + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = funExeSerialCreate_Date(ref datEventTime, ref tableTmp2); + break; + } + + case "MO": + { + + if (LotNo == defString) + throw new iMESException.MESException("0000-200002", "[%LotNo%]"); + + string strMONo = ""; + strSQL = "Select MONo From tblWIPLotBasis Where BaseLotNo "; + strSQL += " = (Select BaseLotNo From tblWIPLotState Where LotNo = '" + LotNo + "')"; + + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strMONo = drTemp["MONo"].ToString(); + } + else + { + throw new iMESException.MESException("0000-220020", "[%MONo%]"); + } + drTemp.Close(); + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 0, false))) // 有指定起訖字串位置 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(strMONo.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", "[%MONo%]"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strMONo.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strMONo.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 1, false))) // 取得全部字串 + { + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strMONo; + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strMONo; + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 2, false))) // 右側取碼 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(strMONo.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", "[%MONo%]"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strMONo.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(strMONo.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strMONo.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(strMONo.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + + } + + break; + } + + case "FC": + { + + if (LotNo == defString) + throw new iMESException.MESException("0000-200002", "[%LotNo%]"); + + string strFabCode = ""; + strSQL = "Select FabCode From tblSMDFactoryBasis Where FactoryNo = (Select FactoryNo From tblWIPLotState Where LotNo = '" + LotNo + "')"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strFabCode = drTemp["FabCode"].ToString(); + } + else + { + throw new iMESException.MESException("0000-220020", "[%FactoryNo%]"); + } + drTemp.Close(); + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 0, false))) // 有指定起訖字串位置 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(strFabCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", "[%FabCode%]"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strFabCode.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strFabCode.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 1, false))) // 取得全部字串 + { + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strFabCode; + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strFabCode; + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 2, false))) // 右側取碼 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(strFabCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", "[%FabCode%]"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strFabCode.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(strFabCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strFabCode.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(strFabCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + + } + + break; + } + + case "MTC": + { + + if (LotNo == defString) + throw new iMESException.MESException("0000-200002", "[%LotNo%]"); + + string strMOTypeCode = ""; + + strSQL = " Select MT.MOTypeCode From tblWIPLotState LS "; + strSQL += "Left Join tblWIPLotBasis LB On LS.BaseLotNo = LB.BaseLotNo "; + strSQL += "Left Join tblOEMOBasis MO On LB.MONo = MO.MONo "; + strSQL += "Left Join tblSYSMOTypeBasis MT On MO.MOTypeNo = MT.MOTypeNo "; + strSQL += "Where LS.LotNo = '" + LotNo + "' "; + + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strMOTypeCode = drTemp["MOTypeCode"].ToString(); + } + else + { + throw new iMESException.MESException("0000-220020", "[%MOTypeNo%]"); + } + drTemp.Close(); + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 0, false))) // 有指定起訖字串位置 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(strMOTypeCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", "[%MOTypeCode%]"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strMOTypeCode.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strMOTypeCode.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 1, false))) // 取得全部字串 + { + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strMOTypeCode; + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strMOTypeCode; + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 2, false))) // 右側取碼 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(strMOTypeCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", "[%MOTypeCode%]"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strMOTypeCode.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(strMOTypeCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strMOTypeCode.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(strMOTypeCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + + } + + break; + } + + case "PTC": + { + + if (LotNo == defString) + throw new iMESException.MESException("0000-200002", "[%LotNo%]"); + + string strProductTypeCode = ""; + + strSQL = " Select PT.ProductTypeCode From tblWIPLotState LS "; + strSQL += "Left Join tblWIPLotBasis LB On LS.BaseLotNo = LB.BaseLotNo "; + strSQL += "Left Join tblPRDProductBasis PB On LB.ProductNo = PB.ProductNo AND LB.ProductVersion = PB.ProductVersion "; + strSQL += "Left Join tblPRDType PT On PB.ProductType = PT.ProductType "; + strSQL += "Where LS.LotNo = '" + LotNo + "' "; + + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strProductTypeCode = drTemp["ProductTypeCode"].ToString(); + } + else + { + throw new iMESException.MESException("0000-220020", "[%ProductType%],[%ProductNo%],[%ProductVersion%]"); + } + drTemp.Close(); + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 0, false))) // 有指定起訖字串位置 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(strProductTypeCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", "[%ProductType%],[%ProductNo%],[%ProductVersion%]"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strProductTypeCode.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strProductTypeCode.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 1, false))) // 取得全部字串 + { + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strProductTypeCode; + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strProductTypeCode; + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 2, false))) // 右側取碼 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(strProductTypeCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", "[%ProductType%],[%ProductNo%],[%ProductVersion%]"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strProductTypeCode.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(strProductTypeCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strProductTypeCode.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(strProductTypeCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + + } + + break; + } + + case "PN": + { + + if (LotNo == defString) + throw new iMESException.MESException("0000-200002", "[%LotNo%]"); + + //string strProductNo = ""; + + strSQL = " Select PB.ProductNo From tblWIPLotState LS "; + strSQL += "Left Join tblWIPLotBasis LB On LS.BaseLotNo = LB.BaseLotNo "; + strSQL += "Left Join tblPRDProductBasis PB On LB.ProductNo = PB.ProductNo AND LB.ProductVersion = PB.ProductVersion "; + strSQL += "Where LS.LotNo = '" + LotNo + "' "; + + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strProductNo = drTemp["ProductNo"].ToString(); + } + else + { + throw new iMESException.MESException("0000-220020", "[%ProductNo%]"); + } + drTemp.Close(); + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 0, false))) // 有指定起訖字串位置 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(strProductNo.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", "[%ProductNo%]"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strProductNo.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strProductNo.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 1, false))) // 取得全部字串 + { + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strProductNo; + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strProductNo; + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 2, false))) // 右側取碼 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(strProductNo.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", "[%ProductNo%]"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strProductNo.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(strProductNo.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strProductNo.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(strProductNo.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + + } + + break; + } + + case "PC": + { + + if (LotNo == defString) + throw new iMESException.MESException("0000-200002", "[%LotNo%]"); + + string strProductCode = ""; + + strSQL = " Select PB.ProductCode From tblWIPLotState LS "; + strSQL += "Left Join tblWIPLotBasis LB On LS.BaseLotNo = LB.BaseLotNo "; + strSQL += "Left Join tblPRDProductBasis PB On LB.ProductNo = PB.ProductNo AND LB.ProductVersion = PB.ProductVersion "; + strSQL += "Where LS.LotNo = '" + LotNo + "' "; + + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strProductCode = drTemp["ProductCode"].ToString(); + } + else + { + throw new iMESException.MESException("0000-220020", "[%ProductNo%],[%ProductVersion%]"); + } + drTemp.Close(); + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 0, false))) // 有指定起訖字串位置 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(strProductCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", "[%ProductCode%],[%ProductNo%],[%ProductVersion%]"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strProductCode.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strProductCode.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 1, false))) // 取得全部字串 + { + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strProductCode; + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strProductCode; + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 2, false))) // 右側取碼 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(strProductCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", "[%ProductCode%],[%ProductNo%],[%ProductVersion%]"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strProductCode.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(strProductCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strProductCode.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(strProductCode.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + + } + + break; + } + case "FUN": + { + + string strFunString = ""; + // 2018/04/10 OwenLiu, Mantis:0045761, 增加客製 SerialNoFunction 支援機制 + string strScripFuncName = dsTemp.Tables["SerialRuleDetail"].Rows[i]["FunctionName"].ToString(); + MethodInfo mi = null; + + if (strScripFuncName.ToUpper().StartsWith("FUNC_")) + { + using (var objSerialNoFunction = new udSYS_Customer.clsSerialNoFunction()) + { + mi = objSerialNoFunction.GetType().GetMethod(strScripFuncName, BindingFlags.Public | BindingFlags.Instance); + if (!(mi == null)) + { + try + { + strFunString = Convert.ToString(mi.Invoke(objSerialNoFunction, (object[])objArgs)); + } + catch (TargetInvocationException tie) + { + throw tie.InnerException; + } + catch (Exception ex) + { + throw; + } + } + else + { + throw new iMESException.MESException("0000-200091", "[%Function%] [%not found%]: " + dsTemp.Tables["SerialRuleDetail"].Rows[i]["FunctionName"].ToString()); + } + } + } + else + { + using (var objSerialNoFunction = new udSYS.clsSerialNoFunction()) + { + mi = objSerialNoFunction.GetType().GetMethod(strScripFuncName, BindingFlags.Public | BindingFlags.Instance); + if (!(mi == null)) + { + try + { + strFunString = Convert.ToString(mi.Invoke(objSerialNoFunction, (object[])objArgs)); + } + catch (TargetInvocationException tie) + { + throw tie.InnerException; + } + catch (Exception ex) + { + throw; + } + } + else + { + throw new iMESException.MESException("0000-200091", "[%Function%] [%not found%]: " + dsTemp.Tables["SerialRuleDetail"].Rows[i]["FunctionName"].ToString()); + } + } + } + + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 0, false))) // 有指定起訖字串位置 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(strFunString.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", strFunString); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strFunString.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strFunString.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 1, false))) // 取得全部字串 + { + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strFunString; + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strFunString; + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 2, false))) // 右側取碼 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(strFunString.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", strFunString); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += strFunString.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(strFunString.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strFunString.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(strFunString.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + + } + + break; + } + case "PCB供应商代码": + { + if (PanleId == defString) + { + throw new Exception("PanleId: " + PanleId + " 不能为空!"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 0, false))) // 有指定起訖字串位置 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(PanleId.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", "PanleId 长度不足!"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += PanleId.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = PanleId.Substring(Conversions.ToInteger(Operators.SubtractObject(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"], 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 1, false))) // 取得全部字串 + { + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += PanleId; + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = PanleId; + } + + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["GetData"], 2, false))) // 右側取碼 + { + + // 判斷長度是否足夠 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(Operators.SubtractObject(PanleId.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), 1), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"], false))) + { + throw new iMESException.MESException("0000-220021", "[%PanleId%]"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + { + strSerialString += PanleId.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(PanleId.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + } + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = PanleId.Substring(Conversions.ToInteger(Operators.AddObject(Operators.SubtractObject(Operators.SubtractObject(PanleId.Length, dsTemp.Tables["SerialRuleDetail"].Rows[i]["SearchStart"]), dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"]), 1)), Conversions.ToInteger(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialLength"])); + + } + + break; + } + case "基板信息": + { + if (PanleId == defString) + { + throw new Exception("PanleId: " + PanleId + " 不能为空!"); + } + + strSerialString += PanleId; + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = PanleId; + break; + } + case "Year_LQ": + { + + + strSQL = "SELECT CUSTOMCODE FROM TBLCUSNUMCUSTOM WHERE PRODUCTNO='" + strProductNo + "' AND CUSTOMTYPE='年' AND CUSTOMSOURCE='" + datEventTime.Year.ToString("D4") + "'"; + + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strSerialString += drTemp["CUSTOMCODE"].ToString(); + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = drTemp["CUSTOMCODE"].ToString(); + } + else + { + throw new Exception("Year_LQ 规则未生成!请检查panleid&unit序号规则_年月周定义设定!"); + } + drTemp.Close(); + break; + } + case "Mouth_LQ": + { + + + + strSQL = @"SELECT CUSTOMCODE FROM TBLCUSNUMCUSTOM WHERE PRODUCTNO = '" + strProductNo + "' AND CUSTOMTYPE = '月' AND( CUSTOMSOURCE = '" + datEventTime.Month.ToString("D2") + "' OR CUSTOMSOURCE = '" + datEventTime.Month.ToString() + "')"; + + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strSerialString += drTemp["CUSTOMCODE"].ToString(); + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = drTemp["CUSTOMCODE"].ToString(); + } + else + { + throw new Exception("Mouth_LQ 规则未生成!请检查panleid&unit序号规则_年月周定义设定!"); + } + drTemp.Close(); + + break; + } + case "Week_LQ": + { + + + + int dayOfYear = datEventTime.DayOfYear; + int week = (dayOfYear + 6) / 7; + string WeekNo = week.ToString(); + + strSQL = @"SELECT CUSTOMCODE FROM TBLCUSNUMCUSTOM WHERE PRODUCTNO = '" + strProductNo + "' AND CUSTOMTYPE = '周' AND CUSTOMSOURCE ='" + WeekNo + "'"; + + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strSerialString += drTemp["CUSTOMCODE"].ToString(); + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = drTemp["CUSTOMCODE"].ToString(); + } + else + { + throw new Exception("Week_LQ 规则未生成!请检查panleid&unit序号规则_年月周定义设定!"); + } + drTemp.Close(); + break; + } + case "Day_LQ": + { + + + + strSQL = @"SELECT CUSTOMCODE FROM TBLCUSNUMCUSTOM WHERE PRODUCTNO = '" + strProductNo + "' AND CUSTOMTYPE = '日' AND( CUSTOMSOURCE = '" + datEventTime.Day.ToString("D2") + "' OR CUSTOMSOURCE = '" + datEventTime.Day.ToString() + "')"; + + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strSerialString += drTemp["CUSTOMCODE"].ToString(); + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = drTemp["CUSTOMCODE"].ToString(); + } + else + { + throw new Exception("Day_LQ 规则未生成!请检查panleid&unit序号规则_年月周日定义设定!"); + } + drTemp.Close(); + + break; + } + case "位置编号": + { + + //strSerialString += location; + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = location; + break; + } + case "工单属性": + { + if (LotNo == defString) + throw new iMESException.MESException("0000-200002", "[%LotNo%]"); + + string strMONo = ""; + strSQL = "Select MONo From tblWIPLotBasis Where BaseLotNo "; + strSQL += " = (Select BaseLotNo From tblWIPLotState Where LotNo = '" + LotNo + "')"; + + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strMONo = drTemp["MONo"].ToString(); + } + else + { + throw new iMESException.MESException("0000-220020", "[%MONo%]"); + } + drTemp.Close(); + + // 序號編碼項目 + //if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["SerialRuleDetail"].Rows[i]["SerialCodeFlag"], 1, false))) + //{ + // strSerialString += dsTemp.Tables["SerialRuleDetail"].Rows[i]["UserDefine"].ToString(); + //} + string strPropertyNO = ""; + string value = dsTemp.Tables["SerialRuleDetail"].Rows[i]["UserDefine"].ToString(); + strSQL = $"Select PROPERTYVALUE From TBLOEMOPROPERTY Where MONO = '{strMONo}' and PROPERTYNO = '{value}' "; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strPropertyNO = drTemp["PROPERTYVALUE"].ToString(); + } + else + { + throw new iMESException.MESException("0000-220020", $"{value}属性编号不存在"); + } + drTemp.Close(); + + + dsTemp.Tables["SerialRuleDetail"].Rows[i]["Value"] = strPropertyNO; + break; + } + } + + } + + + if (arySerial.Count == 0) + { + // 呼叫序號產生,取得目前最大值,並且產生多筆序號,更新系統紀錄 + // arySerial = funExeSerialCreate_Serial(cnnTemp, "LOTNO", SerialCount, strSerialString, intSer_Len, intSer_DT, ReserveSerialNo) + string argSerialType1 = SerialType; + arySerial = funExeSerialCreate_Serial(ref cnnTemp, ref argSerialType1, ref SerialCount, ref strSerialString, ref intSer_Len, ref intSer_DT, ref ReserveSerialNo, intPadLeft); + } + + // 將編碼與流水號合併 + for (int i = 0, loopTo6 = arySerial.Count - 1; i <= loopTo6; i++) + { + + strSerialString = ""; + for (int j = 0, loopTo7 = dsTemp.Tables["SerialRuleDetail"].Rows.Count - 1; j <= loopTo7; j++) + { + + if (j == intSNIndex) + { + strSerialString += arySerial[0].ToString(); + } + else + { + strSerialString += dsTemp.Tables["SerialRuleDetail"].Rows[j]["Value"].ToString(); + } + + } + + drNew = dsTemp.Tables["InitPanleIdOrUnitId"].NewRow(); + drNew["SeqNo"] = strSerialString; + dsTemp.Tables["InitPanleIdOrUnitId"].Rows.Add(drNew); + + } + + + // 移除多餘Table + dsTemp.Tables.Remove("SerialRuleBasis"); + dsTemp.Tables.Remove("SerialRuleDetail"); + + if (!(dsTemp.Tables["LotStateJoinBasis"] == null)) + dsTemp.Tables.Remove("LotStateJoinBasis"); + + // //Combine return value + InitPanleIdOrUnitId = dsTemp.Tables[0]; + } + catch (Exception e1) + { + InitPanleIdOrUnitId = null; + throw; + } + finally + { + drTemp?.Close(); + dsTemp?.Dispose(); + CloseConnection(cnnTemp); + } + return InitPanleIdOrUnitId; + } + + + + public static string funExeSerialCreate_Date(ref DateTime EventTime, ref string SourceType) + { + string funExeSerialCreate_DateRet = default(string); + + var strResult = default(string); + + try + { + switch (SourceType) + { + + case "D1": + { + switch (EventTime.ToString("dd")) + { + case "01": + case "02": + case "03": + case "04": + case "05": + case "06": + case "07": + case "08": + case "09": + { + strResult = EventTime.ToString("dd").Substring(1, 1); + break; + } + case "10": + { + strResult = "A"; + break; + } + case "11": + { + strResult = "B"; + break; + } + case "12": + { + strResult = "C"; + break; + } + case "13": + { + strResult = "D"; + break; + } + case "14": + { + strResult = "E"; + break; + } + case "15": + { + strResult = "F"; + break; + } + case "16": + { + strResult = "G"; + break; + } + case "17": + { + strResult = "H"; + break; + } + case "18": + { + strResult = "I"; + break; + } + case "19": + { + strResult = "J"; + break; + } + case "20": + { + strResult = "K"; + break; + } + case "21": + { + strResult = "L"; + break; + } + case "22": + { + strResult = "M"; + break; + } + case "23": + { + strResult = "N"; + break; + } + case "24": + { + strResult = "O"; + break; + } + case "25": + { + strResult = "P"; + break; + } + case "26": + { + strResult = "Q"; + break; + } + case "27": + { + strResult = "R"; + break; + } + case "28": + { + strResult = "S"; + break; + } + case "29": + { + strResult = "T"; + break; + } + case "30": + { + strResult = "U"; + break; + } + case "31": + { + strResult = "V"; + break; + } + } + + break; + } + + case "D2": + { + strResult = Strings.Format(DateAndTime.DatePart(DateInterval.Day, EventTime), "00"); + break; + } + + case "M1": + { + switch (EventTime.ToString("MM")) + { + case "01": + case "02": + case "03": + case "04": + case "05": + case "06": + case "07": + case "08": + case "09": + { + strResult = EventTime.ToString("MM").Substring(1, 1); + break; + } + case "10": + { + strResult = "A"; + break; + } + case "11": + { + strResult = "B"; + break; + } + case "12": + { + strResult = "C"; + break; + } + } + + break; + } + + case "M2": + { + strResult = Strings.Format(DateAndTime.DatePart(DateInterval.Month, EventTime), "00"); + break; + } + + case "M3": + { + int intMonth; + intMonth = DateAndTime.DatePart(DateInterval.Month, EventTime); + switch (intMonth) + { + case 1: + { + strResult = "JAN"; + break; + } + case 2: + { + strResult = "FEB"; + break; + } + case 3: + { + strResult = "MAR"; + break; + } + case 4: + { + strResult = "APR"; + break; + } + case 5: + { + strResult = "MAY"; + break; + } + case 6: + { + strResult = "JUN"; + break; + } + case 7: + { + strResult = "JUL"; + break; + } + case 8: + { + strResult = "AUG"; + break; + } + case 9: + { + strResult = "SEP"; + break; + } + case 10: + { + strResult = "OCT"; + break; + } + case 11: + { + strResult = "NOV"; + break; + } + case 12: + { + strResult = "DEC"; + break; + } + } + + break; + } + + case "Y1": + { + strResult = Strings.Mid(DateAndTime.DatePart(DateInterval.Year, EventTime).ToString(), 4, 1); + break; + } + + case "Y2": + { + strResult = Strings.Mid(DateAndTime.DatePart(DateInterval.Year, EventTime).ToString(), 3, 2); + break; + } + + case "Y4": + { + strResult = DateAndTime.DatePart(DateInterval.Year, EventTime).ToString(); + break; + } + + case "W2": + { + strResult = Strings.Format(DateAndTime.DatePart(DateInterval.WeekOfYear, EventTime, FirstDayOfWeek.Sunday, FirstWeekOfYear.Jan1), "00"); + break; + } + + default: + { + throw new iMESException.MESException("0000-200015", "[%SourceType%] is not valid!"); + } + } + + // Return + funExeSerialCreate_DateRet = strResult; + } + + catch (Exception e1) + { + funExeSerialCreate_DateRet = "fail"; + throw; + } + finally + { + + } + + return funExeSerialCreate_DateRet; + + } + + + private static ArrayList funExeSerialCreate_Serial(ref IDbConnection cnnTemp, ref string SerialType, ref long SerialCount, ref string SerialString, ref int SerialLength, ref int DecimalType, ref bool ReserveSerialNo, int PadLeft = defInteger) + { + ArrayList funExeSerialCreate_SerialRet = default(ArrayList); + + DbDataReader drTemp = null; + var colSQL = new Collection(); + var colSQL_Rows = new Collection(); + var arySerial = new ArrayList(); + string strSQL = ""; + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + + try + { + + if (SerialCount <= 0L) + { + throw new iMESException.MESException("0000-200017", "[%MOQty%]"); + } + + // 取出最大碼. + bool blnInsert; + long lngMaxSerialNo; // 起始碼. + long lngSerialNo_Last; // 最大一個序號. + var strSerialNo_Last_nn = default(string); // 轉換成10,16,36表示式. + + strSQL = "Select MaxSerialNo From tblSYSSerialCreateMax " + " Where SerialType='" + SerialType + "'" + " And SerialString='" + SerialString + "'" + " And SerialLength=" + SerialLength + " And DecimalType=" + DecimalType; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + blnInsert = false; + lngMaxSerialNo = Conversions.ToLong(drTemp["MaxSerialNo"]); + } + else + { + blnInsert = true; + lngMaxSerialNo = 0L; + } + drTemp.Close(); + + // 最大的序號 + lngSerialNo_Last = lngMaxSerialNo + SerialCount; + + if (DecimalType == 1) + { + strSerialNo_Last_nn = lngSerialNo_Last.ToString(); + } + else if (DecimalType == 2) + { + strSerialNo_Last_nn = Tran10_16(lngSerialNo_Last); + } + else if (DecimalType == 3) + { + strSerialNo_Last_nn = Tran10_36(lngSerialNo_Last); + } + + // 86774: [6.0.5] 序號規則新增34進位序號 + // ===================================== 86774 Start ===================================== + else if (DecimalType == 4) + { + strSerialNo_Last_nn = Tran10_34(lngSerialNo_Last); + // ===================================== 86774 End ===================================== + + } + + // 最大碼是否超出序號長度. + if (strSerialNo_Last_nn != null && strSerialNo_Last_nn.Length > SerialLength) + { + throw new iMESException.MESException("9P12-200028", "[%SerialString%]: " + SerialString + Constants.vbNewLine + "[%SerialLength%]: " + SerialLength + Constants.vbNewLine + "[%SerialNo%]: " + strSerialNo_Last_nn); + } + + if (ReserveSerialNo == true) + { + // 回填最大碼(利用MaxSerialNo來確保資料的一致性及使用的序號為唯一) + if (blnInsert) + { + strSQL = "Insert into tblSYSSerialCreateMax " + " (SerialType,SerialString,SerialLength,DecimalType,MaxSerialNo) " + " Values('" + SerialType + "','" + SerialString + "'," + SerialLength + "," + DecimalType + "," + lngSerialNo_Last + ")"; + colSQL.Add(strSQL); + colSQL_Rows.Add(1); + } + else + { + strSQL = "Update tblSYSSerialCreateMax Set MaxSerialNo=" + lngSerialNo_Last + " Where SerialType='" + SerialType + "'" + " And SerialString='" + SerialString + "'" + " And SerialLength=" + SerialLength + " And DecimalType=" + DecimalType + " And MaxSerialNo=" + lngMaxSerialNo; + colSQL.Add(strSQL); + colSQL_Rows.Add(1); + } + + ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows); + } + + for (int i = 1, loopTo = (int)SerialCount; i <= loopTo; i++) + { + if (PadLeft == 0) + { + if (DecimalType == 1) + { + arySerial.Add((lngMaxSerialNo + i).ToString()); + } + else if (DecimalType == 2) + { + arySerial.Add(Tran10_16(lngMaxSerialNo + i).ToString()); + } + else if (DecimalType == 3) + { + arySerial.Add(Tran10_36(lngMaxSerialNo + i).ToString()); + } + + // 86774: [6.0.5] 序號規則新增34進位序號 + // ===================================== 86774 Start ===================================== + else if (DecimalType == 4) + { + arySerial.Add(Tran10_34(lngMaxSerialNo + i).ToString()); + // ===================================== 86774 End ===================================== + } + } + else if (DecimalType == 1) + { + arySerial.Add((lngMaxSerialNo + i).ToString().PadLeft(SerialLength, '0')); + } + else if (DecimalType == 2) + { + arySerial.Add(Tran10_16(lngMaxSerialNo + i).ToString().PadLeft(SerialLength, '0')); + } + else if (DecimalType == 3) + { + arySerial.Add(Tran10_36(lngMaxSerialNo + i).ToString().PadLeft(SerialLength, '0')); + } + + // 86774: [6.0.5] 序號規則新增34進位序號 + // ===================================== 86774 Start ===================================== + else if (DecimalType == 4) + { + arySerial.Add(Tran10_34(lngMaxSerialNo + i).ToString().PadLeft(SerialLength, '0')); + // ===================================== 86774 End ===================================== + } + } + + // 回傳最大碼 + funExeSerialCreate_SerialRet = arySerial; + } + + catch (Exception e1) + { + funExeSerialCreate_SerialRet = null; + throw; + } + finally + { + + } + + return funExeSerialCreate_SerialRet; + + } + + + #endregion + + #region "分批客制" + //客制母批不需要变状态 + + // 功能:依dtSplitLot內的資料,執行分批. + // 傳入值:LotNo,dtSplitLot + // 傳回值:success(成功), fail(失敗) + // 修改:2008/08/26,sammi.可由使用者指定SysQty而不自動計算. + // 修改:2009/08/14,yumei, tblWIPLotLog*新增OPGroupNo欄位 + // 修改:2012/06/18,sammi.新增多人加工處理. + // 修改:2019/04/25 Lena, 交辦單:W084562019040028 + // 調整在製品庫分批,當生產批為在製品庫分批且狀態已為99結批時,不建立還原點,不允許還原.(因生產批結批時,已將其所有還原的資料都已刪除,故不能做還原的作業) + public static string BR_Manual_LotSplit_M(long LotStamp, string MLotNo, int SplitType, string UserNo, DataTable dtSplitLot, string LinkName = defString, string ShiftNo = defString, string AdditionalXml = "", string EventDescription = "", bool blnWIPInv = false, int intUserActiveId = defInteger) + { + string BR_Manual_LotSplitRet = default(string); + + // PS1.手動的分批可能發生在任一時點(站中or站間) + // PS2.手動分批也可是一個BR,若是BR則分批完成,Staus要變更為4 + + IDbConnection cnnTemp = null; + var dsTemp = new DataSet(); + DbDataReader drTemp = null; + var CollectionSQL = new Collection(); + Collection colToINVLotNo = new Collection(); + + DataRow drAdd; + DataRow[] drSel; + string MNewLotSerial, SLotNo, SLotSerial, SerialNo; + int MReverseId = default(int), SReverseId = default(int); + string MLotSerial, AutoMergeToLotNo; + var decSplitQty = default(decimal); + DateTime datEventTime; + bool blnAutoMerge, blnHaveFromLot, blnHaveSysQty; + int intOPStatus; + decimal MLotQtyAfterSplit = defInteger; + int i; + string MLogGroupSerial; + + var aryLotProperty = new ArrayList(); + bool blnECN = false; + // === 2021/09/08 Troy mantis:94662 生產批下線後執行動作紀錄 phase III + var EventTime = DateTime.Now; + objLotLog = new iMESWIPReleaseLogHandler.clsLotReleaseLogHandle(intUserActiveId, UserNo, EventTime); + objLotLog.ColSQL = CollectionSQL; + // === + // ===2021/09/13 Troy 生產批歷程,將MCurQty, SysQty移至外層宣告 mantis:94662 + decimal MCurQty, SysQty; + + SLotSerial = ""; + SerialNo = ""; + AutoMergeToLotNo = ""; + + string strSQL = ""; + kcWIP.clsLot objLot = new kcWIP.clsLot(); + + AppSettings objSetting = new AppSettings(); + + + string DataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + // 2020/02/12 Eric Mantis:0067304(分批未繼承ECN) 確認是否為IC_FT_PKG + bool blnIsIC_PKG = false; + strSQL = "Select Count(ACTIVEMODULE) from TBLSYSFUNCTION Where ActiveModule='IC_FT_PKG'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + if (Convert.ToBoolean(Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false))) + blnIsIC_PKG = true; + + + // 1.檢查子批------------------------------------------------------------------------------------------------------------- + if (dtSplitLot.Select("Action <> 0 And Action <> 1 And Action <> 2").Length > 0) + { + throw new iMESException.MESException("0000-200015", "Action of Split Lot is not Valid Valud(0:Go,1:Jump OP,2:Jump Process)!!"); + } + + // 檢查新分批的子批中是否有FromLotNo + drSel = dtSplitLot.Select("SplitLotNo ='" + MLotNo + "'"); + if (drSel.Length == 0) + { + blnHaveFromLot = false; + } + else + { + // 2020/11/9,Ning,0081028: [6.0.5]分批處理,產品變更/流程變更調整 + // If drSel(0)("Action") <> 0 Then + // Throw New iMESException.MESException("0000-214010", "[SplitLotNo:" & MLotNo & " only support GO action.]") + // End If + MLotQtyAfterSplit = Convert.ToDecimal(drSel[0]["SplitLotQty"]); + blnHaveFromLot = true; + } + + // 2.加總SplitLotQty------------------------------------------------------------------------------------------------------ + var loopTo = dtSplitLot.Rows.Count - 1; + for (i = 0; i <= loopTo; i++) + { + if (Convert.ToBoolean(Operators.ConditionalCompareObjectLessEqual(dtSplitLot.Rows[i]["SplitLotQty"], 0, false))) + { + throw new iMESException.MESException("0000-200017", "SplitLotNo:" + + dtSplitLot.Rows[i]["SplitLotNo"] + " SplitQty = 0!!"); + } + decSplitQty = Convert.ToDecimal(Operators.AddObject(decSplitQty, dtSplitLot.Rows[i]["SplitLotQty"])); + } + + // 3.取出母批相關資料----------------------------------------------------------------------------------------------------- + datEventTime = DateTime.Now; + + objLot.SHR_Split_GetReference(ref cnnTemp, ref dsTemp, ref SerialNo, MLotNo, datEventTime); + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(decSplitQty, dsTemp.Tables["LotState"].Rows[0]["CurQty"], false))) + { + throw new iMESException.MESException("0000-214003", "Sum of SplitLotQty(" + Strings.Format(decSplitQty, "0.####") + ") is not equal CurQty(" + Strings.Format(dsTemp.Tables["LotState"].Rows[0]["CurQty"], "0.####") + ") of LotNo!!"); + } + + // 2020/02/12 Eric Mantis:0067304(分批未繼承ECN) 若產品的CustomerNo及DeviceNo皆不為N/A, 才啟用ECN相關處理 + strSQL = "Select CustomerNo,DeviceNo From tblPRDProductBasis Where ProductNo ='" + dsTemp.Tables["LotState"].Rows[0]["ProductNo"].ToString() + "'" + " And ProductVersion = '" + dsTemp.Tables["LotState"].Rows[0]["ProductVersion"].ToString() + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (drTemp["CustomerNo"].ToString() != "N/A" && drTemp["DeviceNo"].ToString() != "N/A" && !string.IsNullOrEmpty(drTemp["CustomerNo"].ToString()) && !string.IsNullOrEmpty(drTemp["DeviceNo"].ToString())) + { + blnECN = true; + } + } + drTemp.Close(); + + + MLotSerial = dsTemp.Tables["LotState"].Rows[0]["LotSerial"].ToString(); + intOPStatus = Conversions.ToInteger(dsTemp.Tables["LotState"].Rows[0]["OPStatus"]); + MLogGroupSerial = dsTemp.Tables["LotState"].Rows[0]["LogGroupSerial"].ToString(); + + // 3.1取出主批之庫房資訊 + if (blnWIPInv) + { + strSQL = "Select * From tblINVWIPInventory_Semi Where LotNo = '" + MLotNo + "'"; + + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + // daTemp = New OleDb.OleDbDataAdapter(cmmTemp) + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "WIPInv_RefLot", cnnTemp); + + if (dsTemp.Tables["WIPInv_RefLot"].Rows.Count == 0) + { + throw new iMESException.MESException("0000-202002", "[%LotNo%] : " + MLotNo); + } + + } + + // 4.Create ToLot Table for Split Inherit use--------------------------------------------------------------------------- + var dtSplitCont = new DataTable("SplitLot"); + dtSplitCont.Columns.Add("ToLotNo", Type.GetType("System.String")); + dtSplitCont.Columns.Add("ToBaseLotNo", Type.GetType("System.String")); + dtSplitCont.Columns.Add("ToLotSerial", Type.GetType("System.String")); + dtSplitCont.Columns.Add("ToReverseId", Type.GetType("System.Int32")); + dtSplitCont.Columns.Add("ToLotQty", Type.GetType("System.Decimal")); + dtSplitCont.Columns.Add("MajorLot", Type.GetType("System.Byte")); // 0:No,1:Yes(應該只有一筆是1) + + // 5.判斷SysQty的來源. + if (dtSplitLot.Columns.Contains("SplitSysQty") && dtSplitLot.Select("SplitSysQty is null").Length == 0) + { + blnHaveSysQty = true; // 使用前端傳入的SysQty而不自動計算. + } + else + { + blnHaveSysQty = false; + } // 由系統自動計算. + + // 5.母批--------------------------------------------------------------------------------------------------------------- + // 不可以使用LotState上的LotSerial,必須重新產生,否則Undo時會將前一Reverse已備份的BK刪除 + MNewLotSerial = objLot.InitLotSerial(MLotNo); + + // 2019/04/25 Lena, 在製品庫分批且生產批狀態已為99結批,不建立還原點 + if (!blnWIPInv || Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(dsTemp.Tables["LotState"].Rows[0]["LotState"], 99, false))) + { + var tmp = dsTemp.Tables["LotState"].Rows[0]; + string argOPNo = tmp["OPNo"].ToString(); + udReverse.clsReverse.ReverseType revTypeTmp = udReverse.clsReverse.ReverseType.Split_From; + MReverseId = objReverse.NewReverseID(ref MLotNo, ref revTypeTmp, ref MNewLotSerial, ref argOPNo, ref CollectionSQL, Description: "BR Manual Split(From Lot)", Creator: UserNo, CreateDate: datEventTime); + tmp["OPNo"] = argOPNo; + } + + if (SplitType == 1) // BR分批 + { + // 加入Cont_Employee + strSQL = "Insert into tblWIPCont_Employee(LogGroupSerial,LotSerial,LotNo,OPNo,BRNo,UserNo,FunctionName,ShiftNo,EventTime)" + " Values('" + + dsTemp.Tables["LotState"].Rows[0]["LogGroupSerial"] + "','" + MNewLotSerial + "','" + MLotNo + "','" + dsTemp.Tables["LotState"].Rows[0]["OPNo"] + + "','" + dsTemp.Tables["LotState"].Rows[0]["BRNo"] + "','" + UserNo + "','BR_Manual_LotSplit','" + ShiftNo + "'," + "To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + + "','YYYY/MM/DD HH24:MI:SS'))"; + CollectionSQL.Add(strSQL); + } + + if (intOPStatus == 1) + { + // 變更LotLog的EndTime + strSQL = "Select EndTime From tblWIPLotLog Where LotSerial = '" + MLotSerial + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strSQL = "Update tblWIPLotLog Set EndTime = To_Date('" + Strings.Format(Convert.ToDateTime(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " Where LotSerial = '" + MLotSerial + "'"; + CollectionSQL.Add(strSQL); + + // 加入ReverseUpdateContent + if (drTemp["EndTime"] is DBNull) + { + strSQL = "Update tblWIPLotLog Set EndTime = null Where LotSerial = '" + MLotSerial + "'"; + } + else + { + strSQL = "Update tblWIPLotLog Set EndTime = To_Date('" + Strings.Format(Convert.ToDateTime(drTemp["EndTime"]), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " Where LotSerial = '" + MLotSerial + "'"; + } + Collection argcolSQL_Rows = null; + objReverse.AddReverseUpdateContent(ref MNewLotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows); + } + drTemp.Close(); + + } + + // 併回處理 + // 檢查母批是否已指定為要併回 + strSQL = "Select FromLotNo,ToLotNo From tblWIPAutoMerge Where FromLotNo = '" + MLotNo + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) // 是 + { + blnAutoMerge = true; + AutoMergeToLotNo = drTemp["ToLotNo"].ToString(); + if (!blnHaveFromLot) + { + // 刪除母批併回資料(將子批併回資料加入,再後面處理) + strSQL = "Delete From tblWIPAutoMerge Where FromLotNo = '" + MLotNo + "'"; + CollectionSQL.Add(strSQL); + } + } + else + { + blnAutoMerge = false; + } + drTemp.Close(); + + + if (blnHaveFromLot) // 扣量處理 + { + int intStatus = defInteger; + int intGOStatus = defInteger; + + if (intOPStatus == 1) + { + if (SplitType == 1) // BR分批 + { + if (LinkName == "HOLD") + { + intStatus = 3; + intGOStatus = 4; + } + else if (LinkName == "WAIT") + { + intStatus = 2; + intGOStatus = 4; + } + else + { + intStatus = 4; + intGOStatus = defInteger; + } + } + else + { + } // 站中手動分批,不需要變更. + } + + // 系統數量. + // ===2021/09/13 Troy 生產批歷程,移至外層宣告 mantis:94662 + // Dim MCurQty, SysQty As Decimal + + drSel = dtSplitLot.Select("SplitLotNo ='" + MLotNo + "'"); + MCurQty = Convert.ToDecimal(drSel[0]["SplitLotQty"]); + + if (blnHaveSysQty) + { + SysQty = Convert.ToDecimal(drSel[0]["SplitSysQty"]); + } + else + { + // 計算系統數量. + var objUnit = new udUnitTransferFunction.clsUnitTransferFunction(); + var colParameters = new Collection(); + + colParameters.Add(dsTemp.Tables["LotState"].Rows[0]["ENGNo"].ToString(), "ENGNo"); + colParameters.Add(dsTemp.Tables["LotState"].Rows[0]["ENGVersion"].ToString(), "ENGVersion"); + colParameters.Add(dsTemp.Tables["LotState"].Rows[0]["ProductNo"].ToString(), "ProductNo"); + colParameters.Add(dsTemp.Tables["LotState"].Rows[0]["ProductVersion"].ToString(), "ProductVersion"); + SysQty = Convert.ToDecimal(objUnit.EXETransferQty(dsTemp.Tables["LotState"].Rows[0]["CurUnitNo"].ToString(), dsTemp.Tables["LotState"].Rows[0]["SysUnitNo"].ToString(), (double)MCurQty, colParameters)); + objUnit = null; + } + + //0370 20260604 母批不走完成状态 + + // 其他修改的資料(LotSerial,NewReverseId內已更新.) + strSQL = "Update tblWIPLotState Set CurQty = " + MCurQty + "," + " CurUnitNo = '" + + dsTemp.Tables["LotState"].Rows[0]["CurUnitNo"] + "'," + " SysQty = " + SysQty + "," + " SysUnitNo = '" + dsTemp.Tables["LotState"].Rows[0]["SysUnitNo"] + + "'," + " EventTime=To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " EventUserNo='" + UserNo + + "'," + " EventDescription='" + EventDescription + "'"; + // BR分批或手動分批會有不同的處理. + if (LinkName != defString) + strSQL += ",LinkName='" + LinkName + "'"; + + //0370 20260604 母批不走完成状态 + + //if (intStatus != defInteger) + // strSQL += ",Status=" + intStatus; + + if (intGOStatus != defInteger) + strSQL += ",GOStatus=" + intGOStatus; + strSQL += " Where LotNo ='" + MLotNo + "'"; + CollectionSQL.Add(strSQL); + + // 2009/9/10,yumei,更新母批tblWIPTemp_Attrib,tblWIPCont_Attrib資料,NewLot_Split只有更新子批---- + if (intOPStatus == 1) // 站中 + { + var tmp1 = dsTemp.Tables; + var argdtLotState = tmp1["LotState"]; + var tmp2 = dsTemp.Tables; + var argdtTempLotAttrib = tmp2["TempLotAttrib"]; + var tmp3 = dsTemp.Tables; + var argdtLotProperty = tmp3["LotProperty"]; + var tmp4 = dsTemp.Tables; + var argdtLotECNAttrib = tmp4["LotECNAttrib"]; + objLot.UpdLotAttrib(ref MLotNo, ref MNewLotSerial, ref MLogGroupSerial, (double)MCurQty, argdtLotState, argdtTempLotAttrib, dtLotProperty: argdtLotProperty, dtLotECNAttrib: argdtLotECNAttrib, CollectionSQL: CollectionSQL); + + //2023/8/22,Ning,143969: 木林森项目:木林森项目,进站后,站分批,母批出站时会按照原始的inputqty计算物料耗用 + strSQL = "Update tblWIPTemp_LotState Set CurQty = " + MCurQty + " Where LotNo = '" + MLotNo + "'"; + CollectionSQL.Add(strSQL); + } + // ------------------------- + + drAdd = dtSplitCont.NewRow(); + drAdd["ToLotNo"] = MLotNo; + drAdd["ToBaseLotNo"] = dsTemp.Tables["LotState"].Rows[0]["BaseLotNo"]; + drAdd["ToLotSerial"] = MNewLotSerial; + drAdd["ToReverseId"] = MReverseId; + drAdd["ToLotQty"] = MCurQty; + drAdd["MajorLot"] = 1; + dtSplitCont.Rows.Add(drAdd); + + // 母批變更產品 + // ===生產批歷程,新增boolean,判斷母批是否有改產品 + bool blnChgProduct = false; + // === + var drSelMLot = dtSplitLot.Select("SplitLotNo ='" + MLotNo + "'"); + drSel = dsTemp.Tables["LotState"].Select("LotNo ='" + MLotNo + "'"); + + string ProcessNo, ProcessVersion, strECNNo, AttribValue; + decimal decCurQty = Convert.ToDecimal(dsTemp.Tables["LotState"].Rows[0]["CurQty"]); + string MOrgProductNo = dsTemp.Tables["LotState"].Rows[0]["ProductNo"].ToString(); + string MOrgProductVersion = dsTemp.Tables["LotState"].Rows[0]["ProductVersion"].ToString(); + string OPNo = dsTemp.Tables["LotState"].Rows[0]["OPNo"].ToString(); + if ((Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drSelMLot[0]["ProductNo"], MOrgProductNo, false)) || Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drSelMLot[0]["ProductVersion"], MOrgProductVersion, false))) && Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drSelMLot[0]["ProductNo"], defString, false))) + { + + // 取得欲變更的產品單位 + string strUnitNo = ""; + strSQL = "Select * From tblPRDProductBasis Where ProductNo ='" + + drSelMLot[0]["ProductNo"] + "' And ProductVersion='" + drSelMLot[0]["ProductVersion"] + "' "; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strUnitNo = drTemp["UnitNo"].ToString(); + } + drTemp.Close(); + + + // 變更產品 + objLot.ChgProductOperation(MLotNo, UserNo, MOrgProductNo, MOrgProductVersion, Convert.ToString(drSelMLot[0]["ProductNo"]), Convert.ToString(drSelMLot[0]["ProductVersion"]), strUnitNo, + CollectionSQL, RefLotNo: MLotNo); + // ===生產批歷程,新增boolean,判斷母批是否有改產品 + blnChgProduct = true; + // B. 更新Temp Attrib Cont Attrib及Log_Report資料 (若在站中intOPStatus = 1) + // 取得此生產批於此作業站的ECNNo + // 2019/06/04 Edison母批換品號時的OPECN及Temp Attrib Cont Attrib, Log_Report資料 + if (blnIsIC_PKG && blnECN) + { + if (intOPStatus == 1) + { + strSQL = "Select ECNNo_OP From tblWIPLotOPECNRecord Where LotNo = '" + MLotNo + "' And OPNo = '" + OPNo + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strECNNo = drTemp["ECNNo_OP"].ToString(); + } + else + { + throw new iMESException.MESException("0000-200003", "[%OP%] [%ECNNo%]"); + } + drTemp.Close(); + + + strSQL = "Delete From tblWIPTemp_Attrib Where LotNo = '" + MLotNo + "'"; + CollectionSQL.Add(strSQL); + + strSQL = "Delete From tblWIPCont_Attrib Where LogGroupSerial = '" + MLogGroupSerial + "'"; + CollectionSQL.Add(strSQL); + + strSQL = "Select * From tblPRDOPAttrib Where SerialNo = '" + SerialNo + "' And (ECNNo = '" + strECNNo + "' Or ECNNo = 'N/A')"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + // daTemp.SelectCommand = cmmTemp + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "OPAttrib", cnnTemp); + + // drTemp.Close() + + foreach (DataRow drAttrib in dsTemp.Tables["OPAttrib"].Rows) + { + // 變更DefaultValue + if (drAttrib["AttribValue"] is DBNull) + { + AttribValue = ""; + } + else + { + switch (drAttrib["AttribValue"].ToString().ToUpper()) + { + case "NOW": + { + AttribValue = iMES_Format_Date(DateTime.Now, strDataBaseType); + break; + } + + case "LOT CURQTY": + { + AttribValue = decCurQty.ToString(); + break; + } + + default: + { + // 2010/11/25 YF, 預設值若是#GetSpec, 故需傳入ProductNo + AttribValue = Convert.ToString(objLot.ChangeDefaultValue(drAttrib["AttribValue"].ToString(), MLotNo, ProductNo: drSelMLot[0]["ProductNo"].ToString())); + break; + } + } + } + + // Temp + // 2016/01/27 YF, 加入OrgAttribValue, 將AttribNo保留在OrgAttribValue, 在挑選設備時可判斷#GetEQPRecipe + strSQL = "Insert into tblWIPTemp_Attrib(LotNo, AttribType, EquipmentType, AttribNo, AttribSource, AttribPhase, " + " AttribSequence, AttribValue, QCItemNo, OrgAttribValue, SaveToLotPropertyNo)" + " Values('" + MLotNo + "', 0,'" + + drAttrib["EquipmentType"] + "','" + drAttrib["AttribNo"] + "'," + drAttrib["AttribSource"] + "," + drAttrib["AttribPhase"] + + "," + drAttrib["AttribSequence"] + ",'" + AttribValue + "','" + drAttrib["QCItemNo"] + "','" + drAttrib["AttribValue"] + "'"; + if (drAttrib["SaveToLotPropertyNo"] is DBNull) + { + strSQL = strSQL + ",'N/A')"; + } + else + { + strSQL = strSQL + ",'" + drAttrib["SaveToLotPropertyNo"] + "')".ToString(); + } + CollectionSQL.Add(strSQL); + + // Content + strSQL = "Insert into tblWIPCont_Attrib(LotSerial,EquipmentType,AttribNo,AttribValue,LogGroupSerial)" + " Values('" + MNewLotSerial + "','" + + drAttrib["EquipmentType"] + "','" + drAttrib["AttribNo"] + "','" + AttribValue + "','" + OPNo + "')"; + CollectionSQL.Add(strSQL); + + // Lot Property(因之後都以Update的方式更新,故在此先將 TableType=0 的Property,Insert至tblWIPLotProperty) + if (!(drAttrib["SaveToLotPropertyNo"] is DBNull)) + { + // 檢查是否已新增過 + if (aryLotProperty.IndexOf(Strings.UCase(drAttrib["SaveToLotPropertyNo"].ToString())) < 0) + { + strSQL = "Select PropertyNo From tblSYSLotPropertyBasis " + " Where PropertyNo = '" + + drAttrib["SaveToLotPropertyNo"] + "'" + " And TableType = 0 " + " And PropertyNo Not In(Select PropertyNo From tblWIPLotProperty " + + " Where LotNo = '" + MLotNo + "'" + " And PropertyNo ='" + drAttrib["SaveToLotPropertyNo"] + "')"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) // 沒有存在,故須Insert + { + // 因PropertyNo允許大小寫資料,故不可任意轉換,會無法取得資料 + strSQL = "Insert into tblWIPLotProperty (LotNo, PropertyNo, PropertyValue)" + " Values('" + MLotNo + "','" + + drTemp["PropertyNo"] + "','')"; + CollectionSQL.Add(strSQL); + aryLotProperty.Add(Strings.UCase(drAttrib["SaveToLotPropertyNo"].ToString())); + } + drTemp.Close(); + + } + } + } + + // 更新tblWIPLotLog_Report的ECNNo + strSQL = "Update tblWIPLotLog_Report Set ECNNO_OP = '" + strECNNo + "'" + " Where LotNo='" + MLotNo + "' " + " And OPNo='" + OPNo + "'" + " And LoggroupSerial='" + MLogGroupSerial + "'"; + CollectionSQL.Add(strSQL); + } + } + } + + drSel = dtSplitLot.Select("SplitLotNo ='" + MLotNo + "'"); + // 2020/11/9,Ning,0081028: [6.0.5]分批處理,產品變更/流程變更調整, 母批跳流程 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel[0]["Action"], 1, false)) || Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel[0]["Action"], 2, false))) + { + objLot.SetLotStateToNextOP(LotStamp, MLotNo, Convert.ToString(drSel[0]["NodeID"]), EventUserNo: UserNo, EventDescription: EventDescription, colSQL: CollectionSQL, RefLotNo: MLotNo, NewProductNo: Convert.ToString(drSel[0]["ProductNo"]), NewProductVersion: Convert.ToString(drSel[0]["ProductVersion"])); + if (blnIsIC_PKG && blnECN && Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel[0]["Action"], 2, false))) + { + + var dsECN = new DataSet(); + var dtECN = new DataTable(); + dtECN.Columns.Add(new DataColumn("LotNo", Type.GetType("System.String"))); + dtECN.Columns.Add(new DataColumn("OrgLotNo", Type.GetType("System.String"))); + dtECN.Columns.Add(new DataColumn("CustomerLotNo", Type.GetType("System.String"))); + dtECN.Columns.Add(new DataColumn("MONo", Type.GetType("System.String"))); + + drAdd = dtECN.NewRow(); + drAdd["LotNo"] = MLotNo; + drAdd["OrgLotNo"] = dsTemp.Tables["LotState"].Rows[0]["OrgLotNo"].ToString(); + drAdd["CustomerLotNo"] = dsTemp.Tables["LotState"].Rows[0]["CustomerLotNo"].ToString(); + drAdd["MONo"] = dsTemp.Tables["LotState"].Rows[0]["MONo"].ToString(); + dtECN.Rows.Add(drAdd); + + // 依NodeID取得ProcessNo, ProcessVersion, NodeNo + strSQL = "Select ProcessNo, ProcessVersion, NodeNo From tblPRSNodeBasis Where NodeID = '" + + drSel[0]["NodeID"] + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + ProcessNo = drTemp["ProcessNo"].ToString(); + ProcessVersion = drTemp["ProcessVersion"].ToString(); + } + else + { + throw new iMESException.MESException("0000-200003", "NodeBasis of NodeID:" + + drSel[0]["NodeID"] + " is not exist!"); + } + drTemp.Close(); + + + // 取得流程各站的ECNNo_OP + dsECN = objLot.ShowECNOPData(drSel[0]["ProductNo"].ToString(), drSel[0]["ProductVersion"].ToString(), dtECN, ProcessNo, ProcessVersion); + + // 先刪 + strSQL = "Delete From TBLWIPLOTOPECNRECORD where LotNo='" + MLotNo + "'"; + CollectionSQL.Add(strSQL); + + foreach (DataRow drECN in dsECN.Tables[0].Rows) + { + strSQL = "Insert into TBLWIPLotOPECNRecord(LotNo,OPNo,ECNNo_OP,Creator,CreateDate,ECNType,AreaNo) " + "Values('" + MLotNo + "','" + drECN["OPNo"].ToString() + "','" + drECN["ECNNo"].ToString() + "','" + UserNo + "', " + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'" + drECN["ECNType"].ToString() + "','" + drECN["AreaNo"].ToString() + "')"; + CollectionSQL.Add(strSQL); + } + + if (dsECN != null) + dsECN = null; + } + } + // =====94661,生產批歷程 Phase II LotState變更紀錄 + var objChangeData = new iMESWIPReleaseLogHandler.clsLotReleaseLogHandle.clsLotData.clsChangeLot(); + objChangeData.SplitType = SplitType; + objChangeData.FromLotNo = MLotNo; + objChangeData.FromLotSerial = MLotSerial; + objChangeData.ToLotNo = MLotNo; + objChangeData.ToLotSerial = MNewLotSerial; + var clsLotData = new iMESWIPReleaseLogHandler.clsLotReleaseLogHandle.clsLotData(); + clsLotData.ProductNo = dsTemp.Tables["LotState"].Rows[0]["ProductNo"].ToString(); + clsLotData.ProductVersion = dsTemp.Tables["LotState"].Rows[0]["ProductVersion"].ToString(); + clsLotData.CurQty = MCurQty; + clsLotData.CurUnitNo = dsTemp.Tables["LotState"].Rows[0]["CurUnitNo"].ToString(); + clsLotData.SysQty = SysQty; + clsLotData.SysUnitNo = dsTemp.Tables["LotState"].Rows[0]["SysUnitNo"].ToString(); + if (drSel[0]["OPNo"].ToString() != dsTemp.Tables["LotState"].Rows[0]["OPNo"].ToString() || drSel[0]["NodeId"].ToString() != dsTemp.Tables["LotState"].Rows[0]["NodeId"].ToString()) + { + clsLotData.OPNo = drSel[0]["OPNo"].ToString(); + clsLotData.NodeId = drSel[0]["NodeID"].ToString(); + } + else + { + clsLotData.OPNo = dsTemp.Tables["LotState"].Rows[0]["OPNo"].ToString(); + clsLotData.NodeId = dsTemp.Tables["LotState"].Rows[0]["NodeId"].ToString(); + } + objLotLog.funCreateSQL(clsLotData, ChangeLotData: objChangeData, LotNo: MLotNo, LotSerial: MNewLotSerial, LogGroupSerial: MLogGroupSerial, SysActiveId: 4, ReferenceLotNo: MLotNo); + // === + // === 2021/09/08 Troy mantis:94662 生產批下線後執行動作紀錄 phase III 改產品 + if (blnChgProduct == true) + { + var objChangeProduct = new iMESWIPReleaseLogHandler.clsLotReleaseLogHandle.clsLotData.clsChangeProduct(); + var clsLotData2 = new iMESWIPReleaseLogHandler.clsLotReleaseLogHandle.clsLotData(); + objChangeProduct.FromProductNo = dsTemp.Tables["LotState"].Rows[0]["ProductNo"].ToString(); + objChangeProduct.FromProductVersion = dsTemp.Tables["LotState"].Rows[0]["ProductVersion"].ToString(); + objChangeProduct.ToProductNo = drSelMLot[0]["ProductNo"].ToString(); + objChangeProduct.ToProductVersion = drSelMLot[0]["ProductVersion"].ToString(); + objChangeProduct.ChangePRDType = 4; + clsLotData2.ProductNo = drSelMLot[0]["ProductNo"].ToString(); + clsLotData2.ProductVersion = drSelMLot[0]["ProductVersion"].ToString(); + clsLotData2.CurQty = MCurQty; + clsLotData2.CurUnitNo = dsTemp.Tables["LotState"].Rows[0]["CurUnitNo"].ToString(); + clsLotData2.SysQty = SysQty; + clsLotData2.SysUnitNo = dsTemp.Tables["LotState"].Rows[0]["SysUnitNo"].ToString(); + if (drSelMLot[0]["OPNo"].ToString() != dsTemp.Tables["LotState"].Rows[0]["OPNo"].ToString() || drSelMLot[0]["NodeId"].ToString() != dsTemp.Tables["LotState"].Rows[0]["NodeId"].ToString()) + { + clsLotData2.OPNo = drSelMLot[0]["OPNo"].ToString(); + clsLotData2.NodeId = drSelMLot[0]["NodeID"].ToString(); + } + else + { + clsLotData2.OPNo = dsTemp.Tables["LotState"].Rows[0]["OPNo"].ToString(); + clsLotData2.NodeId = dsTemp.Tables["LotState"].Rows[0]["NodeId"].ToString(); + } + objLotLog.funCreateSQL(clsLotData2, ChangeProductData: objChangeProduct, LotNo: MLotNo, LotSerial: MNewLotSerial, LogGroupSerial: dsTemp.Tables["LotState"].Rows[0]["LogGroupSerial"].ToString(), SysActiveId: 6, ReferenceLotNo: MLotNo); + blnChgProduct = false; + } + // === + // 派工處理,子批有繼承母批批號,不須做任何處理 + // 母批已處理完成,將母批移除 + drSel = dtSplitLot.Select("SplitLotNo ='" + MLotNo + "'"); + dtSplitLot.Rows.Remove(drSel[0]); + dtSplitLot.AcceptChanges(); + + if (intOPStatus == 1) // 站中,產生一筆對應的LotLog + { + strSQL = "Insert into tblWIPLotLog (LogGroupSerial,LotNo,LotSerial,OPNo,NodeID,BaseLotNo,StartTime,EndTime,Status,AreaNo,ModuleNo,ModuleVersion,OPGroupNo) " + " Values ('" + + dsTemp.Tables["LotState"].Rows[0]["LogGroupSerial"] + "','" + MLotNo + "','" + MNewLotSerial + "','" + dsTemp.Tables["LotState"].Rows[0]["OPNo"] + + "','" + dsTemp.Tables["LotState"].Rows[0]["NodeId"] + "','" + dsTemp.Tables["LotState"].Rows[0]["BaseLotNo"] + "'," + "To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + + "','YYYY/MM/DD HH24:MI:SS')," + "To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), 0, '" + + dsTemp.Tables["LotState"].Rows[0]["AreaNo"] + "','" + dsTemp.Tables["LotState"].Rows[0]["ModuleNo"] + "','" + dsTemp.Tables["LotState"].Rows[0]["ModuleVersion"] + + "', '" + dsTemp.Tables["LotState"].Rows[0]["OPGroupNo"] + "')"; + CollectionSQL.Add(strSQL); + } + + if (blnWIPInv) + { + // 更新母批分批數量 + strSQL = "Update tblINVWIPInventory_Semi Set QTY = " + MCurQty; + strSQL += " Where InventoryNo = '" + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["INVENTORYNO"].ToString() + "'"; + strSQL += " And LotNo = '" + MLotNo + "'"; + CollectionSQL.Add(strSQL); + + // 2019/04/25 Lena, 在製品庫分批且生產批狀態已為99結批,不建立還原點 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(dsTemp.Tables["LotState"].Rows[0]["LotState"], 99, false))) + { + // Undo + strSQL = "Update tblINVWIPInventory_Semi Set QTY = " + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["QTY"].ToString(); + strSQL += " Where InventoryNo = '" + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["INVENTORYNO"].ToString() + "'"; + strSQL += " And LotNo = '" + MLotNo + "'"; + Collection argcolSQL_Rows1 = null; + objReverse.AddReverseUpdateContent(ref MNewLotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows1); + } + } + } + + // 併回,在併回處理未刪除. + + // 多人加工不需做任何處理. + else + { + decimal decFinalFailQty = defInteger; + + if (intOPStatus == 1) + { + // 不要ReleaseEQP,子批仍在使用. + decimal FinalGoodQtyTmp = defInteger, FinalFailQtyTmp = defInteger; + objLot.EndOP(ref FinalGoodQtyTmp, ref decFinalFailQty, MLotNo, MNewLotSerial, datEventTime, CollectionSQL, UserNo, EventDescription: EventDescription, CalculateEMP: false); + + // 2011/11/07 YF, 因母批在站中, 且不保留母批, EndOP也未ReleaseEQP, 故另外計算母批人時機時*********************************** + // Call SHR_CalculateResource(MLotNo, MLogGroupSerial, MLotSerial, MNewLotSerial, UserNo, datEventTime, cnnTemp, CollectionSQL, , dsTemp.Tables("LotState").Rows(0)("CurQty")) + + // 2017/12/01,Sammi.人時AutoRun平攤需求,將上工下工資料,整合入舊的多人加工機制. + // 2018/04/24,Sammi.分批時,結算人時允許無上下工資料. + using (var obj = new kcWIP.clsOperatorState()) + { + var locCollectionSQL_Rows = new Collection(); + obj.SHR_CO_EMP(ref cnnTemp, ref CollectionSQL, ref locCollectionSQL_Rows, ref objReverse, UserNo, datEventTime, datEventTime, MLotNo, Convert.ToDecimal(dsTemp.Tables["LotState"].Rows[0]["CurQty"]), NewLotSerial: MNewLotSerial, EMPAllowPass: true); + } + + objLot.SHR_COEquipment_N_Release(ref cnnTemp, ref CollectionSQL, MLotNo, MLogGroupSerial, MNewLotSerial, UserNo, datEventTime, InputQty: Convert.ToDecimal(dsTemp.Tables["LotState"].Rows[0]["CurQty"])); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["LotState"].Rows[0]["OPReference"], 1, false))) + { + // 不正常結束,CompleteFlag=0. + objLot.EndModule(MLotNo, MNewLotSerial, datEventTime, CollectionSQL, EventUserNo: UserNo, EventDescription: EventDescription, CompleteFlag: 0, UnUpdateFailQty: decFinalFailQty); + } + + // 2007/07/13,sammi.tblWIPLotBasis vs tblWIPLotState的對應方式. + // objDBCom.Split1To1,True:1對1(要檢查母批LotBasis是否要結批),False:1對多(不用檢查). + objLot.CloseLot(MLotNo, 100, CollectionSQL, objDBCom.Split1To1, MNewLotSerial, EventTime: datEventTime, EventUserNo: UserNo, EventDescription: EventDescription); + // === 2021/09/08 Troy mantis:94662 生產批下線後執行動作紀錄 phase III closeLot + objLotLog.funCreateSQL(new iMESWIPReleaseLogHandler.clsLotReleaseLogHandle.clsLotData() + { ProductNo = dsTemp.Tables["LotState"].Rows[0]["ProductNo"].ToString(), ProductVersion = dsTemp.Tables["LotState"].Rows[0]["ProductVersion"].ToString(), CurQty = Convert.ToDecimal(dsTemp.Tables["LotState"].Rows[0]["CurQty"]), CurUnitNo = Convert.ToString(dsTemp.Tables["LotState"].Rows[0]["CurUnitNo"]), SysQty = Convert.ToDecimal(dsTemp.Tables["LotState"].Rows[0]["CurQty"]), SysUnitNo = Convert.ToString(dsTemp.Tables["LotState"].Rows[0]["SysUnitNo"]), OPNo = Convert.ToString(dsTemp.Tables["LotState"].Rows[0]["OPNo"]), NodeId = Convert.ToString(dsTemp.Tables["LotState"].Rows[0]["NodeId"]), CloseType = 1 }, LotNo: MLotNo, LotSerial: MNewLotSerial, SysActiveId: 17, ReferenceLotNo: MLotNo); + // === + // 派工處理,找出母批派工之設備 + strSQL = "Select EquipmentNo From tblEMSDispatchState Where LotNo = '" + MLotNo + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) // 是 + { + // 將母批的派工資料拿掉,並重新取出Order + objLot.UpdEQPDispatch(Convert.ToString(drTemp["EquipmentNo"]), MLotNo, MNewLotSerial, CollectionSQL); + } + drTemp.Close(); + + } + + // 6.子批---------------------------------------------------------------------------------------------------------------- + string NewBaseLotNo = ""; + decimal decSLotSysQty = defInteger; + + var loopTo1 = dtSplitLot.Rows.Count - 1; + for (i = 0; i <= loopTo1; i++) + { + SLotNo = dtSplitLot.Rows[i]["SplitLotNo"].ToString().ToUpper(); + SLotSerial = objLot.InitLotSerial(SLotNo); + + // 2019/04/25 Lena, 在製品庫分批且生產批狀態已為99結批,不建立還原點 + if (!blnWIPInv || Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(dsTemp.Tables["LotState"].Rows[0]["LotState"], 99, false))) + { + var tmp5 = dsTemp.Tables["LotState"].Rows[0]; + string argOPNo1 = tmp5["OPNo"].ToString(); + udReverse.clsReverse.ReverseType revTypeTmp = udReverse.clsReverse.ReverseType.Split_To; + SReverseId = objReverse.NewReverseID(ref SLotNo, ref revTypeTmp, ref SLotSerial, ref argOPNo1, ref CollectionSQL, Description: "BR Manual Split(To Lot)", Creator: UserNo, CreateDate: datEventTime); + tmp5["OPNo"] = argOPNo1; + } + + + if (blnHaveSysQty) + { + decSLotSysQty = Convert.ToDecimal(dtSplitLot.Rows[i]["SplitSysQty"]); + } + // === 2021/09/08 Troy mantis:94662 生產批下線後執行動作紀錄 phase III + string NewLotGroupSerial = ""; + if (!string.IsNullOrEmpty(NewLotGroupSerial)) + { + NewLotGroupSerial = null; + } + bool blnChgProduct = false; + // === + int iAction = -1; + if (!int.TryParse(dtSplitLot.Rows[i]["Action"].ToString(), out iAction)) + iAction = -1; + switch (iAction) + { + case 0: // Go + { + if (intOPStatus == 1) + { + if (SplitType == 1) // BR分批 + { + if (LinkName == "HOLD") + { + var tmp6 = dtSplitLot.Rows[i]; + decimal argNewLotCurQty = Convert.ToDecimal(tmp6["SplitLotQty"]); + var tmp7 = dtSplitLot.Rows[i]; + int argNewReturnType = Conversions.ToInteger(tmp7["ReturnType"]); + int argNewStatus = 3; + bool argTriggerOP = true; + string argLinkName = "HOLD"; + var tmp8 = dsTemp.Tables; + var argdtLotState1 = tmp8["LotState"]; + var tmp9 = dsTemp.Tables; + var argdtLotProperty1 = tmp9["LotProperty"]; + var tmp10 = dsTemp.Tables; + var argdtLotProcess = tmp10["LotProcess"]; + var tmp11 = dsTemp.Tables; + var argdtOPGroupState = tmp11["OPGroupState"]; + var tmp12 = dsTemp.Tables; + var argdtTempLotAttrib1 = tmp12["TempLotAttrib"]; + var tmp13 = dsTemp.Tables; + var argdtTempMaterial = tmp13["TempMaterial"]; + var tmp14 = dsTemp.Tables; + var argdtTempEquipment = tmp14["TempEquipment"]; + var tmp15 = dsTemp.Tables; + var argdtTempQCItem = tmp15["TempQCItem"]; + var tmp16 = dsTemp.Tables; + var argdtLotECNAttrib1 = tmp16["LotECNAttrib"]; + var tmp17 = dtSplitLot.Rows[i]; + string argNewProductNo = tmp17["ProductNo"].ToString(); + var tmp18 = dtSplitLot.Rows[i]; + string argNewProductVersion = tmp18["ProductVersion"].ToString(); + int argGoStatus = 4; + decimal argNewLotSysQtyLog = -999m; + + bool NewLotBasisTmp = false; + DataTable dtContAccTmp = null; + objLot.NewLot_Split(ref NewLotBasisTmp, ref argGoStatus, ref NewLotGroupSerial, ref dtContAccTmp, ref NewBaseLotNo, ref argNewLotSysQtyLog, + MLotNo, MNewLotSerial, SLotNo, ref SLotSerial, + argNewLotCurQty, CollectionSQL, SerialNo, argNewReturnType, NewStatus: argNewStatus, TriggerOP: argTriggerOP, LinkName: argLinkName, dtLotState: argdtLotState1, dtLotProperty: argdtLotProperty1, dtLotProcess: argdtLotProcess, dtOPGroupState: argdtOPGroupState, dtTempLotAttrib: argdtTempLotAttrib1, dtTempMaterial: argdtTempMaterial, dtTempEquipment: argdtTempEquipment, dtTempQCItem: argdtTempQCItem, dtLotECNAttrib: argdtLotECNAttrib1, NewProductNo: argNewProductNo, NewProductVersion: argNewProductVersion, + Creator: UserNo, datEventTime: datEventTime, NewLotSysQty: decSLotSysQty, SplitType: SplitType, blnIsIC_PKG: blnIsIC_PKG); + tmp6["SplitLotQty"] = argNewLotCurQty; + tmp7["ReturnType"] = argNewReturnType; + tmp17["ProductNo"] = argNewProductNo; + tmp18["ProductVersion"] = argNewProductVersion; + } + + else if (LinkName == "WAIT") + { + var tmp33 = dtSplitLot.Rows[i]; + decimal argNewLotCurQty2 = Convert.ToDecimal(tmp33["SplitLotQty"]); + var tmp34 = dtSplitLot.Rows[i]; + int argNewReturnType2 = Conversions.ToInteger(tmp34["ReturnType"]); + int argNewStatus2 = 2; + bool argTriggerOP2 = true; + string argLinkName1 = "WAIT"; + var tmp35 = dsTemp.Tables; + var argdtLotState3 = tmp35["LotState"]; + var tmp36 = dsTemp.Tables; + var argdtLotProperty3 = tmp36["LotProperty"]; + var tmp37 = dsTemp.Tables; + var argdtLotProcess2 = tmp37["LotProcess"]; + var tmp38 = dsTemp.Tables; + var argdtOPGroupState2 = tmp38["OPGroupState"]; + var tmp39 = dsTemp.Tables; + var argdtTempLotAttrib3 = tmp39["TempLotAttrib"]; + var tmp40 = dsTemp.Tables; + var argdtTempMaterial2 = tmp40["TempMaterial"]; + var tmp41 = dsTemp.Tables; + var argdtTempEquipment2 = tmp41["TempEquipment"]; + var tmp42 = dsTemp.Tables; + var argdtTempQCItem2 = tmp42["TempQCItem"]; + var tmp43 = dsTemp.Tables; + var argdtLotECNAttrib3 = tmp43["LotECNAttrib"]; + var tmp44 = dtSplitLot.Rows[i]; + string argNewProductNo2 = tmp44["ProductNo"].ToString(); + var tmp45 = dtSplitLot.Rows[i]; + string argNewProductVersion2 = tmp45["ProductVersion"].ToString(); + int argGoStatus1 = 4; + decimal argNewLotSysQtyLog2 = -999m; + + bool NewLotBasisTmp = false; + DataTable dtContAccTmp = null; + objLot.NewLot_Split(ref NewLotBasisTmp, ref argGoStatus1, ref NewLotGroupSerial, ref dtContAccTmp, ref NewBaseLotNo, ref argNewLotSysQtyLog2, + MLotNo, MNewLotSerial, SLotNo, ref SLotSerial, + argNewLotCurQty2, CollectionSQL, SerialNo, argNewReturnType2, NewStatus: argNewStatus2, TriggerOP: argTriggerOP2, LinkName: argLinkName1, dtLotState: argdtLotState3, dtLotProperty: argdtLotProperty3, dtLotProcess: argdtLotProcess2, dtOPGroupState: argdtOPGroupState2, dtTempLotAttrib: argdtTempLotAttrib3, dtTempMaterial: argdtTempMaterial2, dtTempEquipment: argdtTempEquipment2, dtTempQCItem: argdtTempQCItem2, dtLotECNAttrib: argdtLotECNAttrib3, NewProductNo: argNewProductNo2, NewProductVersion: argNewProductVersion2, + Creator: UserNo, datEventTime: datEventTime, NewLotSysQty: decSLotSysQty, SplitType: SplitType, blnIsIC_PKG: blnIsIC_PKG); + tmp33["SplitLotQty"] = argNewLotCurQty2; + tmp34["ReturnType"] = argNewReturnType2; + tmp44["ProductNo"] = argNewProductNo2; + tmp45["ProductVersion"] = argNewProductVersion2; + } + else + { + // Status(4:代表成功完成BR,紀錄LinkName若TransferLot失敗可以重新再執行TransferLot) + var tmp19 = dtSplitLot.Rows[i]; + decimal argNewLotCurQty1 = Convert.ToDecimal(tmp19["SplitLotQty"]); + var tmp20 = dtSplitLot.Rows[i]; + int argNewReturnType1 = Conversions.ToInteger(tmp20["ReturnType"]); + int argNewStatus1 = 4; + bool argTriggerOP1 = true; + var tmp21 = dsTemp.Tables; + var argdtLotState2 = tmp21["LotState"]; + var tmp22 = dsTemp.Tables; + var argdtLotProperty2 = tmp22["LotProperty"]; + var tmp23 = dsTemp.Tables; + var argdtLotProcess1 = tmp23["LotProcess"]; + var tmp24 = dsTemp.Tables; + var argdtOPGroupState1 = tmp24["OPGroupState"]; + var tmp25 = dsTemp.Tables; + var argdtTempLotAttrib2 = tmp25["TempLotAttrib"]; + var tmp26 = dsTemp.Tables; + var argdtTempMaterial1 = tmp26["TempMaterial"]; + var tmp27 = dsTemp.Tables; + var argdtTempEquipment1 = tmp27["TempEquipment"]; + var tmp28 = dsTemp.Tables; + var argdtTempQCItem1 = tmp28["TempQCItem"]; + var tmp29 = dsTemp.Tables; + var argdtLotECNAttrib2 = tmp29["LotECNAttrib"]; + var tmp30 = dtSplitLot.Rows[i]; + string argNewProductNo1 = tmp30["ProductNo"].ToString(); + var tmp31 = dtSplitLot.Rows[i]; + string argNewProductVersion1 = tmp31["ProductVersion"].ToString(); + var tmp32 = dsTemp.Tables; + var argdtLotLoginState = tmp32["LotLoginState"]; + decimal argNewLotSysQtyLog1 = -999m; + + bool NewLotBasisTmp = false; + int GoStatusTmp = defInteger; + DataTable dtContAccTmp = null; + objLot.NewLot_Split(ref NewLotBasisTmp, ref GoStatusTmp, ref NewLotGroupSerial, ref dtContAccTmp, ref NewBaseLotNo, ref argNewLotSysQtyLog1, + MLotNo, MNewLotSerial, SLotNo, ref SLotSerial, + argNewLotCurQty1, CollectionSQL, SerialNo, argNewReturnType1, NewStatus: argNewStatus1, TriggerOP: argTriggerOP1, LinkName: LinkName, dtLotState: argdtLotState2, dtLotProperty: argdtLotProperty2, dtLotProcess: argdtLotProcess1, dtOPGroupState: argdtOPGroupState1, dtTempLotAttrib: argdtTempLotAttrib2, dtTempMaterial: argdtTempMaterial1, dtTempEquipment: argdtTempEquipment1, dtTempQCItem: argdtTempQCItem1, dtLotECNAttrib: argdtLotECNAttrib2, NewProductNo: argNewProductNo1, NewProductVersion: argNewProductVersion1, + Creator: UserNo, datEventTime: datEventTime, NewLotSysQty: decSLotSysQty, dtLotLoginState: argdtLotLoginState, SplitType: SplitType, blnIsIC_PKG: blnIsIC_PKG); + tmp19["SplitLotQty"] = argNewLotCurQty1; + tmp20["ReturnType"] = argNewReturnType1; + tmp30["ProductNo"] = argNewProductNo1; + tmp31["ProductVersion"] = argNewProductVersion1; + } + } + + else // 站中手動分批 + { + // 因目前狀態可能是complete,故須保留LinkName. + // 2020/02/12 Eric Mantis:0067304(分批未繼承ECN) 補上傳入ECN繼承參數 + var tmp46 = dtSplitLot.Rows[i]; + decimal argNewLotCurQty3 = Convert.ToDecimal(tmp46["SplitLotQty"]); + var tmp47 = dtSplitLot.Rows[i]; + int argNewReturnType3 = Conversions.ToInteger(tmp47["ReturnType"]); + bool argTriggerOP3 = true; + var tmp48 = dsTemp.Tables; + var argdtLotState4 = tmp48["LotState"]; + var tmp49 = dsTemp.Tables; + var argdtLotProperty4 = tmp49["LotProperty"]; + var tmp50 = dsTemp.Tables; + var argdtLotProcess3 = tmp50["LotProcess"]; + var tmp51 = dsTemp.Tables; + var argdtOPGroupState3 = tmp51["OPGroupState"]; + var tmp52 = dsTemp.Tables; + var argdtTempLotAttrib4 = tmp52["TempLotAttrib"]; + var tmp53 = dsTemp.Tables; + var argdtTempMaterial3 = tmp53["TempMaterial"]; + var tmp54 = dsTemp.Tables; + var argdtTempEquipment3 = tmp54["TempEquipment"]; + var tmp55 = dsTemp.Tables; + var argdtTempQCItem3 = tmp55["TempQCItem"]; + var tmp56 = dsTemp.Tables; + var argdtLotECNAttrib4 = tmp56["LotECNAttrib"]; + var tmp57 = dtSplitLot.Rows[i]; + string argNewProductNo3 = tmp57["ProductNo"].ToString(); + var tmp58 = dtSplitLot.Rows[i]; + string argNewProductVersion3 = tmp58["ProductVersion"].ToString(); + var tmp59 = dsTemp.Tables; + var argdtLotLoginState1 = tmp59["LotLoginState"]; + decimal argNewLotSysQtyLog3 = -999m; + + bool NewLotBasisTmp = false; + int GoStatusTmp = defInteger; + DataTable dtContAccTmp = null; + objLot.NewLot_Split(ref NewLotBasisTmp, ref GoStatusTmp, ref NewLotGroupSerial, ref dtContAccTmp, ref NewBaseLotNo, ref argNewLotSysQtyLog3, + MLotNo, MNewLotSerial, SLotNo, ref SLotSerial, + argNewLotCurQty3, CollectionSQL, SerialNo, argNewReturnType3, TriggerOP: argTriggerOP3, LinkName: dsTemp.Tables["LotState"].Rows[0]["LinkName"].ToString(), + dtLotState: argdtLotState4, dtLotProperty: argdtLotProperty4, dtLotProcess: argdtLotProcess3, dtOPGroupState: argdtOPGroupState3, dtTempLotAttrib: argdtTempLotAttrib4, + dtTempMaterial: argdtTempMaterial3, dtTempEquipment: argdtTempEquipment3, dtTempQCItem: argdtTempQCItem3, + dtLotECNAttrib: argdtLotECNAttrib4, NewProductNo: argNewProductNo3, NewProductVersion: argNewProductVersion3, + Creator: UserNo, datEventTime: datEventTime, NewLotSysQty: decSLotSysQty, dtLotLoginState: argdtLotLoginState1, SplitType: SplitType, blnIsIC_PKG: blnIsIC_PKG); + tmp46["SplitLotQty"] = argNewLotCurQty3; + tmp47["ReturnType"] = argNewReturnType3; + tmp57["ProductNo"] = argNewProductNo3; + tmp58["ProductVersion"] = argNewProductVersion3; + } + } + + else // 站間手動分批 + { + // 因可能是臨時外包分批,故LinkName要繼承. + // 2020/02/12 Eric Mantis:0067304(分批未繼承ECN) 補上傳入ECN繼承參數 + var tmp60 = dtSplitLot.Rows[i]; + decimal argNewLotCurQty4 = Convert.ToDecimal(tmp60["SplitLotQty"]); + var tmp61 = dtSplitLot.Rows[i]; + int argNewReturnType4 = Conversions.ToInteger(tmp61["ReturnType"]); + bool argTriggerOP4 = false; + string argLinkName2 = dsTemp.Tables["LotState"].Rows[0]["LinkName"].ToString(); + var tmp62 = dsTemp.Tables; + var argdtLotState5 = tmp62["LotState"]; + var tmp63 = dsTemp.Tables; + var argdtLotProperty5 = tmp63["LotProperty"]; + var tmp64 = dsTemp.Tables; + var argdtLotProcess4 = tmp64["LotProcess"]; + var tmp65 = dsTemp.Tables; + var argdtOPGroupState4 = tmp65["OPGroupState"]; + var tmp66 = dsTemp.Tables; + var argdtLotECNAttrib5 = tmp66["LotECNAttrib"]; + var tmp67 = dtSplitLot.Rows[i]; + string argNewProductNo4 = tmp67["ProductNo"].ToString(); + var tmp68 = dtSplitLot.Rows[i]; + string argNewProductVersion4 = tmp68["ProductVersion"].ToString(); + decimal argNewLotSysQtyLog4 = -999m; + + bool NewLotBasisTmp = false; + int GoStatusTmp = defInteger; + DataTable dtContAccTmp = null; + objLot.NewLot_Split(ref NewLotBasisTmp, ref GoStatusTmp, ref NewLotGroupSerial, ref dtContAccTmp, ref NewBaseLotNo, ref argNewLotSysQtyLog4, + MLotNo, MNewLotSerial, SLotNo, ref SLotSerial, + argNewLotCurQty4, CollectionSQL, NewReturnType: argNewReturnType4, TriggerOP: argTriggerOP4, LinkName: argLinkName2, dtLotState: argdtLotState5, dtLotProperty: argdtLotProperty5, dtLotProcess: argdtLotProcess4, dtOPGroupState: argdtOPGroupState4, dtLotECNAttrib: argdtLotECNAttrib5, NewProductNo: argNewProductNo4, NewProductVersion: argNewProductVersion4, + Creator: UserNo, datEventTime: datEventTime, NewLotSysQty: decSLotSysQty, SplitType: SplitType, blnIsIC_PKG: blnIsIC_PKG); + tmp60["SplitLotQty"] = argNewLotCurQty4; + tmp61["ReturnType"] = argNewReturnType4; + tmp67["ProductNo"] = argNewProductNo4; + tmp68["ProductVersion"] = argNewProductVersion4; + } + + + // 檢查是否為倉庫分批 + if (blnWIPInv) + { + // 目前規則一批只能出現在一個庫房 + if (dsTemp.Tables["WIPInv_RefLot"] != null && dsTemp.Tables["WIPInv_RefLot"].Rows.Count == 1) + { + + // 將資訊複製給子批 + strSQL = "INSERT INTO tblINVWIPInventory_Semi (INVENTORYNO,PRODUCTNO,LOTNO, "; + strSQL += "UNITNO,QTY,INPUTDATE,BASELOTNO,BOUGHTEN,BOOKINGFLAG,PRODUCTVERSION) "; + strSQL += " VALUES ('" + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["INVENTORYNO"].ToString() + "', "; + strSQL += " '" + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["PRODUCTNO"].ToString() + "', "; + strSQL += " '" + SLotNo + "', "; + strSQL += " '" + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["UNITNO"].ToString() + "', "; + strSQL = strSQL + " " + dtSplitLot.Rows[i]["SplitLotQty"] + ", ".ToString(); + strSQL += " TO_DATE('" + Strings.Format(dsTemp.Tables["WIPInv_RefLot"].Rows[0]["INPUTDATE"], "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), "; + strSQL += " '" + NewBaseLotNo + "',"; + strSQL += " " + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["BOUGHTEN"].ToString() + ", "; + strSQL += " " + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["BOOKINGFLAG"].ToString() + ", "; + strSQL += " '" + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["PRODUCTVERSION"].ToString() + "')"; + + SQLCommandTuning(DataBaseType, ref strSQL); + CollectionSQL.Add(strSQL); + + // 2019/04/25 Lena, 在製品庫分批且生產批狀態已為99結批,不建立還原點 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(dsTemp.Tables["LotState"].Rows[0]["LotState"], 99, false))) + { + // Undo + strSQL = "Delete From tblINVWIPInventory_Semi Where InventoryNo = '" + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["INVENTORYNO"].ToString() + "'" + " And LotNo = '" + SLotNo + "'"; + Collection argcolSQL_Rows2 = null; + objReverse.AddReverseUpdateContent(ref SLotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows2); + } + + } + + } + break; + } + + + case 1: + case 2: // Jump OP,Jump Process '2020/02/12 Eric Mantis:0067304(分批未繼承ECN) 補上傳入ECN繼承參數 + { + var tmp69 = dtSplitLot.Rows[i]; + decimal argNewLotCurQty5 = Convert.ToDecimal(tmp69["SplitLotQty"]); + var tmp70 = dtSplitLot.Rows[i]; + int argNewReturnType5 = Conversions.ToInteger(tmp70["ReturnType"]); + var tmp71 = dtSplitLot.Rows[i]; + string argNewNodeId = tmp71["NodeID"].ToString(); + int argNewStatus3 = 0; + bool argTriggerOP5 = false; + var tmp72 = dsTemp.Tables; + var argdtLotState6 = tmp72["LotState"]; + var tmp73 = dsTemp.Tables; + var argdtLotProperty6 = tmp73["LotProperty"]; + var tmp74 = dsTemp.Tables; + var argdtLotProcess5 = tmp74["LotProcess"]; + var tmp75 = dsTemp.Tables; + var argdtOPGroupState5 = tmp75["OPGroupState"]; + var tmp76 = dsTemp.Tables; + var argdtLotECNAttrib6 = tmp76["LotECNAttrib"]; + var tmp77 = dtSplitLot.Rows[i]; + string argNewProductNo5 = tmp77["ProductNo"].ToString(); + var tmp78 = dtSplitLot.Rows[i]; + string argNewProductVersion5 = tmp78["ProductVersion"].ToString(); + decimal argNewLotSysQtyLog5 = -999m; + + bool NewLotBasisTmp = false; + int GoStatusTmp = defInteger; + DataTable dtContAccTmp = null; + objLot.NewLot_Split(ref NewLotBasisTmp, ref GoStatusTmp, ref NewLotGroupSerial, ref dtContAccTmp, ref NewBaseLotNo, ref argNewLotSysQtyLog5, + MLotNo, MNewLotSerial, SLotNo, ref SLotSerial, + argNewLotCurQty5, CollectionSQL, NewReturnType: argNewReturnType5, NewNodeId: argNewNodeId, NewStatus: argNewStatus3, TriggerOP: argTriggerOP5, dtLotState: argdtLotState6, dtLotProperty: argdtLotProperty6, dtLotProcess: argdtLotProcess5, dtOPGroupState: argdtOPGroupState5, dtLotECNAttrib: argdtLotECNAttrib6, NewProductNo: argNewProductNo5, NewProductVersion: argNewProductVersion5, + Creator: UserNo, datEventTime: datEventTime, NewLotSysQty: decSLotSysQty, SplitType: SplitType, blnIsIC_PKG: blnIsIC_PKG); + tmp69["SplitLotQty"] = argNewLotCurQty5; + tmp70["ReturnType"] = argNewReturnType5; + tmp71["NodeID"] = argNewNodeId; + tmp77["ProductNo"] = argNewProductNo5; + tmp78["ProductVersion"] = argNewProductVersion5; + break; + } + } + + + drAdd = dtSplitCont.NewRow(); + drAdd["ToLotNo"] = SLotNo; + drAdd["ToBaseLotNo"] = NewBaseLotNo; + drAdd["ToLotSerial"] = SLotSerial; + drAdd["ToReverseId"] = SReverseId; + drAdd["ToLotQty"] = dtSplitLot.Rows[i]["SplitLotQty"]; + if (!blnHaveFromLot && i == 0) + { + drAdd["MajorLot"] = 1; + } + else + { + drAdd["MajorLot"] = 0; + } + dtSplitCont.Rows.Add(drAdd); + + // 併回 + if (blnAutoMerge) + { + strSQL = "Insert into tblWIPAutoMerge(FromLotNo,ToLotNo) Values ('" + SLotNo + "','" + AutoMergeToLotNo + "')"; + CollectionSQL.Add(strSQL); + } + + // 2020/11/9 Ning 0081028: [6.0.5]分批處理,產品變更/流程變更調整 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(dtSplitLot.Rows[i]["ProductNo"], dsTemp.Tables["LotState"].Rows[0]["ProductNo"].ToString(), false)) || Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(dtSplitLot.Rows[i]["ProductVersion"], dsTemp.Tables["LotState"].Rows[0]["ProductVersion"].ToString(), false))) + { + // 取得欲變更的產品單位 + string strUnitNo = ""; + strSQL = "Select * From tblPRDProductBasis Where ProductNo ='" + + dtSplitLot.Rows[i]["ProductNo"] + "' And ProductVersion='" + dtSplitLot.Rows[i]["ProductVersion"] + "' "; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strUnitNo = drTemp["UnitNo"].ToString(); + } + drTemp.Close(); + + + // 變更產品 + objLot.ChgProductOperation_SplitLot(SLotNo, UserNo, Convert.ToString(dsTemp.Tables["LotState"].Rows[0]["ProductNo"]), Convert.ToString(dsTemp.Tables["LotState"].Rows[0]["ProductVersion"]), Convert.ToString(dtSplitLot.Rows[i]["ProductNo"]), Convert.ToString(dtSplitLot.Rows[i]["ProductVersion"]), strUnitNo, CollectionSQL, RefLotNo: MLotNo, colToINVLotNo: colToINVLotNo); + // 若是跳流程, 需以跳流程的流程為最終流程 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtSplitLot.Rows[i]["Action"], 1, false)) || Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtSplitLot.Rows[i]["Action"], 2, false))) + { + objLot.SetLotStateToNextOP(LotStamp, SLotNo, Convert.ToString(dtSplitLot.Rows[i]["NodeID"]), EventUserNo: UserNo, EventDescription: EventDescription, colSQL: CollectionSQL, RefLotNo: MLotNo, NewProductNo: Convert.ToString(dtSplitLot.Rows[i]["ProductNo"]), NewProductVersion: Convert.ToString(dtSplitLot.Rows[i]["ProductVersion"])); + + if (blnIsIC_PKG && blnECN && Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtSplitLot.Rows[i]["Action"], 2, false))) + { + + string ProcessNo, ProcessVersion; + var dsECN = new DataSet(); + var dtECN = new DataTable(); + dtECN.Columns.Add("LotNo", Type.GetType("System.String")); + dtECN.Columns.Add("OrgLotNo", Type.GetType("System.String")); + dtECN.Columns.Add("CustomerLotNo", Type.GetType("System.String")); + dtECN.Columns.Add("MONo", Type.GetType("System.String")); + + drAdd = dtECN.NewRow(); + drAdd["LotNo"] = SLotNo; + drAdd["OrgLotNo"] = dsTemp.Tables["LotState"].Rows[0]["OrgLotNo"].ToString(); + drAdd["CustomerLotNo"] = dsTemp.Tables["LotState"].Rows[0]["CustomerLotNo"].ToString(); + drAdd["MONo"] = dsTemp.Tables["LotState"].Rows[0]["MONo"].ToString(); + dtECN.Rows.Add(drAdd); + + // 依NodeID取得ProcessNo, ProcessVersion, NodeNo + strSQL = "Select ProcessNo, ProcessVersion, NodeNo From tblPRSNodeBasis Where NodeID = '" + + dtSplitLot.Rows[i]["NodeID"] + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + ProcessNo = drTemp["ProcessNo"].ToString(); + ProcessVersion = drTemp["ProcessVersion"].ToString(); + } + else + { + throw new iMESException.MESException("0000-200003", "NodeBasis of NodeID:" + + dtSplitLot.Rows[i]["NodeID"] + " is not exist!"); + } + drTemp.Close(); + + + // 取得流程各站的ECNNo_OP + dsECN = objLot.ShowECNOPData(dtSplitLot.Rows[i]["ProductNo"].ToString(), dtSplitLot.Rows[i]["ProductVersion"].ToString(), dtECN, ProcessNo, ProcessVersion); + + // 先刪 + strSQL = "Delete From TBLWIPLOTOPECNRECORD where LotNo='" + SLotNo + "'"; + CollectionSQL.Add(strSQL); + + foreach (DataRow drECN in dsECN.Tables[0].Rows) + { + strSQL = "Insert into TBLWIPLotOPECNRecord(LotNo,OPNo,ECNNo_OP,Creator,CreateDate,ECNType,AreaNo) " + "Values('" + SLotNo + "','" + drECN["OPNo"].ToString() + "','" + drECN["ECNNo"].ToString() + "','" + UserNo + "', " + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'" + drECN["ECNType"].ToString() + "','" + drECN["AreaNo"].ToString() + "')"; + CollectionSQL.Add(strSQL); + } + + if (dsECN != null) + dsECN = null; + } + } + blnChgProduct = true; + } + // =====94661,生產批歷程 Phase II 分批紀錄 + var objChangeData = new iMESWIPReleaseLogHandler.clsLotReleaseLogHandle.clsLotData.clsChangeLot(); + objChangeData.SplitType = SplitType; + objChangeData.FromLotNo = MLotNo; + objChangeData.FromLotSerial = MNewLotSerial; + objChangeData.ToLotNo = SLotNo; + objChangeData.ToLotSerial = SLotSerial; + var clsLotDataSplit = new iMESWIPReleaseLogHandler.clsLotReleaseLogHandle.clsLotData(); + clsLotDataSplit.ProductNo = dsTemp.Tables["LotState"].Rows[0]["ProductNo"].ToString(); + clsLotDataSplit.ProductVersion = dsTemp.Tables["LotState"].Rows[0]["ProductVersion"].ToString(); + clsLotDataSplit.CurQty = Convert.ToDecimal(dtSplitLot.Rows[i]["SplitLotQty"]); + clsLotDataSplit.CurUnitNo = dsTemp.Tables["LotState"].Rows[0]["CurUnitNo"].ToString(); + clsLotDataSplit.SysQty = decSLotSysQty; + clsLotDataSplit.SysUnitNo = dsTemp.Tables["LotState"].Rows[0]["SysUnitNo"].ToString(); + if (dtSplitLot.Rows[i]["OPNo"].ToString() != dsTemp.Tables["LotState"].Rows[0]["OPNo"].ToString() || dtSplitLot.Rows[i]["NodeId"].ToString() != dsTemp.Tables["LotState"].Rows[0]["NodeId"].ToString()) + { + clsLotDataSplit.OPNo = dtSplitLot.Rows[i]["OPNo"].ToString(); + clsLotDataSplit.NodeId = dtSplitLot.Rows[i]["NodeId"].ToString(); + } + else + { + clsLotDataSplit.OPNo = dsTemp.Tables["LotState"].Rows[0]["OPNo"].ToString(); + clsLotDataSplit.NodeId = dsTemp.Tables["LotState"].Rows[0]["NodeId"].ToString(); + } + clsLotDataSplit.LotStamp = 0; + objLotLog.funCreateSQL(clsLotDataSplit, ChangeLotData: objChangeData, LotNo: SLotNo, LotSerial: SLotSerial, LogGroupSerial: NewLotGroupSerial, SysActiveId: 4, ReferenceLotNo: MLotNo); + // === + // === 2021/09/08 Troy mantis:94662 生產批下線後執行動作紀錄 phase III 產品變更紀錄 + if (blnChgProduct == true) + { + var ChangeProduct = new iMESWIPReleaseLogHandler.clsLotReleaseLogHandle.clsLotData.clsChangeProduct(); + ChangeProduct.FromProductNo = dsTemp.Tables["LotState"].Rows[0]["ProductNo"].ToString(); + ChangeProduct.FromProductVersion = dsTemp.Tables["LotState"].Rows[0]["ProductVersion"].ToString(); + ChangeProduct.ToProductNo = dtSplitLot.Rows[i]["ProductNo"].ToString(); + ChangeProduct.ToProductVersion = dtSplitLot.Rows[i]["ProductVersion"].ToString(); + ChangeProduct.ChangePRDType = 4; + var clsLotData3 = new iMESWIPReleaseLogHandler.clsLotReleaseLogHandle.clsLotData(); + clsLotData3.ProductNo = dtSplitLot.Rows[i]["ProductNo"].ToString(); + clsLotData3.ProductVersion = dtSplitLot.Rows[i]["ProductVersion"].ToString(); + clsLotData3.CurQty = Convert.ToDecimal(dtSplitLot.Rows[i]["SplitLotQty"]); + clsLotData3.CurUnitNo = dsTemp.Tables["LotState"].Rows[0]["CurUnitNo"].ToString(); + clsLotData3.SysQty = Convert.ToDecimal(dtSplitLot.Rows[i]["SplitLotQty"]); + clsLotData3.SysUnitNo = dsTemp.Tables["LotState"].Rows[0]["SysUnitNo"].ToString(); + clsLotData3.LotStamp = 0; + // === 2021/09/08 Troy mantis:94662 生產批下線後執行動作紀錄 phase III + if (dtSplitLot.Rows[i]["OPNo"].ToString() != dsTemp.Tables["LotState"].Rows[0]["OPNo"].ToString() || dtSplitLot.Rows[i]["NodeID"].ToString() != dsTemp.Tables["LotState"].Rows[0]["NodeID"].ToString()) + { + clsLotData3.OPNo = dtSplitLot.Rows[i]["OPNo"].ToString(); + clsLotData3.NodeId = dtSplitLot.Rows[i]["NodeId"].ToString(); + } + else + { + clsLotData3.OPNo = dsTemp.Tables["LotState"].Rows[0]["OPNo"].ToString(); + clsLotData3.NodeId = dsTemp.Tables["LotState"].Rows[0]["NodeId"].ToString(); + } + objLotLog.funCreateSQL(clsLotData3, ChangeProductData: ChangeProduct, LotNo: SLotNo, LotSerial: SLotSerial, LogGroupSerial: NewLotGroupSerial, SysActiveId: 6, ReferenceLotNo: MLotNo); + } + // === + } + + // 檢查是否刪除庫房母批 + if (blnWIPInv & !blnHaveFromLot) + { + if (dsTemp.Tables["WIPInv_RefLot"] != null && dsTemp.Tables["WIPInv_RefLot"].Rows.Count == 1) + { + + strSQL = "Delete From tblINVWIPInventory_Semi Where InventoryNo = '" + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["InventoryNo"].ToString() + "' And LotNo = '" + MLotNo + "'"; + CollectionSQL.Add(strSQL); + + // 2019/04/25 Lena, 在製品庫分批且生產批狀態已為99結批,不建立還原點 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(dsTemp.Tables["LotState"].Rows[0]["LotState"], 99, false))) + { + // Undo + strSQL = "INSERT INTO TBLINVWIPINVENTORY_SEMI (INVENTORYNO, PRODUCTNO,LOTNO,UNITNO,QTY,INPUTDATE, BASELOTNO,BOUGHTEN,BOOKINGFLAG,PRODUCTVERSION)"; + strSQL += " VALUES ('" + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["INVENTORYNO"].ToString() + "', "; + strSQL += " '" + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["PRODUCTNO"].ToString() + "', "; + strSQL += " '" + MLotNo + "', "; + strSQL += " '" + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["UNITNO"].ToString() + "', "; + strSQL += " " + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["QTY"].ToString() + ", "; + strSQL += " TO_DATE('" + Strings.Format(dsTemp.Tables["WIPInv_RefLot"].Rows[0]["INPUTDATE"], "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), "; + strSQL += " '" + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["BASELOTNO"].ToString() + "', "; + strSQL += " " + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["BOUGHTEN"].ToString() + ", "; + strSQL += " " + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["BOOKINGFLAG"].ToString() + ", "; + strSQL += " '" + dsTemp.Tables["WIPInv_RefLot"].Rows[0]["PRODUCTVERSION"].ToString() + "')"; + + SQLCommandTuning(DataBaseType, ref strSQL); + Collection argcolSQL_Rows3 = null; + objReverse.AddReverseUpdateContent(ref SLotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows3); + } + + + } + } + + + // 7.分批紀錄 + if (blnWIPInv) + { + // 16 INVSplit(在製品庫分批) + objLot.SHR_Split_Inherit(ref cnnTemp, ref CollectionSQL, MLotNo, 16, Convert.ToString(dsTemp.Tables["LotState"].Rows[0]["OPNo"]), UserNo, datEventTime, MLotNo, Convert.ToString(dsTemp.Tables["LotState"].Rows[0]["BaseLotNo"]), MReverseId, MNewLotSerial, decSplitQty, dtSplitCont); + } + else + { + objLot.SHR_Split_Inherit(ref cnnTemp, ref CollectionSQL, MLotNo, SplitType, Convert.ToString(dsTemp.Tables["LotState"].Rows[0]["OPNo"]), UserNo, datEventTime, MLotNo, Convert.ToString(dsTemp.Tables["LotState"].Rows[0]["BaseLotNo"]), MReverseId, MNewLotSerial, decSplitQty, dtSplitCont); + } + + + // 8.外包分批 + string OSNo = defString; + // 8.1是否外包且已出貨(確定)但未回貨 + strSQL = "Select A.OSNo, A.LotNo From tblWIPOSDetail A, tblWIPOSBasis B " + " Where A.LotNo='" + MLotNo + "' And A.Status=0" + " And A.OSNo=B.OSNo And B.Status Not In (0,11)"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + OSNo = drTemp["OSNo"].ToString(); + } + drTemp.Close(); + + + if (OSNo != defString) + { + string splitLotNo; + + // 各子批(可能也會包含原母批) + foreach (DataRow rowSplitLot in dtSplitLot.Rows) + { + splitLotNo = rowSplitLot["SplitLotNo"].ToString(); + if (splitLotNo != MLotNo) + { + // 避免PK重複,隨後處理母批 + strSQL = "Insert Into tblWIPOSDetail (OSNo, LotNo, RCVDate, Status, InputQty, InputUnitNo, GoodQty, ScrapQty, OtherQty, Description, UnitPrice)" + " Select OSNo, '" + splitLotNo + "' As LotNo, RCVDate, Status, " + + rowSplitLot["SplitLotQty"] + " As InputQty, InputUnitNo, GoodQty, ScrapQty, OtherQty, Description, UnitPrice" + " From tblWIPOSDetail Where OSNo='" + + OSNo + "' And LotNo='" + MLotNo + "'"; + CollectionSQL.Add(strSQL); + // Reverse + // 不包含母批 + strSQL = "Delete From tblWIPOSDetail Where OSNo='" + OSNo + "' And LotNo='" + splitLotNo + "'"; + Collection argcolSQL_Rows4 = null; + objReverse.AddReverseUpdateContent(ref MNewLotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows4); + } + } + + // dtSplitLot是否包含母批MLotNo + if (blnHaveFromLot) + { + // 包含母批 + if (MLotQtyAfterSplit != defInteger) + { + strSQL = "Update tblWIPOSDetail Set InputQty=" + MLotQtyAfterSplit + " Where OSNo='" + OSNo + "' And LotNo='" + MLotNo + "'"; + CollectionSQL.Add(strSQL); + // Reverse + strSQL = "Update tblWIPOSDetail Set InputQty=" + decSplitQty + " Where OSNo='" + OSNo + "'" + " And LotNo='" + MLotNo + "'"; + Collection argcolSQL_Rows5 = null; + objReverse.AddReverseUpdateContent(ref MNewLotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows5); + } + } + else + { + // 不包含母批 + strSQL = "Delete From tblWIPOSDetail Where OSNo='" + OSNo + "' And LotNo='" + MLotNo + "'"; + CollectionSQL.Add(strSQL); + // Reverse + strSQL = "Insert Into tblWIPOSDetail(OSNo,LotNo,Status,InputQty,InputUnitNo)" + " Values('" + OSNo + "','" + MLotNo + "',0," + decSplitQty + ",'" + + dsTemp.Tables["LotState"].Rows[0]["CurUnitNo"] + "')"; + Collection argcolSQL_Rows6 = null; + objReverse.AddReverseUpdateContent(ref MNewLotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows6); + } + + } + + // 9.檢查是否允許執行 + Collection argcolSQL_Rows7 = null; + objLot.ChkLotStamp(MLotNo, LotStamp, CollectionSQL, colSQL_Rows: argcolSQL_Rows7); + + // 11.呼叫執行SQL指令 + ExecuteSQLNoneQuery_UPD(DataBaseType, strConnectionString, CollectionSQL); + + // 若有需要入庫的生產批, 統一在此處理, 此時DB已實際產生子批的相關資料 + if (colToINVLotNo.Count > 0) + { + CollectionSQL.Clear(); + loopTo = colToINVLotNo.Count; + for (i = 1; i <= loopTo; i++) + { + objLot.SetLotStateToINV(colToINVLotNo[i].ToString(), CollectionSQL, EventUserNo: UserNo); + } + ExecuteSQLNoneQuery_UPD(DataBaseType, strConnectionString, CollectionSQL); + } + + // //Return success + // 因分批後原批號可能不在,故不繼續Transfer,傳出success,一律由使用者手動Transfer + BR_Manual_LotSplitRet = "success"; + } + + catch (Exception e1) + { + BR_Manual_LotSplitRet = "fail"; + throw; + } + finally + { + CloseConnection(cnnTemp); + dsTemp.Dispose(); + GC.Collect(); + + if (objLot != null) + { + objLot.Dispose(); + } + } + return BR_Manual_LotSplitRet; + + } + + #endregion + + #region "隐藏站生产批转移搬迁" + public static int BRTransferLot_Bin_M(string LotNo, string UserNo, string LinkName, int ERFType = defInteger, string RuleNo = defString, int ScrapQty = defInteger, string RuleMsg = "", string ComputerName = "AUT", bool SPCControl = false, string HoldDescription = defString, bool blnHoldLot = true) + { + int BRTransferLot_BinRet = default(int); + + // 此 Function 將執行BR完成後的連續性處理 + // 傳入值:LotNo,UserNo,LinkName,ERFType,RuleNo + // 傳回值:0(成功), -1(失敗) + // 撰寫人:sammi + // 撰寫日:2006/08/14 + + // //CCC 07,0607: 將 UserNo 傳入 ERF 開立畫面, 做為 ERF 單的開立人 + // //CCC 07,1218: 修改訊息提示, 加上訊息代碼 + // 2011/01/12 Neil:加入RuleMsg,SPC BR的情況沒有RuleNo需可指定RuleMsg + + string strDescription; + //var objEAP = new clsEAP(); + DbDataReader drTemp; + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + IDbConnection cnnTemp = CreateConnection(strConnectionString); + + BRTransferLot_BinRet = -1; + + try + { + + if (LinkName == "HOLD" && blnHoldLot) + { + BRTransferLot_BinRet = 0; // 放在顯示異常介面之前.若異常開立不成功,重新刷卡即可. + // 開立異常單 + //var obj = new clsWIP(); + if (SPCControl) + { + tcEAI.clsEAP.BRERFCreateExecute(pUserId: UserNo, pLotNo: LotNo, pERFType: ERFType, pHoldTime: defInteger, pRuleNo: RuleNo, pRepairERF: false, pScrapQty: ScrapQty, pRuleMsg: RuleMsg, pHoldSystem: 1, pHoldDescription: HoldDescription); + } + else + { + tcEAI.clsEAP.BRERFCreateExecute(pUserId: UserNo, pLotNo: LotNo, pERFType: ERFType, pHoldTime: defInteger, pRuleNo: RuleNo, pRepairERF: false, pScrapQty: ScrapQty, pRuleMsg: RuleMsg, pHoldSystem: 1, pHoldDescription: RuleNo); + } + + + if (RuleNo != defString) + { + throw new iMESException.MESException("0000-200011", "[%LotNO%]:" + LotNo + "[%VIOLATE RULENO%]:" + RuleNo + "[%CREATEERF%]"); + } + else + { + throw new iMESException.MESException("0000-200011", "[%LotNO%]:" + LotNo + "[%CREATEERF%]"); + } + } + else if (LinkName == "WAIT") + { + throw new iMESException.MESException("0000-200011", "[%LotNO%]:" + LotNo + "[%WAITBASIS CREATE%]"); + } + else + { + + var result = new Dictionary(StringComparer.OrdinalIgnoreCase); + string strSQL = ""; + var objWIP = new kcWIP.clsLot(); + + //判斷品管項目是不是已經都處理完畢,已處理完畢就確認是否需要開立異常單,未處理完畢就強制將LinkName改成NEXT + if (blnHoldLot == false) + { + var dsTempQcitem = objWIP.ShowTemp_QCItem(LotNo: LotNo, AdditionalXml: " InspType_PQC = 1 "); + DataRow[] drSelExe = null; + StringBuilder holdDescriptions = new StringBuilder(); + drSelExe = dsTempQcitem.Tables[0].Select(" ExecuteFlag = 0 "); + if (drSelExe.Length == 0) //確認不存在未驗項目的狀況下,進行異常單的開立或者Transfer + { + strSQL = $" Select HoldDescription From tblWIPERFCreateData Where LotNo = '{LotNo}' And SPCSerial is not Null "; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp, strDataBaseType); + while (drTemp.Read()) + { + // 確保欄位值不為 NULL + if (!drTemp.IsDBNull(0)) + { + string strholdDescription = drTemp.GetString(0); + strholdDescription = strholdDescription.Replace(" ", Environment.NewLine); // 或用 "" 空字串移除 + strholdDescription = tcEAI.clsEAP.TranslateMsg(strholdDescription); + holdDescriptions.AppendLine(strholdDescription); + } + } + + if (holdDescriptions.Length != 0 && SPCControl) + tcEAI.clsEAP.BRERFCreateExecute(pUserId: UserNo, pLotNo: LotNo, pERFType: ERFType, pHoldTime: defInteger, pRuleNo: RuleNo, pRepairERF: false, pScrapQty: ScrapQty, pRuleMsg: RuleMsg, pHoldSystem: 1, pHoldDescription: holdDescriptions.ToString()); + } + else + LinkName = "NEXT"; + } + + TransferLot_Bin_M(ComputerName, DateTime.Now, UserNo, LotNo, LinkName, result); + + if (result.ContainsKey("hold_exceedtime")) + { + tcEAI.clsEAP.BRERFCreateExecute(pUserId: UserNo, pLotNo: LotNo, pERFType: 1, pHoldTime: 0, pRuleNo: "EXCEEDTIME"); + throw new iMESException.MESException("0000-200091", "[%LotNO%]:" + LotNo + "[%VIOLATE TIME CONTROL,CREATE ERF%]!"); + } + else if (result.ContainsKey("futurehold")) + { + int intHoldTime = 0; + if (result.ContainsKey("holdtime")) + { + intHoldTime = Conversions.ToInteger(result["holdtime"].ToString()); + } + tcEAI.clsEAP.BRERFCreateExecute(pUserId: UserNo, pLotNo: LotNo, pERFType: 3, pHoldTime: intHoldTime); + throw new iMESException.MESException("0000-200091", "[%LotNO%]:" + LotNo + "[%FUTUREHOLD SET,CREATE ERF%]!"); + } + else if (result.ContainsKey("futurewait")) + { + throw new iMESException.MESException("0000-200091", "[%LotNO%]:" + LotNo + "[%FUTUREWAIT%]!"); + } + else if (result.ContainsKey("futureos")) + { + throw new iMESException.MESException("0000-200091", "[%LotNO%]:" + LotNo + "[%FUTURE OS%]!"); + } + + BRTransferLot_BinRet = 0; + + } + } + + catch (Exception ex) + { + throw ex; + } + finally + { + //数据库一定要关闭 + CloseConnection(cnnTemp); + } + + return BRTransferLot_BinRet; + + } + + + + public static string TransferLot_Bin_M(string ComputerName, DateTime ArriveTime, string UserNo, string LotNo, string LinkName = defString, Dictionary dicReturnValue = null) + { + string TransferLot_BinRet = default(string); + + var objOP = new kcOP.clsOpBasis(); + var objBR = new tcWIP_IC.clsBusinessRule(); + var objLot = new kcWIP.clsLot(); + var objSYS = new clsSYSUserLog(); + + string NextBRNo; + var colNextNode = new Collection(); + DataRow drLotState; + int PhaseNo, HoldTime; + + string[] aryTLot; // ExecuteBR使用 + var dicBRParameter = new Dictionary(); // ExecuteBR使用 + + string strReturnValue = ""; + var strResult = default(string); + string strServiceName = "EAItc_DSC.clsWIP.TransferLot"; + + // 2007/12/18 Acer 用來存放Future Wait所輸入的Description,解決Future Wait所輸入的Description不會帶到Wait Basis中的錯誤 + string strWaitDescription = defString; + string iscycle = ""; + + IDbConnection cnnTemp = null; + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + try + { + + + // 2010/08/02,Sam.Hsu,傳入給FunctionBR使用之額外參數 + // + // .. .. + // + // .. + // .. + // + // + // + // If xmlDoc.DocumentElement.GetElementsByTagName("parameters").Count > 0 Then + // If xmlDoc.GetElementsByTagName("parameters").Item(0).SelectNodes("value").Count > 0 Then + // Dim xmlList As Xml.XmlNodeList = xmlDoc.GetElementsByTagName("parameters").Item(0).SelectNodes("value") + // For j As Integer = 0 To xmlList.Count - 1 + // '將資料存入暫存Collection + // dicBRParameter.Add(xmlList(j).SelectNodes("parameterno").Item(0).InnerText, + // xmlList(j).SelectNodes("parametervalue").Item(0).InnerText) + // Next + // End If + // End If + + // //Transfer---------------------------------------------------------------------------------------------------------------- + // objOP = New kcOP.clsOpBasis + // objBR = New tcWIP_IC.clsBusinessRule + + lblGetNextBR: + ; + + + // 0.檢查是否允許執行TransferLot,防止未執行,一直往下轉移 + drLotState = objLot.GetLotState(LotNo); + if (drLotState["LotNo"] is DBNull) + { + throw new iMESException.MESException("0000-200003", "LotNo:" + LotNo + " is not exist!"); + } + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drLotState["Status"], 4, false))) + { + throw new iMESException.MESException("0000-203033", "LotNo:" + LotNo); + } + + // 2007/03/12,sammi.若沒有傳入LinkName,則使用tblWIPLotState.LinkName. + if (LinkName == defString) + { + LinkName = drLotState["LinkName"].ToString(); + } + + // Success不繼續Go,停止 + if (LinkName != null && LinkName.ToUpper() == "SUCCESS") + { + // 2006/05/23,sammi.做為呼叫端是否繼續轉移的依據. + // strReturnValue = CombineXMLReturnValue("stopflag", "StopFlag", "Integer", "", 1, "") + dicReturnValue["stopflag"] = 1.ToString(); + goto lblExit; + } + + switch (LinkName) + { + case "ABORTOP": + { + // 以後再處理 + goto lblExit; + break; + } + } + + // 2009/09/14,yumei,生產批數量為零(GoodQty=0)時,結束該流程,入不良品倉(LotState=12,ScrapINV)---- + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drLotState["CurQty"], 0, false))) + { + decimal FinalGoodQtyTmp = defInteger; + decimal FinalFailQtyTmp = defInteger; + objLot.EndOP(ref FinalGoodQtyTmp, ref FinalFailQtyTmp, LotNo, UserNo: UserNo, ReleaseEQP: true); + goto lblExit; + } + // ----------------------------------------------------------- + + + + + + // 1.取出下一個BusinessRule + NextBRNo = objLot.GetNextBR(LotNo, LinkName); + + if (NextBRNo == "END") // 沒有下一個BR,要換Node + { + // PS.不建議在此區塊內使用上述已取出的drLotState,因下述每個個別執行的Function都有可能去變更LotState + // 作業站成功完成,LotLog為有意義的資料 + decimal FinalGoodQtyTmp = defInteger; + decimal FinalFailQtyTmp = defInteger; + objLot.EndOP(ref FinalGoodQtyTmp, ref FinalFailQtyTmp, LotNo, UserNo: UserNo, ReleaseEQP: true); + + // FutureHold/FutureWait檢查 + string HoldDescriptionTmp = ""; + if (objLot.ChkFutureHold(ref HoldDescriptionTmp, LotNo, 1)) + { + HoldTime = 1; // HoldTime:End + goto lblFutureHold; // 至WinForm開單 + } + + else if (objLot.ChkFutureWait(ref strWaitDescription, LotNo, 1)) + { + // Future Wait + objLot.SetLotStateToWait(Conversions.ToLong(objLot.GetLotState(LotNo)["LotStamp"]), LotNo, 3, 1, UserNo, WaitDescription: strWaitDescription); + goto lblFutureWait; + } + + + + + //换NODE前看一下是否有隐藏站,如果有隐藏站的话,生产批状态变成该作业站的完成状态;而不是下一站的待进站状态 + DataSet dsTemp = new DataSet(); + string OPNO = ""; + string FROMNODENO = ""; + strSQL = $@"SELECT * FROM TBLWIPLOTSTATE WHERE LOTNO='{LotNo}'"; + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "OPNO", cnnTemp); + if (dsTemp.Tables["OPNO"].Rows.Count > 0) + { + OPNO = dsTemp.Tables["OPNO"].Rows[0]["OPNO"].ToString(); + } + + strSQL = $@" Select A.GROUPNO From TBLPRSNODEBASIS A + join tblwiplotstate B on A.processno = B.processno and A.processversion = B.processversion where B.LOTNO = '{LotNo}' AND NODENO='{OPNO}' AND A.GROUPNO IS NOT NULL"; + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "GROUPNO", cnnTemp); + if (dsTemp.Tables["GROUPNO"].Rows.Count > 0) + { + FROMNODENO = "GROUP" + dsTemp.Tables["GROUPNO"].Rows[0]["GROUPNO"].ToString(); + } + else + { + FROMNODENO = OPNO; + } + + strSQL = $@"Select A.* From tblPRSNodeRelation A + join tblwiplotstate B on A.processno = B.processno and A.processversion = B.processversion and A.FROMNODENO = '{FROMNODENO}' + where B.LOTNO = '{LotNo}' + and A.LinkName = 'PASS1' "; + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "tblPRSNodeRelation", cnnTemp); + if (dsTemp.Tables["tblPRSNodeRelation"].Rows.Count > 0) + { + goto lblExit; + } + else + { + if (iscycle == "1") + { + LinkName = "CYCLE"; + } + } + + // 取出下一Node{colNextNode:NodeID,NodeNo,ProcessNo,NextNodeType,PSNo(資料不一定都有)} + colNextNode = objLot.GetNextNode(LotNo, "Null", LinkName, AdditionalXml: ""); + switch (colNextNode["NextNodeType"].ToString()) + { + case "OP": + case "PRS": + case "MOD": + { + objLot.SetLotStateToNextOP(Conversions.ToLong(drLotState["LotStamp"]), LotNo, Convert.ToString(colNextNode["NodeID"]), EventUserNo: UserNo); + + // 取出LotState目前的BRNo(已轉換) + NextBRNo = Convert.ToString(objLot.GetLotState(LotNo)["BRNo"]); + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(objOP.GetBusinessRule(NextBRNo)["RuleMethod"], 0, false))) // Automatic + { + var colParameters = new Collection(); + // TriggerOP + long NewLotStampTmp = defInteger; + strReturnValue = objLot.TriggerOP(ref strWaitDescription, ref NewLotStampTmp, LotNo, UserNo: UserNo, ComputerNo: ComputerName); + if (strReturnValue == "hold_exceedtime") + { + // 2008/01/04,sammi.違反時效管制. + goto lblHold_ExceedTime; + } + else if (strReturnValue == "futurehold") + { + HoldTime = 0; // HoldTime:Start + goto lblFutureHold; + } + else if (strReturnValue == "futurewait") + { + goto lblFutureWait; + } + else if (strReturnValue == "futureos") + { + goto lblFutureOS; + } + drLotState = objLot.GetLotBasisJoinState(LotNo: LotNo); // 取得最新的LotState + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drLotState["OPReference"], 0, false))) // by Product + { + PhaseNo = objLot.GetBusinessRulePhase(drLotState["ProductNo"].ToString(), drLotState["ProductVersion"].ToString(), drLotState["OPNo"].ToString(), NextBRNo); + } + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drLotState["OPReference"], 1, false))) // by Module + { + PhaseNo = objLot.GetBusinessRulePhase(drLotState["ModuleNo"].ToString(), drLotState["ModuleVersion"].ToString(), drLotState["OPNo"].ToString(), NextBRNo); + } + else + { + throw new iMESException.MESException("0000-200015", "LotNo:" + LotNo + " OPReference is not valid!"); + } + // Trigger Phase(剛做完TriggerOP,不用再執行Attrib的變更) + objLot.TriggerPhase_LotState(LotNo, PhaseNo, UserNo); + + // 加入參數 + colParameters.Add(UserNo, "UserNo"); + + // 2010/08/02,Sam.Hsu + // 加入額外參數,若有相同參數以傳入之參數取代 + // ExecuteBR中會再加入LotNo,LotSerial,MONo,ProductNo,ProductVersion,OPNo + // 因此不可再傳入上述參數 + if (dicBRParameter.Count > 0) + { + if (dicBRParameter.ContainsKey("UserNo") == true) + { + colParameters.Remove("UserNo"); + } + foreach (KeyValuePair KeyVal in dicBRParameter) + colParameters.Add(KeyVal.Value, KeyVal.Key); + } + + // 執行BR + LinkName = objBR.ExecuteBR(LotNo, NextBRNo, colParameters); + + // 06/04/25,sammi.檢查LinkName是否為多批.若是只須執行轉移即可,不用繼續往下做. + aryTLot = Strings.Split(LinkName, ";"); // LinkName=PASS or LinkName=L001,PASS;L002,PASS;L003:Rework + if (aryTLot.Length == 1) + { + // 原本的轉移,仍延用原LotNo + // 繼續找下一個BR,Success不繼續Go,停止 + if (LinkName.ToUpper() == "SUCCESS") + { + // 2006/05/23,sammi.做為呼叫端是否繼續轉移的依據. + strReturnValue = iMESCore.Base.iMESComXML.CombineXMLReturnValue("stopflag", "StopFlag", "Integer", "", 1.ToString(), ""); + goto lblExit; + } + else + { + goto lblGetNextBR; + } + } + else + { + goto lblLotTransfer; + } + + } + + break; + } + + case "END": + { + objLot.SetLotStateToNextOP(Conversions.ToLong(drLotState["LotStamp"]), LotNo, Convert.ToString(colNextNode["NodeID"]), EventUserNo: UserNo); + + // 93/09/13,讓流程轉移時,第一個OP的第一個AutoBR可自動執行 ' + // Q1.SetLotStateToNextOP可能入庫(Status = 11),以避免 + // Q2.SetLotStateToNextOP可能轉移至Group內的OP上(則BR自動執行,將無法選擇要執行那個Group內的OP),目前沒有避免 + // 2008/11/28,sammi.Lot可能結批,故不一定會有資料,加上drLotState("LotNo").ToString <> ""的判斷. + // 取出LotState目前的BRNo(已轉換) + drLotState = objLot.GetLotState(LotNo); + if (!string.IsNullOrEmpty(drLotState["LotNo"].ToString()) && Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drLotState["Status"], 0, false))) // 避免Q1 + { + NextBRNo = drLotState["BRNo"].ToString(); + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(objOP.GetBusinessRule(NextBRNo)["RuleMethod"], 0, false))) // Automatic + { + var colParameters = new Collection(); + // TriggerOP + long NewLotStampTmp = defInteger; + strReturnValue = objLot.TriggerOP(ref strWaitDescription, ref NewLotStampTmp, LotNo, UserNo: UserNo, ComputerNo: ComputerName); + if (strReturnValue == "hold_exceedtime") + { + // 2008/01/04,sammi.違反時效管制. + goto lblHold_ExceedTime; + } + else if (strReturnValue == "futurehold") + { + HoldTime = 0; // HoldTime:Start + goto lblFutureHold; + } + else if (strReturnValue == "futurewait") + { + goto lblFutureWait; + } + else if (strReturnValue == "futureos") + { + goto lblFutureOS; + } + drLotState = objLot.GetLotBasisJoinState(LotNo: LotNo); // 取得最新的LotState + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drLotState["OPReference"], 0, false))) // by Product + { + PhaseNo = objLot.GetBusinessRulePhase(drLotState["ProductNo"].ToString(), drLotState["ProductVersion"].ToString(), drLotState["OPNo"].ToString(), NextBRNo); + } + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drLotState["OPReference"], 1, false))) // by Module + { + PhaseNo = objLot.GetBusinessRulePhase(drLotState["ModuleNo"].ToString(), drLotState["ModuleVersion"].ToString(), drLotState["OPNo"].ToString(), NextBRNo); + } + else + { + throw new iMESException.MESException("0000-200015", "LotNo:" + LotNo + " OPReference is not valid!"); + } + // Trigger Phase(剛做完TriggerOP,不用再執行Attrib的變更) + objLot.TriggerPhase_LotState(LotNo, PhaseNo, UserNo); + + // 加入參數 + colParameters.Add(UserNo, "UserNo"); + + // 2010/08/02,Sam.Hsu + // 加入額外參數,若有相同參數以傳入之參數取代 + // ExecuteBR中會再加入LotNo,LotSerial,MONo,ProductNo,ProductVersion,OPNo + // 因此不可再傳入上述參數 + if (dicBRParameter.Count > 0) + { + if (dicBRParameter.ContainsKey("UserNo") == true) + { + colParameters.Remove("UserNo"); + } + foreach (KeyValuePair KeyVal in dicBRParameter) + colParameters.Add(KeyVal.Value, KeyVal.Key); + } + + // 執行BR + LinkName = objBR.ExecuteBR(LotNo, NextBRNo, colParameters); + + // 06/04/25,sammi.檢查LinkName是否為多批.若是只須執行轉移即可,不用繼續往下做. + aryTLot = Strings.Split(LinkName, ";"); // LinkName=PASS or LinkName=L001,PASS;L002,PASS;L003:Rework + if (aryTLot.Length == 1) + { + // 原本的轉移,仍延用原LotNo + // 繼續找下一個BR,Success不繼續Go,停止 + if (LinkName.ToUpper() == "SUCCESS") + { + // 2006/05/23,sammi.做為呼叫端是否繼續轉移的依據. + // strReturnValue = CombineXMLReturnValue("stopflag", "StopFlag", "Integer", "", 1, "") + dicReturnValue["stopflag"] = 1.ToString(); + goto lblExit; + } + else + { + goto lblGetNextBR; + } + } + else + { + goto lblLotTransfer; + } + + } + } + + break; + } + + case "ANDGROUP": + case "ORGROUP": // Group + { + objLot.SetLotStateToNextOP(Conversions.ToLong(drLotState["LotStamp"]), LotNo, Convert.ToString(colNextNode["NodeID"]), EventUserNo: UserNo); + break; + } + + case "ANDGROUPOP": // ANDGroup的OP + { + objLot.SetLotStateToOtherGroupOP(Conversions.ToLong(drLotState["LotStamp"]), LotNo, true, Convert.ToString(colNextNode["NodeID"]), EventUserNo: UserNo); + break; + } + + default: + { + // Immediate Wait + objLot.SetLotStateToWait(Conversions.ToLong(drLotState["LotStamp"]), LotNo, 2, UserNo: UserNo); + break; + } + + } + } + + else if (NextBRNo == defString) // 找不到下一個BR + { + // Immediate Wait + objLot.SetLotStateToWait(Conversions.ToLong(drLotState["LotStamp"]), LotNo, 2, UserNo: UserNo); + } + + else // Find next BR + { + // 檢查是否Trigger Phase + drLotState = objLot.GetLotBasisJoinState(LotNo: LotNo); // 取得最新的LotState + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drLotState["OPReference"], 0, false))) // by Product + { + PhaseNo = objLot.GetBusinessRulePhase(drLotState["ProductNo"].ToString(), drLotState["ProductVersion"].ToString(), drLotState["OPNo"].ToString(), NextBRNo); + } + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drLotState["OPReference"], 1, false))) // by Module + { + PhaseNo = objLot.GetBusinessRulePhase(drLotState["ModuleNo"].ToString(), drLotState["ModuleVersion"].ToString(), drLotState["OPNo"].ToString(), NextBRNo); + } + else + { + throw new iMESException.MESException("0000-200015", "LotNo:" + LotNo + " OPReference is not valid!"); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drLotState["PhaseNo"], PhaseNo, false))) + { + objLot.TriggerPhase(LotNo, PhaseNo, EventUserNo: UserNo); + } + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(objOP.GetBusinessRule(NextBRNo)["RuleMethod"], 0, false))) // Automatic + { + var colParameters = new Collection(); + // 更新LotState的BR + objLot.SetLotStateToNextBR(Conversions.ToLong(drLotState["LotStamp"]), LotNo, NextBRNo, EventUserNo: UserNo); + // 加入參數 + colParameters.Add(UserNo, "UserNo"); + + // 2010/08/02,Sam.Hsu + // 加入額外參數,若有相同參數以傳入之參數取代 + // ExecuteBR中會再加入LotNo,LotSerial,MONo,ProductNo,ProductVersion,OPNo + // 因此不可再傳入上述參數 + if (dicBRParameter.Count > 0) + { + if (dicBRParameter.ContainsKey("UserNo") == true) + { + colParameters.Remove("UserNo"); + } + foreach (KeyValuePair KeyVal in dicBRParameter) + colParameters.Add(KeyVal.Value, KeyVal.Key); + } + + // 執行BR + LinkName = objBR.ExecuteBR(LotNo, NextBRNo, colParameters); + + // 06/04/25,sammi.檢查LinkName是否為多批.若是只須執行轉移即可,不用繼續往下做. + aryTLot = Strings.Split(LinkName, ";"); // LinkName=PASS or LinkName=L001,PASS;L002,PASS;L003:Rework + if (aryTLot.Length == 1) + { + // 原本的轉移,仍延用原LotNo + // 繼續找下一個BR,Success不繼續Go,停止 + if (LinkName.ToUpper() == "SUCCESS") + { + // 2006/05/23,sammi.傳出LinkName,做為呼叫端是否繼續轉移的依據. + // strReturnValue = CombineXMLReturnValue("stopflag", "StopFlag", "Integer", "", 1, "") + dicReturnValue["stopflag"] = 1.ToString(); + goto lblExit; + } + else + { + goto lblGetNextBR; + } + } + else + { + goto lblLotTransfer; + } + } + + else // Manual + { + objLot.SetLotStateToNextBR(Conversions.ToLong(drLotState["LotStamp"]), LotNo, NextBRNo, EventUserNo: UserNo); + } + + } + + goto lblExit; + + lblHold_ExceedTime: + ; + + // strReturnValue = CombineXMLReturnValue("hold_exceedtime", "Hold_ExceedTime", "String", "", "Hold_ExceedTime", "") + dicReturnValue["Hold_ExceedTime"] = "Hold_ExceedTime"; + goto lblExit; + + lblFutureHold: + ; + + // strReturnValue = CombineXMLReturnValue("futurehold", "FutureHold", "String", "", "FutureHold", "") + // strReturnValue += CombineXMLReturnValue("holdtime", "holdtime", "String", "", HoldTime, "") + dicReturnValue["FutureHold"] = "FutureHold"; + dicReturnValue["HoldTime"] = HoldTime.ToString(); + goto lblExit; + + lblFutureWait: + ; + + strReturnValue = iMESCore.Base.iMESComXML.CombineXMLReturnValue("futurewait", "FutureWait", "String", "", "FutureWait", ""); + dicReturnValue["FutureWait"] = "FutureWait"; + // 2012/02/10 YF, 回傳Wait Description + if (strWaitDescription != defString) + { + // strReturnValue += CombineXMLReturnValue("waitdescription", "WaitDescription", "String", "", strWaitDescription, "") + dicReturnValue["WaitDescription"] = strWaitDescription; + } + goto lblExit; + + lblFutureOS: + ; + + // strReturnValue = CombineXMLReturnValue("futureos", "FutureOS", "String", "", "FutureOS", "") + dicReturnValue["FutureOS"] = "FutureOS"; + goto lblExit; + + lblLotTransfer: + ; + + + // BR可能執行了分批,系統必須轉移傳出的批號 + string strRS; + string[] aryLink; + int i; + var loopTo = aryTLot.Length - 1; + for (i = 0; i <= loopTo; i++) + { + do + { + try + { + aryLink = Strings.Split(aryTLot[i], ","); // aryTLot(i) = L001,PASS + if (aryLink.Length > 0 && string.IsNullOrEmpty(aryLink[0])) + { + break; + } + // Transfer Lot + if (aryLink.Length == 1) // LinkName預設為Pass + { + // strInXmlParameter = CombineXMLParameter("lotno", "LotNo", "String", aryLink(0), "") + Dictionary argdicReturnValue = null; + strRS = TransferLot_Bin_M(ComputerName, DateTime.Now, UserNo, aryLink[0], dicReturnValue: argdicReturnValue); + } + else + { + // strInXmlParameter = CombineXMLParameter("lotno", "LotNo", "String", aryLink(0), "") + // strInXmlParameter = strInXmlParameter & CombineXMLParameter("linkname", "LinkName", "String", aryLink(1), "") + Dictionary argdicReturnValue1 = null; + strRS = TransferLot_Bin_M(ComputerName, DateTime.Now, UserNo, aryLink[0], aryLink[1], dicReturnValue: argdicReturnValue1); + } + + Dictionary argdicReturnValue2 = null; + strRS = TransferLot_Bin_M(ComputerName, DateTime.Now, UserNo, aryLink[0], dicReturnValue: argdicReturnValue2); + if (strRS != "success") + { + throw new iMESException.MESException("0000-203036", "Transfer Lot fail," + strResult); + } + } + catch (iMESException.MESException ex) + { + throw; + } + catch (Exception e1) + { + throw; + } + finally + { + } + } + while (false); + } + + goto lblExit; + + lblExit: + ; + + + strResult = "success"; + + objSYS.AddEventLog(strServiceName, UserNo, "LotNo", LotNo, DateTime.Now, "TransferLot,LinKname:" + LinkName, ComputerName: ComputerName); + } + + catch (iMESException.MESException ex) + { + + strResult = ex.Message + " : " + ex.StackTrace; + objSYS.AddErrorLog_ErrorCode(strServiceName, UserNo, "LotNo", LotNo, DateTime.Now, strResult, ComputerName: ComputerName, ErrorCode: Convert.ToString(ex.ErrorCode)); + + throw ex; + } + + catch (Exception ex) + { + + strResult = ex.Message + " : " + ex.StackTrace; + objSYS.AddErrorLog_ErrorCode(strServiceName, UserNo, "LotNo", LotNo, DateTime.Now, strResult, ComputerName: ComputerName); + + throw ex; + } + + finally + { + if (!(objLot == null)) + objLot = null; + if (!(objOP == null)) + objOP = null; + if (!(objBR == null)) + objBR = null; + if (!(objSYS == null)) + objSYS = null; + + //数据库一定要关闭 + CloseConnection(cnnTemp); + + // 將各部份之XML字串組起來並傳出 + TransferLot_BinRet = strResult; + + + } + + return TransferLot_BinRet; + + } + + + #endregion + /// + /// 写入字符串日志,固定路径 D:\meslog\eai + /// + /// 日志内容 + public static void WriteLog(string message) + { + try + { + // 固定文件夹路径 + string logDirectory = @"D:\meslog\eai"; + + // 不存在则创建目录 + if (!Directory.Exists(logDirectory)) + { + Directory.CreateDirectory(logDirectory); + } + + // 按日期生成日志文件 + string fileName = $"Log_{DateTime.Now:yyyyMMdd}.txt"; + string fullPath = Path.Combine(logDirectory, fileName); + + // 拼接时间与日志内容 + string logLine = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} {message}{Environment.NewLine}"; + + // 追加写入文件 + File.AppendAllText(fullPath, logLine); + } + catch (Exception ex) + { + Console.WriteLine($"日志写入异常:{ex.Message}"); + } + } + public string SetLotStateToNextBR(long LotStamp, string LotNo, string BRNo, string AdditionalXml = "", string EventUserNo = "", string EventDescription = "", Collection colSQL = null) + { + string SetLotStateToNextBRRet = default(string); + // 此 Function 將使 Lot 的現況移到下一個 Business Rule + // 傳入值: 索引值 + // 傳回值: success(成功), fail(失敗) + + var CollectionSQL = new Collection(); + + var datEventTime = DateTime.Now; + + try + { + // 呼叫執行SQL指令(1:Run) + strSQL = "Update tblWIPLotState Set BRNo ='" + BRNo + "'," + " EventTime=To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " EventUserNo='" + EventUserNo + "'," + " EventDescription='" + EventDescription + "'," + " Status = 1 " + " Where LotNo ='" + LotNo + "'"; + CollectionSQL.Add(strSQL); + + // 2006/07/12,sammi.檢查是否允許執行 + Collection argcolSQL_Rows = null; + objLot.ChkLotStamp(LotNo, LotStamp, CollectionSQL, colSQL_Rows: argcolSQL_Rows); + + if (colSQL == null) + { + // 呼叫執行SQL指令 + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + } + else + { + for (int i = 1, loopTo = CollectionSQL.Count; i <= loopTo; i++) + colSQL.Add(CollectionSQL[i]); + } + + // 2019/10/28 Yenru , Add SignalR BroadCast + try + { + // 站內移轉 + // 設備:加工設備生產批狀態變更、未加工設備刪除顯示生產批。 + // 作業站:生產批狀態變更。 + using (var objMDS = new kcWIP.clsMDS()) + { + + var drLotInfo = objLot.GetLotState(LotNo); + var dTEQPInfo = objLot.ShowTemp_Equipment(LotNo).Tables[0]; + string strEQPList = ""; + var oParameter = new Dictionary(); + + // 整理設備資訊 + foreach (DataRow drTemp in dTEQPInfo.Rows) + strEQPList += drTemp["EquipmentNo"].ToString() + ","; + strEQPList = strEQPList.TrimEnd(','); + + oParameter.Add("ProcessType", "SetLotStateToNextBR"); + oParameter.Add("lotno", LotNo); + oParameter.Add("orgopno", drLotInfo["OPNO"].ToString()); + oParameter.Add("equiplist", strEQPList); + + objMDS.SignalRDataSummary(oParameter); + + // 20200917 雋辰 ,SignalR 生產任務(派工頁簽) + oParameter["ProcessType"] = "SetLotStateToNextBR_Dispatch"; + objMDS.SignalRDataSummary(oParameter); + } + } + catch (Exception ex) + { + } + + // Return success + SetLotStateToNextBRRet = "success"; + } + + catch (Exception e1) + { + SetLotStateToNextBRRet = "fail"; + throw; + + } // New Exception("kcWIP.SetLotStateToNextBR: " & e1.Message) + return SetLotStateToNextBRRet; + + } + + + public static Collection GetNextNode(string LotNo, string NodeID = defString, string LinkName = defString, string AdditionalXml = "") + { + Collection GetNextNodeRet = default(Collection); + // 此 Function 將取得LotNo目前Node的下一Node,或是依指定NodeID,LinkName取得下一Node + // 傳入值: 索引值 + // 傳回值: Collection(成功), fail(失敗) + + IDbConnection cnnTemp = null; + DbDataReader drTemp = null; + var colGetNextNode = new Collection(); + string GroupNodeID, CurNodeID, NextNodeID, NextNodeNo; + int GroupType; // 6:AND,7:OR + + try + { + cnnTemp = CreateConnection(strConnectionString); + + // 1.依LotNo取出NodeID,PSNo + if (NodeID == defString) + { + strSQL = "Select NodeID From tblWIPLotState Where LotNo ='" + LotNo + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + CurNodeID = drTemp["NodeID"].ToString(); + } + else + { + colGetNextNode.Add("WAIT", "NextNodeType"); + goto lblExitProcedure; + } + drTemp.Close(); + } + + else + { + CurNodeID = NodeID; + } + + // 2.檢查OPGroupState內是否有未執行OP(OPGroupState內的一定是要執行的,不執行的不會加入OPGroupState) + strSQL = "Select GroupType,GroupNodeID, NodeID From tblWIPOPGroupState Where LotNo ='" + LotNo + "'" + " And NodeID ='" + CurNodeID + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + GroupType = Conversions.ToInteger(drTemp["GroupType"]); + GroupNodeID = drTemp["GroupNodeID"].ToString(); + + drTemp.Close(); + + + if (GroupType == 6) // AND Group + { + strSQL = "Select NodeID,OPNo From tblWIPOPGroupState Where LotNo ='" + LotNo + "'" + " And NodeID <> '" + CurNodeID + "'" + " And ExecuteFlag = 0 "; // 剔除目前的OP,未執行之OP + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + colGetNextNode.Add(drTemp["NodeID"], "NodeID"); + colGetNextNode.Add(drTemp["OPNo"], "NodeNo"); // OPNo + colGetNextNode.Add("ANDGROUPOP", "NextNodeType"); + goto lblExitProcedure; + } + else // 用GroupNodeID找下個Node + { + CurNodeID = GroupNodeID; + } + drTemp.Close(); + } + + + else if (GroupType == 7) // OR Group + { + CurNodeID = GroupNodeID; + } + } + else + { + drTemp.Close(); + + } + + + lblGetNextNode: + ; + + + + // 3.依 CurNodeID,LinkName 取出 NextNodeID + strSQL = "Select ToNodeID,ToNodeNo From tblPRSNodeRelation Where FromNodeID ='" + CurNodeID + "'"; + if (LinkName == defString || LinkName == null) + { + strSQL = strSQL + " And LinkName ='PASS'"; + } + else + { + strSQL = strSQL + " And LinkName ='" + LinkName.ToUpper() + "'"; + } + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) // 沒有找到下一節點 + { + drTemp.Close(); + + colGetNextNode.Add("WAIT", "NextNodeType"); + goto lblExitProcedure; + } + + // 找到下一節點--------------------------------------------------------------------------------------------------------------- + NextNodeID = drTemp["ToNodeID"].ToString(); + NextNodeNo = drTemp["ToNodeNo"].ToString(); + drTemp.Close(); + + + // '4.檢查下一節點是否不執行 + // strSQL = "Select OPNo From tblWIPLotNotExecuteOP " & _ + // " Where LotNo = '" & LotNo & "' And OPNo = '" & NextNodeNo & "'" + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + // drTemp = cmmTemp.ExecuteReader() + // If drTemp.Read Then '不執行,繼續找下一Node,linkname變更為Pass + // drTemp.Close() + // CurNodeID = NextNodeID + // LinkName = "PASS" + // GoTo lblGetNextNode + // Else + // drTemp.Close() + // End If + + // ---------------------------------------------------------------------------------------------------------------------------- + // 5.依 NextNodeID 取出 Node 的基本資料 + strSQL = "Select ProcessNo, ProcessVersion, NodeID, NodeNo, NodeVersion, NodeType From tblPRSNodeBasis " + " Where NodeID ='" + NextNodeID + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + int iNodeType = -1; + if (!int.TryParse(drTemp["NodeType"].ToString(), out iNodeType)) + iNodeType = -1; + switch (iNodeType) + { + case 0: // OP + { + colGetNextNode.Add(NextNodeID, "NodeID"); + colGetNextNode.Add(drTemp["NodeNo"], "NodeNo"); // OPNo + colGetNextNode.Add(drTemp["NodeVersion"], "NodeVersion"); // NodeVersion + colGetNextNode.Add(drTemp["ProcessNo"], "ProcessNo"); // ProcessNo + colGetNextNode.Add(drTemp["ProcessVersion"], "ProcessVersion"); // ProcessVersion + colGetNextNode.Add("OP", "NextNodeType"); + break; + } + + + case 1: // Sub Process + { + colGetNextNode.Add(NextNodeID, "NodeID"); + colGetNextNode.Add(drTemp["NodeNo"], "NodeNo"); // Sub ProcessNo + colGetNextNode.Add(drTemp["NodeVersion"], "NodeVersion"); // NodeVersion(可能是*) + colGetNextNode.Add(drTemp["ProcessNo"], "ProcessNo"); // ProcessNo + colGetNextNode.Add(drTemp["ProcessVersion"], "ProcessVersion"); // ProcessVersion + colGetNextNode.Add("PRS", "NextNodeType"); + break; + } + + + case 6: // And Group + { + colGetNextNode.Add(NextNodeID, "NodeID"); + colGetNextNode.Add(drTemp["NodeNo"], "NodeNo"); // GroupNo(Ex:GROUP6) + colGetNextNode.Add(drTemp["NodeVersion"], "NodeVersion"); // NodeVersion + colGetNextNode.Add(drTemp["ProcessNo"], "ProcessNo"); // ProcessNo + colGetNextNode.Add(drTemp["ProcessVersion"], "ProcessVersion"); // ProcessVersion + colGetNextNode.Add("ANDGROUP", "NextNodeType"); + break; + } + + + case 7: // OR Group + { + colGetNextNode.Add(NextNodeID, "NodeID"); + colGetNextNode.Add(drTemp["NodeNo"], "NodeNo"); // GroupNo(Ex:GROUP7) + colGetNextNode.Add(drTemp["NodeVersion"], "NodeVersion"); // NodeVersion + colGetNextNode.Add(drTemp["ProcessNo"], "ProcessNo"); // ProcessNo + colGetNextNode.Add(drTemp["ProcessVersion"], "ProcessVersion"); // ProcessVersion + colGetNextNode.Add("ORGROUP", "NextNodeType"); + break; + } + + + case 9: // END + { + colGetNextNode.Add(NextNodeID, "NodeID"); + colGetNextNode.Add(drTemp["NodeNo"], "NodeNo"); // OPNo + colGetNextNode.Add(drTemp["NodeVersion"], "NodeVersion"); // NodeVersion + colGetNextNode.Add(drTemp["ProcessNo"], "ProcessNo"); // ProcessNo + colGetNextNode.Add(drTemp["ProcessVersion"], "ProcessVersion"); // ProcessVersion + colGetNextNode.Add("END", "NextNodeType"); + break; + } + + + case 2: // Module + { + colGetNextNode.Add(NextNodeID, "NodeID"); + colGetNextNode.Add(drTemp["NodeNo"], "NodeNo"); // Module + colGetNextNode.Add(drTemp["NodeVersion"], "NodeVersion"); // NodeVersion(可能是*) + colGetNextNode.Add(drTemp["ProcessNo"], "ProcessNo"); // ProcessNo + colGetNextNode.Add(drTemp["ProcessVersion"], "ProcessVersion"); // ProcessVersion + colGetNextNode.Add("MOD", "NextNodeType"); + break; + } + + default: + { + colGetNextNode.Add("WAIT", "NextNodeType"); + break; + } + + } + } + else + { + throw new iMESException.MESException("0000-200003", "[%Process%] [%Nodeinformation%] [%not found%], [%please check%] [%processbasis%]" + Constants.vbCrLf + "[%NodeID%]: " + NextNodeID); + } + drTemp.Close(); + + + lblExitProcedure: + ; + + + GetNextNodeRet = colGetNextNode; + } + + catch (Exception e1) + { + GetNextNodeRet = null; + throw; + } // New Exception("kcWIP.GetNextNode: " & e1.Message) + + finally + { + // 關閉連線 + CloseConnection(cnnTemp); + + } + return GetNextNodeRet; + + } + + /// + /// 产生位置号与序号(逐字抽出自 funTrackOut_Inquiry 原 :2829-2873,行为不变) + /// + private static bool funInitDieSerial( + ref List aryMessage, ref List aryException, + string PanleId, string strMLotNo, string strProductNo, string strProductVersion, + string strSeqNoRule, string strSeqNoType, string strSeqNoSize, string strDirection, + int intColumn, int intLine, string[,] unitIdOrPannids, string[,] locations, + IDbConnection cnnTemp) + { + string strSQL = default(string); + DbDataReader drTemp = null; + string strUnitIdOrPannid = "";//UnitId或者Pannid + + try + { + funInitlocation(locations, strSeqNoSize, strDirection, intColumn, intLine); + + for (int i = 0; i < intLine; i++) + { + for (int j = 0; j < intColumn; j++) + { + PanelidOrUnitId: + //校验生成的序号是否有禁用字符 + DataTable dtSeqNo = InitPanleIdOrUnitId(ReserveSerialNo: false, SerialCount: 1L, SerialTypeNo: strSeqNoRule, LotNo: strMLotNo, PanleId: PanleId, ProductNo: strProductNo, SerialType: strSeqNoType, location: locations[i, j]); + + if (dtSeqNo.Rows.Count == 0) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%产品编号%] :" + strProductNo + " [%产品版本%] :" + strProductVersion + "[%生成序号失败%]"); + return false; + } + + strUnitIdOrPannid = Conversions.ToString(dtSeqNo.Rows[0]["SeqNo"]); + + //校验生成的UnitId是否有禁用字符 + strSQL = $"SELECT DISABLE FROM TBLCUSDISABLEDFIELD WHERE PRODUCTNO='{strProductNo}'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drTemp.Read()) + { + if (strUnitIdOrPannid.Contains(drTemp["DISABLE"].ToString())) + { + InitPanleIdOrUnitId(ReserveSerialNo: true, SerialCount: 1L, SerialTypeNo: strSeqNoRule, LotNo: strMLotNo, PanleId: PanleId, ProductNo: strProductNo, SerialType: strSeqNoType, location: locations[i, j]); + goto PanelidOrUnitId; + //clsERP.combineMessage(ref aryMessage, mmsg: "[%序号生成%] : " + strUnitIdOrPannid + "存在禁用字符 :" + drTemp["DISABLE"].ToString() + ",请重新生成!"); + //return false; + } + } + drTemp.Close(); + strSQL = $"SELECT UNITID FROM TBLPCSDIELOG_LQ WHERE UNITID='{strUnitIdOrPannid}'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%UNITID在表TBLPCSDIELOG_LQ中已存在%]"); + return false; + } + drTemp.Close(); + //直接回写序号,防止被占用 + InitPanleIdOrUnitId(ReserveSerialNo: true, SerialCount: 1L, SerialTypeNo: strSeqNoRule, LotNo: strMLotNo, PanleId: PanleId, ProductNo: strProductNo, SerialType: strSeqNoType, location: locations[i, j]); + unitIdOrPannids[i, j] = strUnitIdOrPannid; + } + } + + return true; + } + finally + { + drTemp?.Close(); + } + } + + /// + /// 写入客制表 TBLPCSDIELOG_LQ(逐字抽出自 funTrackOut_Inquiry 原 :3171-3185,行为不变) + /// + private static void funSaveDieLog( + string PanleId, string inLotNo, string EQPID, string strOPNO, + int intColumn, int intLine, string carrierId, string strMNewLotSerial, + string[,] unitIdOrPannids, string[,] locations, Collection CollectionSQL) + { + string strSQL = default(string); + + for (int i = 0; i < intLine; i++) + { + for (int j = 0; j < intColumn; j++) + { + strSQL = $@"INSERT INTO TBLPCSDIELOG_LQ ( PANLEID,UNITID,LINE,""COLUMN"",EQPID,OPNO,LOTNO,CREATEDATE,LOCATIONNO ) VALUES('{PanleId}', '{unitIdOrPannids[i, j]}', '{i + 1}', '{j + 1}', '{EQPID}', '{strOPNO}', '{inLotNo}', SYSDATE, '{locations[i, j]}')"; + CollectionSQL.Add(strSQL); + + //回复处理 + strSQL = $"DELETE FROM TBLPCSDIELOG_LQ WHERE PANLEID='{PanleId}' AND LOTNO='{inLotNo}'"; + + objReverse.AddReverseUpdateContent(ref strMNewLotSerial, ref strSQL, CollectionSQL); + SaveWIPPrdStateLog_M(LotNo: inLotNo, ProductID: unitIdOrPannids[i, j], EQPID: EQPID, OPNo: strOPNO, State: 1, ProductType: "1", CarrierID: carrierId, LotSerial: strMNewLotSerial, colSQL: CollectionSQL); + + } + } + } + + /// + /// (xg)解析 mapdata 找出为 0 的位置,依产品走位设定换算成 LOCATIONNO 后打不良(BADFLAG=2、REASONNO='来料异常') + /// (xg)当传入 unitIdOrPannids 与 MotherLotNo 时,同时将不良品批次归属改回母批,并更新客制状态表 tblwipprdstate_LQ(STATE=2) + /// + /// EAP 送出之良品图,依行列自然顺序(row-major)排列,0=不良、1=良品 + /// 该产品之起始角(TBLPRDPRODUCTBASIS.STARTPOINT) + /// 该产品之走向(TBLPRDPRODUCTBASIS.DIRECTION) + /// (xg)各位置对应之 UNITID 二维阵列,传 null 则不更新客制状态表 + /// (xg)母批批号,传 null 则不良品 LOTNO 不变更 + //(xg)原签名: public static bool funMarkBadByMapData(ref List aryMessage, string PanleId, string LotNo, string MapData, string strSeqNoSize, string strDirection, int intColumn, int intLine, Collection colSQL) + //(xg)改签名: 新增 unitIdOrPannids, MotherLotNo 两个可选参数 + public static bool funMarkBadByMapData( + ref List aryMessage, + string PanleId, string LotNo, string MapData, + string strSeqNoSize, string strDirection, + int intColumn, int intLine, Collection colSQL, + string[,] unitIdOrPannids = null, string MotherLotNo = null) + { + string strSQL = default(string); + + //未传 mapdata 则不打不良、不报错 + if (string.IsNullOrEmpty(MapData)) + { + return true; + } + + //长度校验 + if (MapData.Length != intColumn * intLine) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%mapdata长度%]:" + MapData.Length + " [%与行列数不符%]:" + intColumn + "*" + intLine); + return false; + } + + //建立与写入 die log 时同源的走位对照表:LOCATIONNO 系沿走位路径编号, + //并非 mapdata 之行列自然顺序,故不可直接取 k+1(否则仅「左上+全部横向」一种设定会打对) + string[,] locations = new string[intLine, intColumn]; + funInitlocation(locations, strSeqNoSize, strDirection, intColumn, intLine); + + //(xg)新增: 当传入了 unitIdOrPannids 与 MotherLotNo 时,一并执行不良品归母批 + 客制状态表更新 + bool bolUpdateState = (unitIdOrPannids != null && !string.IsNullOrEmpty(MotherLotNo)); + + for (int k = 0; k < MapData.Length; k++) + { + //0 = 不良、1 = 良品 + if (MapData[k] == '0') + { + //mapdata 第 k 位 → 第 (k / intLine) 行、第 (k % intLine) 列 + int intRow = k / intLine; + int intCol = k % intLine; + string strLocationNo = locations[intCol, intRow]; + + if (bolUpdateState) + { + //(xg)新增1.更新 TBLPCSDIELOG_LQ:打不良标记 + 改批次归属为母批 LOTNO=MotherLotNo(只分良品,不分不良品) + //strSQL = $@"UPDATE TBLPCSDIELOG_LQ SET BADFLAG = 2, REASONNO = '来料异常', LOTNO = '{MotherLotNo}' WHERE LOCATIONNO = '{strLocationNo}' AND PANLEID = '{PanleId}' AND LOTNO = '{LotNo}'"; + strSQL = $@"UPDATE TBLPCSDIELOG_LQ SET BADFLAG = 2, REASONNO = '来料异常' WHERE LOCATIONNO = '{strLocationNo}' AND PANLEID = '{PanleId}' AND LOTNO = '{LotNo}'"; + colSQL.Add(strSQL); + + //(xg)新增2.更新客制状态表 tblwipprdstate_LQ:不良品状态 STATE 改为 2 + string strUnitId = unitIdOrPannids[intCol, intRow]; + strSQL = $@"UPDATE TBLWIPPRDSTATE_LQ SET STATE = 2 WHERE PRODUCTID = '{strUnitId}' AND PRODUCTTYPE = '1' AND STATE = 1"; + colSQL.Add(strSQL); + } + else + { + //原版行为:仅打不良标记 BADFLAG=2、REASONNO='来料异常',不做批次归属变更 + strSQL = $@"UPDATE TBLPCSDIELOG_LQ SET BADFLAG = 2, REASONNO = '来料异常' WHERE LOCATIONNO = '{strLocationNo}' AND PANLEID = '{PanleId}' AND LOTNO = '{LotNo}'"; + colSQL.Add(strSQL); + } + } + } + + return true; + } + + + /// + /// 产生位置号与序号并写入 TBLPCSDIELOG_LQ(自 funTrackOut_Inquiry 逐字抽出,行为不变) + /// + /// 母批批号,供序号产生器使用(等同首站接口的 strMLotNo) + /// 记录批号,写入客制表使用;有分批时为子批(等同首站接口的 inLotNo) + public static bool funCreateDieLog( + ref List aryMessage, ref List aryException, + string PanleId, string MotherLotNo, string LotNo, string EQPID, string OPNO, + string ProductNo, string ProductVersion, + string SeqNoRule, string SeqNoType, string SeqNoSize, string Direction, + int intColumn, int intLine, string CarrierId, string LotSerial, + Collection colSQL, IDbConnection cnnTemp) + { + string[,] unitIdOrPannids = new string[intLine, intColumn]; + string[,] locations = new string[intLine, intColumn]; + + //产生位置号与序号:序号产生器用母批 + if (!funInitDieSerial(ref aryMessage, ref aryException, PanleId, MotherLotNo, ProductNo, ProductVersion, SeqNoRule, SeqNoType, SeqNoSize, Direction, intColumn, intLine, unitIdOrPannids, locations, cnnTemp)) + { + return false; + } + + //写入客制表:die log 用记录批号(有分批时为子批) + funSaveDieLog(PanleId, LotNo, EQPID, OPNO, intColumn, intLine, CarrierId, LotSerial, unitIdOrPannids, locations, colSQL); + + return true; + } + + + + + + + + + + + + + + + + + + /// + /// 出站 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + // 17单:作业站属性存在即生效(M7)——服务端直查 TBLOPPROPERTY + private static bool funOPPropertyExists_LQ(string OPNO, string PropertyNo, IDbConnection cnnTemp) + { + DataTable dt = new DataTable(); + string strSQL = $"SELECT 1 FROM TBLOPPROPERTY WHERE OPNO='{OPNO}' AND PROPERTYNO='{PropertyNo}' AND ISSUESTATE=2"; + ExecuteSQLQuery_Adapter(strSQL, dt, cnnTemp); + return dt.Rows.Count > 0; + } + + // 17单 M6(内联,EAItc 不引用 MEStc_LQ):TRAY 上无 carrier 则寿命+1(门槛), + // 达报废(3)/维修(2)则保留该状态,未触门槛才置闲置(0)——等价 MEStc_LQ.clsEQP.EditCarrierLife + M6 优先序 + private static void funUnbindTrayLife_LQ(string CarrierId, string TrayId, string UserNo, string strDataBaseType, string strConnectionString, IDbConnection cnnTemp) + { + // 删该 carrier 在 TRAY 的绑定明细 + Collection colDel = new Collection(); + colDel.Add($"delete from TBLWIPTRAYSTATE_LQ where trayid='{TrayId}' and carrierid='{CarrierId}'"); + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colDel); + + // TRAY 上是否还有 carrier + DataTable dtRest = new DataTable(); + ExecuteSQLQuery_Adapter($"select 1 from TBLWIPTRAYSTATE_LQ where trayid='{TrayId}'", dtRest, cnnTemp); + if (dtRest.Rows.Count > 0) return; + + // 取 TRAY 的 CarrierType + string strType = ""; + DataTable dtCt = new DataTable(); + ExecuteSQLQuery_Adapter($"select CarrierType from tblWIPCarrierState where CarrierNo='{TrayId}'", dtCt, cnnTemp); + if (dtCt.Rows.Count > 0) strType = dtCt.Rows[0]["CarrierType"].ToString(); + + Collection colLife = new Collection(); + string strNewState = "0"; // 默认闲置 + DataTable dtSet = new DataTable(); + ExecuteSQLQuery_Adapter($"select ALERTCOUNT,LIMITCOUNT,SCRAPCOUNT from TBLCUSCARRIERLIFESET where CARRIERTYPE='{strType}'", dtSet, cnnTemp); + if (dtSet.Rows.Count > 0) + { + DataTable dtLife = new DataTable(); + ExecuteSQLQuery_Adapter($"select ACCUMULATEQTY,ACCTOTALUSEDQTY from TBLCUSCARRIERLIFE where CARRIERNO='{TrayId}'", dtLife, cnnTemp); + if (dtLife.Rows.Count > 0) + { + decimal accQty = decimal.Parse(dtLife.Rows[0]["ACCUMULATEQTY"].ToString()); + decimal accTotal = decimal.Parse(dtLife.Rows[0]["ACCTOTALUSEDQTY"].ToString()); + decimal limitCnt = decimal.Parse(dtSet.Rows[0]["LIMITCOUNT"].ToString()); + decimal scrapCnt = decimal.Parse(dtSet.Rows[0]["SCRAPCOUNT"].ToString()); + if (accTotal + 1 >= scrapCnt) strNewState = "3"; // 报废 + else if (accQty + 1 >= limitCnt) strNewState = "2"; // 维修 + colLife.Add($"update TBLCUSCARRIERLIFE set ACCUMULATEQTY=ACCUMULATEQTY+1, ACCTOTALUSEDQTY=ACCTOTALUSEDQTY+1, REVISER='{UserNo}', REVISEDATE=sysdate where CARRIERNO='{TrayId}'"); + } + } + // M6 优先序:门槛(3/2)优先,未触门槛才置闲置(0) + colLife.Add($"update TBLWIPCARRIERSTATE set CARRIERSTATE={strNewState} where CARRIERNO='{TrayId}'"); + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colLife); + } + + // 17单 需求二/三:依作业站属性自动解绑(TRAY / 小载具)+ 分批出站(隐藏站转移) + // 回传 false=属性分支执行失败;bolHandled=true 表示已处理完成,呼叫端不再走标准判型出站 + private static bool funAutoUnbindCheckOut_LQ(ref List aryMessage, string Type, string strProductID_Auto, string strCarrierID_Auto, string EQPID, out bool bolHandled) + { + bolHandled = false; + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + IDbConnection cnnTemp = CreateConnection(strConnectionString); + const string UserNo = "EAP"; + try + { + // 1.由 ID 反查母批 LotNo + // ★同一载具上可能同时存在多笔 STATE=1 明细:依载具分批出站后,片(PRODUCTTYPE=0)的明细列 + // 仍挂在已分批结批消耗的母批上,与新子批的颗明细共存于同一 CARRIERID。 + // 若不加区别地取第一笔,可能取到已结批的批号(Oracle 不保证回传顺序), + // 下一步在 TBLWIPLOTSTATE 便查无该批而退回标准流程,现象即为「解绑逻辑触发不了」, + // 且随着该载具每次成功解绑而累积残留列,失败机率愈来愈高。 + // 故此处 inner join TBLWIPLOTSTATE 只取仍在制的批,并明确排序确保结果稳定。 + string strSQL; + string strIdCond = Type == "2" + ? $"P.CARRIERID = '{strCarrierID_Auto}'" + : $"P.PRODUCTID = '{strProductID_Auto}'"; + strSQL = $@"select distinct P.LOTNO as LotNo from TBLWIPPRDSTATE_LQ P inner join TBLWIPLOTSTATE S on S.LOTNO = P.LOTNO where {strIdCond} and P.STATE = 1 order by 1"; + DataTable dtLot = new DataTable(); + ExecuteSQLQuery_Adapter(strSQL, dtLot, cnnTemp); + if (dtLot.Rows.Count == 0) + { + // 找不到明细,交回标准流程;留下讯息供现场判读,否则此处静默退出无从追查 + clsERP.combineMessage(ref aryMessage, mmsg: (Type == "2" ? strCarrierID_Auto : strProductID_Auto) + "[%:在TBLWIPPRDSTATE_LQ查无仍在制的在制明细(STATE=1),不执行自动解绑,按标准流程出站%]"); + return true; + } + string strMLotNo = dtLot.Rows[0]["LotNo"].ToString(); + if (dtLot.Rows.Count > 1) + { + // 对应到多个仍在制的生产批属资料异常;取排序后第一笔续行,并留下讯息供现场厘清,不静默带过 + string strLots = ""; + foreach (DataRow rLot in dtLot.Rows) + strLots += (strLots == "" ? "" : ",") + rLot["LotNo"].ToString(); + clsERP.combineMessage(ref aryMessage, mmsg: (Type == "2" ? strCarrierID_Auto : strProductID_Auto) + "[%:对应到多个在制生产批%](" + strLots + ")[%,已取%]" + strMLotNo + "[%续行,请确认明细资料%]"); + } + + // 2.取母批在制信息 + DataTable dtSt = new DataTable(); + strSQL = $"SELECT A.OPNO,A.LOTSTAMP,A.CURQTY,A.CURUNITNO,A.LOTSERIAL,B.PRODUCTNO,B.PRODUCTVERSION FROM TBLWIPLOTSTATE A LEFT JOIN TBLWIPLOTBASIS B ON A.LOTNO = B.BASELOTNO WHERE A.LOTNO = '{strMLotNo}'"; + ExecuteSQLQuery_Adapter(strSQL, dtSt, cnnTemp); + if (dtSt.Rows.Count == 0) + { + clsERP.combineMessage(ref aryMessage, mmsg: strMLotNo + "[%:在TBLWIPLOTSTATE查无该批在制资料,不执行自动解绑,按标准流程出站%]"); + return true; + } + string strOPNO = dtSt.Rows[0]["OPNO"].ToString(); + long lngLotStamp = Conversions.ToLong(dtSt.Rows[0]["LOTSTAMP"].ToString()); + string strUnitNo = dtSt.Rows[0]["CURUNITNO"].ToString(); + string strProductNo = dtSt.Rows[0]["PRODUCTNO"].ToString(); + string strProductVersion = dtSt.Rows[0]["PRODUCTVERSION"].ToString(); + + // 3.读作业站属性(M7 存在即生效)+ M8 互斥 + bool blnAutoTray = funOPPropertyExists_LQ(strOPNO, "自动解绑TRAY", cnnTemp); + bool blnUnitUnbind = funOPPropertyExists_LQ(strOPNO, "unit出站解绑载具", cnnTemp); + if (blnAutoTray && blnUnitUnbind) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%本作业站同时设定【自动解绑TRAY】与【unit出站解绑载具】,请择一%]"); + return false; + } + if (!blnAutoTray && !blnUnitUnbind) + { + // 无属性,走标准流程;留下讯息指明查的是哪一站,便于现场核对作业站属性维护 + clsERP.combineMessage(ref aryMessage, mmsg: strOPNO + "[%:未设定【自动解绑TRAY】或【unit出站解绑载具】属性,不执行自动解绑,按标准流程出站%]"); + return true; + } + + bool blnByCarrier = blnAutoTray; // true=一 carrier 一批(解绑TRAY);false=一 unit 一批(解绑小载具) + + // 4.B1 防呆:一 carrier 一批时,存在未绑载具单位则挡下(否则 Σ子批≠CurQty) + if (blnByCarrier) + { + DataTable dtNoCar = new DataTable(); + ExecuteSQLQuery_Adapter($"select count(*) as CNT from TBLWIPPRDSTATE_LQ where LotNo='{strMLotNo}' and producttype=1 and state=1 and (carrierid is null or carrierid='')", dtNoCar, cnnTemp); + if (dtNoCar.Rows.Count > 0 && decimal.Parse(dtNoCar.Rows[0]["CNT"].ToString()) > 0) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%存在未绑定载具的单位,不可出站%]"); + return false; + } + } + + // 5.分组(carrier / unit) + DataTable dtGroup = new DataTable(); + if (blnByCarrier) + ExecuteSQLQuery_Adapter($"select carrierid as KEYID, count(*) as CNT from TBLWIPPRDSTATE_LQ where LotNo='{strMLotNo}' and producttype=1 and state=1 group by carrierid", dtGroup, cnnTemp); + else + ExecuteSQLQuery_Adapter($"select productid as KEYID, 1 as CNT from TBLWIPPRDSTATE_LQ where LotNo='{strMLotNo}' and producttype=1 and state=1", dtGroup, cnnTemp); + if (dtGroup.Rows.Count == 0) + { + clsERP.combineMessage(ref aryMessage, mmsg: strMLotNo + "[%:查无PRODUCTTYPE=1且STATE=1的在制明细,无法分批,不执行自动解绑,按标准流程出站%]"); + return true; + } + + // 6.取子批号(整批拆分,不含母批;母批以分批結批消耗) + List lstSubLot = new List(); + using (kcSYS.clsSYSEng objSYSEng = new kcSYS.clsSYSEng()) + { + for (int k = 0; k < dtGroup.Rows.Count; k++) + lstSubLot.Add(objSYSEng.GetSplitLotNo(true, strMLotNo, "")); + } + + // 7.建分批表 + DataTable dtSplitLot = new DataTable("SplitLot"); + dtSplitLot.Columns.Add("SplitLotNo", typeof(string)); + dtSplitLot.Columns.Add("SplitLotQty", typeof(decimal)); + dtSplitLot.Columns.Add("SplitSysQty", typeof(decimal)); + dtSplitLot.Columns.Add("Action", typeof(int)); + dtSplitLot.Columns.Add("NodeID", typeof(string)); + dtSplitLot.Columns.Add("ReturnType", typeof(int)); + dtSplitLot.Columns.Add("FromProductNo", typeof(string)); + dtSplitLot.Columns.Add("FromProductVersion", typeof(string)); + dtSplitLot.Columns.Add("ProductNo", typeof(string)); + dtSplitLot.Columns.Add("ProductVersion", typeof(string)); + dtSplitLot.Columns.Add("UnitNo", typeof(string)); + dtSplitLot.Columns.Add("OPNo", typeof(string)); + dtSplitLot.Columns.Add("KeyId", typeof(string)); + for (int k = 0; k < dtGroup.Rows.Count; k++) + { + DataRow dr = dtSplitLot.NewRow(); + dr["SplitLotNo"] = lstSubLot[k]; + dr["SplitLotQty"] = dtGroup.Rows[k]["CNT"]; + dr["SplitSysQty"] = dtGroup.Rows[k]["CNT"]; + dr["Action"] = 0; + dr["NodeID"] = ""; + dr["ReturnType"] = 0; + dr["FromProductNo"] = strProductNo; + dr["FromProductVersion"] = strProductVersion; + dr["ProductNo"] = strProductNo; + dr["ProductVersion"] = strProductVersion; + dr["UnitNo"] = strUnitNo; + dr["OPNo"] = strOPNO; + dr["KeyId"] = dtGroup.Rows[k]["KEYID"].ToString(); + dtSplitLot.Rows.Add(dr); + } + + // 8.执行分批(kernel;整批拆分,母批消耗结批) + // SplitType 必须为 1(BR分批):kc 註明「若是BR則分批完成,Status要變更為4」, + // 子批 Status=4 才允许後續 BRTransferLot_Bin_M(否则 0000-203033)。SplitType=0 是站中手動分批,不變更狀態。 + using (kcWIP.clsLot objLot = new kcWIP.clsLot()) + { + // LinkName 必须传 "PASS":子批 LINKNAME 若留空,後續 TransferLot_Bin_M 会以空字串去 GetNextBR, + // 查无下一个 BR 而报「Next BR is not exist」。传 PASS 不影响 Status(仅 HOLD/WAIT 走别的分支)。 + objLot.BR_Manual_LotSplit(lngLotStamp, strMLotNo, 1, UserNo, dtSplitLot, LinkName: "PASS"); + } + + // 9.明细更新(carrier:清 TRAYID 留 carrierid;unit:清 carrierid/LOCATIONNO) + Collection CollectionSQL = new Collection(); + // TBLPCSDIELOG_LQ 的两种比对键分开收集:PANLEID 是整片 panel 一起更新(粗), + // UNITID 只动一颗(精确)。粗的先执行、精确的后执行,同一片 panel 的单位分散在 + // 不同载具(=不同子批)时,才不会被 panel 那笔回头盖掉。 + Collection colDiePanel = new Collection(); + Collection colDieUnit = new Collection(); + bool blnPanelCloned = false; // 有补过子批片明细才需要让母批片明细退场 + Dictionary dicTrayCarrier = new Dictionary(); + foreach (DataRow dr in dtSplitLot.Rows) + { + string strSubLot = dr["SplitLotNo"].ToString(); + string strKey = dr["KeyId"].ToString(); + string strSubOP = strOPNO; + DataTable dtSub = new DataTable(); + ExecuteSQLQuery_Adapter($"select OPNO from tblwiplotstate where LotNo='{strSubLot}'", dtSub, cnnTemp); + if (dtSub.Rows.Count > 0) strSubOP = dtSub.Rows[0]["OPNO"].ToString(); + + if (blnByCarrier) + { + // 明细须锁定母批:同一载具上若有其他批的残留单位,未锁批会被一并改挂到子批 + DataTable dtCar = new DataTable(); + ExecuteSQLQuery_Adapter($"select TRAYID from TBLWIPPRDSTATE_LQ where carrierid='{strKey}' and producttype=1 and state=1 and lotno='{strMLotNo}'", dtCar, cnnTemp); + if (dtCar.Rows.Count > 0) + { + // 取第一个非空 TRAYID(不可用 Rows[0],该列 TRAYID 可能为空而漏掉整段解绑) + string strTray = ""; + foreach (DataRow rTray in dtCar.Rows) + { + string strTmpTray = rTray["TRAYID"].ToString(); + if (!string.IsNullOrEmpty(strTmpTray)) { strTray = strTmpTray; break; } + } + if (!string.IsNullOrEmpty(strTray) && !dicTrayCarrier.ContainsKey(strKey)) dicTrayCarrier.Add(strKey, strTray); + } + // 子批号等于母批号代表未真正分批,补片明细会变成自我复制,故略过 + bool blnDoPanel = strSubLot != strMLotNo; + + // 颗明细改挂前先补履历(来源列此时仍在母批上) + if (blnDoPanel) funAddUnitLogForSubLot_LQ(strMLotNo, strSubLot, strSubOP, strKey, CollectionSQL); + + CollectionSQL.Add($"update tblwipprdstate_LQ set lotno='{strSubLot}', opno='{strSubOP}', TRAYID='', TRAYPOSITION='' where carrierid='{strKey}' and producttype='1' and state='1' and lotno='{strMLotNo}'"); + + // 片明细依子批各补一笔 + if (blnDoPanel) + { + funAddPanelRowsForSubLot_LQ(strMLotNo, strSubLot, strSubOP, strKey, CollectionSQL, cnnTemp); + blnPanelCloned = true; + } + + // 同步产品履历表 TBLPCSDIELOG_LQ 的批号与作业站: + // 依该载具下每列的 PRODUCTTYPE 决定比对键——0=Panel 用 PANLEID,1=Unit 用 UNITID + DataTable dtDie = new DataTable(); + ExecuteSQLQuery_Adapter($"select PRODUCTID, PRODUCTTYPE from TBLWIPPRDSTATE_LQ where carrierid='{strKey}' and state=1 and lotno='{strMLotNo}'", dtDie, cnnTemp); + foreach (DataRow rDie in dtDie.Rows) + { + bool blnPanel = rDie["PRODUCTTYPE"].ToString() == "0"; + string strKeyCol = blnPanel ? "PANLEID" : "UNITID"; + string strDieSQL = $"update TBLPCSDIELOG_LQ set LOTNO='{strSubLot}', OPNO='{strSubOP}' where {strKeyCol}='{rDie["PRODUCTID"]}'"; + if (blnPanel) colDiePanel.Add(strDieSQL); else colDieUnit.Add(strDieSQL); + } + } + else + { + CollectionSQL.Add($"update tblwipprdstate_LQ set lotno='{strSubLot}', opno='{strSubOP}', carrierid=null, LOCATIONNO=null where productid='{strKey}' and producttype='1' and state='1'"); + + // 同步产品履历表 TBLPCSDIELOG_LQ:一 unit 一批,分组键即 UNITID + colDieUnit.Add($"update TBLPCSDIELOG_LQ set LOTNO='{strSubLot}', OPNO='{strSubOP}' where UNITID='{strKey}'"); + } + } + // 先粗后精:panel 层全部更新完,再让 unit 层逐颗覆写成各自子批 + foreach (string s in colDiePanel) CollectionSQL.Add(s); + foreach (string s in colDieUnit) CollectionSQL.Add(s); + + // 母批片明细退场:必须排在所有子批片明细 insert 之后(那些 insert 以这些列为来源) + if (blnPanelCloned) + { + CollectionSQL.Add($"update TBLWIPPRDSTATE_LQ set STATE=0 where lotno='{strMLotNo}' and producttype='0' and state=1"); + } + + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + + // 10.carrier:解绑TRAY + 寿命门槛(M6) + if (blnByCarrier) + { + foreach (KeyValuePair kv in dicTrayCarrier) + funUnbindTrayLife_LQ(kv.Key, kv.Value, UserNo, strDataBaseType, strConnectionString, cnnTemp); + } + + // 11.逐子批出站转移(BRTransferLot_Bin_M 内含隐藏站规则 —— M11)。 + // 子批 Status 已由步骤 8 的 BR 分批(SplitType=1)置为 4,此处直接转移;比照母本 clsEAP.cs:2975→2987。 + foreach (DataRow dr in dtSplitLot.Rows) + { + string strSubLot = dr["SplitLotNo"].ToString(); + string strComputerName = System.Net.Dns.GetHostName(); + + BRTransferLot_Bin_M(strSubLot, UserNo, "PASS", 0, defString, ComputerName: strComputerName, RuleMsg: ""); + } + + clsERP.combineMessage(ref aryMessage, mmsg: strMLotNo + "[%:出站并自动解绑成功%]"); + bolHandled = true; + return true; + } + catch (Exception ex) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%自动解绑出站失败%]:" + ex.Message); + return false; + } + finally + { + CloseConnection(cnnTemp); + } + } + + // 17单(内联,EAItc 不引用 MEStc_LQ):依载具分批时,片(PRODUCTTYPE=0)明细依子批各补一笔 + // 现况列 + 一笔履历列。★片与颗的对应以产品履历 TBLPCSDIELOG_LQ 的 PANLEID/UNITID 为准, + // 不可直接沿用载具上的片列——同一载具的片未必与该载具的颗同片,而同一片的颗又会散落到不同子批。 + // ★母批原片列的退场(STATE=0)由呼叫端在所有子批处理完后统一执行:先退场会让后续子批取不到来源列。 + // 与 MEStc_LQ.clsWIP.funAddPanelRowsForSubLot_LQ 等价,履历写入比照 14 单既有模式。 + private static void funAddPanelRowsForSubLot_LQ(string LotNo, string strSubLot, string strSubOP, + string strCarrierId, Collection colSQL, IDbConnection cnnTemp) + { + DataTable dtPanel = new DataTable(); + ExecuteSQLQuery_Adapter($"select distinct D.PANLEID from TBLPCSDIELOG_LQ D where D.UNITID in (select PRODUCTID from TBLWIPPRDSTATE_LQ where carrierid='{strCarrierId}' and producttype='1' and state='1' and lotno='{LotNo}')", dtPanel, cnnTemp); + + foreach (DataRow drPanel in dtPanel.Rows) + { + string strPanelId = drPanel["PANLEID"].ToString(); + if (string.IsNullOrEmpty(strPanelId)) continue; + + colSQL.Add($"insert into TBLWIPPRDSTATE_LQ (LOTNO,PRODUCTID,EQPID,STATE,OPNO,CARRIERID,PRODUCTTYPE,CREATEDATE,TRAYID,TRAYPOSITION) select '{strSubLot}',PRODUCTID,EQPID,1,'{strSubOP}',CARRIERID,PRODUCTTYPE,SYSDATE,'','' from TBLWIPPRDSTATE_LQ where lotno='{LotNo}' and productid='{strPanelId}' and producttype='0' and state=1"); + colSQL.Add($"insert into TBLWIPPRDLOG_LQ (LOTNO,PRODUCTID,EQPID,OPNO,CARRIERID,PRODUCTTYPE,CREATEDATE) select '{strSubLot}',PRODUCTID,EQPID,'{strSubOP}',CARRIERID,PRODUCTTYPE,SYSDATE from TBLWIPPRDSTATE_LQ where lotno='{LotNo}' and productid='{strPanelId}' and producttype='0' and state=1"); + } + } + + // 17单(内联):颗明细改挂子批时补一笔履历。★必须在颗明细被 update 改挂之前加入集合。 + private static void funAddUnitLogForSubLot_LQ(string LotNo, string strSubLot, string strSubOP, + string strCarrierId, Collection colSQL) + { + colSQL.Add($"insert into TBLWIPPRDLOG_LQ (LOTNO,PRODUCTID,EQPID,OPNO,CARRIERID,PRODUCTTYPE,CREATEDATE) select '{strSubLot}',PRODUCTID,EQPID,'{strSubOP}',CARRIERID,PRODUCTTYPE,SYSDATE from TBLWIPPRDSTATE_LQ where lotno='{LotNo}' and carrierid='{strCarrierId}' and producttype='1' and state=1"); + } + + } + + +} diff --git a/MESEAI/EAItc/clsERP.cs b/MESEAI/EAItc/clsERP.cs new file mode 100644 index 0000000..6836851 --- /dev/null +++ b/MESEAI/EAItc/clsERP.cs @@ -0,0 +1,4172 @@ +using iMESCIO.SCI.SMES.Request; +using iMESCIOC.Request.EAP; +using iMESCIOC.Request.WMS_Request; +using iMESCore.Base; +using iMESCore.DataBase; +using iMESCore.DataBase; +using iMESCore.Settings; +using iMESCore.Settings; +using kcOE; +using kcSYS; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.ApplicationServices; +using Microsoft.VisualBasic.CompilerServices; +using Org.BouncyCastle.Asn1.X9; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Crypto.Engines; +using Org.BouncyCastle.Crypto.Generators; +using Org.BouncyCastle.Crypto.Parameters; +using Org.BouncyCastle.Math; +using Org.BouncyCastle.Math.EC; +using Org.BouncyCastle.Security; +using Org.BouncyCastle.Utilities.Encoders; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Text; +using System.Xml; +using static iMESCore.Base.iMESComXML; +using static iMESCore.Base.iMESConst; +using static iMESCore.DataBase.iMESSql; + +namespace tcEAI_C +{ + public class clsERP + { + #region --- Combine (Exception, Message) --- + + public static bool combineException(ref List strException, 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); + strException.Add(al); + result = true; + } + catch (Exception ex) + { + result = false; + } + + return default(bool); + + } + + public static bool combineMessage(ref List strMessage, string mcode = null, string mtype = null, string mmsg = null) + { + bool result = false; + try + { + var al = new ArrayList(); + al.Add(mcode); + al.Add(mtype); + al.Add(mmsg); + strMessage.Add(al); + result = true; + } + catch (Exception ex) + { + result = false; + } + + return default(bool); + } + + public static bool combineFileMessage(ref List aryFileMessage, string mmsg) + { + bool result = false; + + try + { + var al = new ArrayList(); + al.Add(mmsg); + aryFileMessage.Add(al); + result = true; + } + catch (Exception ex) + { + result = false; + } + + return result; + } + #endregion + + + #region "add by 14166 for 加密接口" + + /// + /// 检查用户 + /// + /// + /// + /// + /// + /// + public static string funCheckUser(string UserNo, string UserPassword) + { + string funCheckUserRet = default(string); + funCheckUserRet = "fail"; + + AppSettings objSetting = new AppSettings(); + + DbDataReader drTemp = null; + IDbConnection cnnTemp = null; + string strSQL = ""; + + var objSYS = new kcSYS.clsSYSFunction(); + + string PasswordDecoding = "";//接口传入密码 + string sysPassword = "";//MES系统绑定DS密码 + + try + { + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); // Create connection + + strSQL = " select PASSWORD from tblusruserbasis where userno='" + UserNo + "' "; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + sysPassword = drTemp["PASSWORD"].ToString(); + } + else + { + throw new iMESException.MESException("0000-202001", "[%UserNo%] : " + "DS"); + } + drTemp.Close(); + + + + sysPassword = objSYS.PasswordDecoding(sysPassword); + + + //SM2解密 + // 生成密钥对 + + string privateKey = "Ja4UIUJz7XRNDhIiuWXwL78qd1Pc7SC0/Z9LzyF4SL8="; + //string publicKey = "BGe1BZDFN+NhCQtc2qlVk8nUlXrIwcyjT3mMt7Xx3BkDNBGBQjFPV0+h3/cGUYXo2TFI1SShS7hWl9zi6SxUHvg="; + + //解密 + PasswordDecoding = Decrypt(UserPassword, privateKey); + + + if (sysPassword != PasswordDecoding) + { + throw new iMESException.MESException("", "用户:" + UserNo + "权限校验失败"); + } + + //if (strException.Count > 0) + // goto exitfun; + + + funCheckUserRet = "success"; + + + //exitfun: + ; + + } + catch (Exception ex) + { + throw; + //clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%CheckUserFail%]", stack: iMESCore.Base.iMESComXML.CInput(ex.StackTrace)); + } + + finally + { + CloseConnection(cnnTemp); + } + return funCheckUserRet; + + + } + + + + /// + /// 生成 SM2 密钥对,密钥对使用 Base64 进行编码 + /// + /// + /// + public static void GenerateSM2KeyPair(out string privateKey, out string publicKey) + { + // 获取 SM2 曲线参数 + X9ECParameters curve = ECNamedCurveTable.GetByName("sm2p256v1"); + KeyGenerationParameters parameters = new ECKeyGenerationParameters(new ECDomainParameters(curve), new SecureRandom()); + + // 创建 SM2 密钥对生成器 + ECKeyPairGenerator generator = new ECKeyPairGenerator(); + generator.Init(parameters); + + // 创建密钥对 + var keyPair = generator.GenerateKeyPair(); + + // 私钥 + ECPrivateKeyParameters privateKeyParameters = (ECPrivateKeyParameters)keyPair.Private; + privateKey = Base64.ToBase64String(privateKeyParameters.D.ToByteArrayUnsigned()); + + // 公钥 + ECPublicKeyParameters publicKeyParameters = (ECPublicKeyParameters)keyPair.Public; + publicKey = Base64.ToBase64String(publicKeyParameters.Q.GetEncoded()); + } + + + /// + /// SM2公钥加密 + /// + /// + /// + /// + public static string Encrypt(string strs, string publicKey) + { + //获取SM2曲线参数 + X9ECParameters curve = ECNamedCurveTable.GetByName("sm2p256v1"); + + ECPoint q = curve.Curve.DecodePoint(Convert.FromBase64String(publicKey)); + ECDomainParameters domainParameters = new ECDomainParameters(curve); + ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters("EC", q, domainParameters); + + //创建SM2加密器 + SM2Engine engine = new SM2Engine(); + engine.Init(true, new ParametersWithRandom(publicKeyParameters, new SecureRandom())); + + //把待加密的字符串转换成字节数组 + byte[] bytes = Encoding.UTF8.GetBytes(strs); + + //执行加密 + byte[] result = engine.ProcessBlock(bytes, 0, bytes.Length); + + //将加密结果转换成Base64字符串,并返回 + return Convert.ToBase64String(result); + } + + /// + /// SM2私钥解密 + /// + /// + /// + /// + public static string Decrypt(string strs, string privateKey) + { + + try + { + //获取SM2曲线参数 + X9ECParameters curve = ECNamedCurveTable.GetByName("sm2p256v1"); + + ECDomainParameters domainParameters = new ECDomainParameters(curve); + BigInteger bigInteger = new BigInteger(1, Convert.FromBase64String(privateKey)); + ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(bigInteger, domainParameters); + + //创建SM2解密器 + SM2Engine engine = new SM2Engine(); + engine.Init(false, privateKeyParameters); + + //把待解密的Base64字符串转换成字节数组 + byte[] bytes = Convert.FromBase64String(strs); + + //执行解密 + byte[] result = engine.ProcessBlock(bytes, 0, bytes.Length); + + //将解密结果转换成字符串,并返回 + return Encoding.UTF8.GetString(result); + } + catch (FormatException) + { + throw new ArgumentException("Base64格式无效", nameof(strs)); + } + catch (Exception ex) + { + // 其他所有异常包装后重新抛出 + throw new InvalidOperationException($"SM2解密失败: {ex.Message}", ex); + } + + //try + //{ + // // 获取SM2曲线参数 + // var curve = ECNamedCurveTable.GetByName("sm2p256v1"); + // var domainParameters = new ECDomainParameters(curve); + + // var privateKeyBytes = Convert.FromBase64String(_privateKey); + // var bigInteger = new BigInteger(1, privateKeyBytes); + // var privateKeyParameters = new ECPrivateKeyParameters(bigInteger, domainParameters); + + // // 创建SM2解密器 + // using var engine = new SM2Engine(); + // engine.Init(false, privateKeyParameters); + + // // 解密 + // var encryptedBytes = Convert.FromBase64String(encryptedText); + // var resultBytes = engine.ProcessBlock(encryptedBytes, 0, encryptedBytes.Length); + + // return Encoding.UTF8.GetString(resultBytes); + //} + //catch (FormatException) + //{ + // throw new ArgumentException("Base64格式无效", nameof(encryptedText)); + //} + //catch (Exception ex) + //{ + // // 记录日志 + // LogError($"SM2解密失败: {ex.Message}"); + // throw new CryptographicException("解密过程中发生错误", ex); + //} + + + } + + + + + + + + #endregion + + public static bool addTransactionLog_ErrorCode(string TransactionID, string ModuleID, string FunctionID, string ComputerName, string CurUserNo, string SendTime, string Result, string KeyValue, List strMessage, List strException, string InXml, string OutXml, string ExceptionFun, int KeepDays, int KeepXML, string ErrorCode = "0000-999999", string LogClass = null) + { + bool r = false; + var CollectionSQL = new Collection(); + + try + { + AppSettings objSetting = new AppSettings(); + // 2017/12/06 OwenLiu, mantis:0042964 修正ERP交易紀錄刪除舊資料因時間不同步造成的問題 + var datEventTime = DateTime.Now; + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + + List> parameters = new List>(); + List pars1 = new List(); + List pars2 = new List(); + + parameters.Add(pars1); + + // Transaction(ID) + string g = Guid.NewGuid().ToString(); + // 2022/12/2,Ning,122356: 台基---erp交易记录无法查询 + g = g.Replace(Constants.vbNullChar, ""); + + + if (TransactionID == null) + pars1.Add(new clsDbParameter("TransactionID", DBNull.Value)); + else + pars1.Add(new clsDbParameter("TransactionID", TransactionID)); + if (ModuleID == null) + pars1.Add(new clsDbParameter("ModuleID", DBNull.Value)); + else + pars1.Add(new clsDbParameter("ModuleID", ModuleID)); + if (FunctionID == null) + pars1.Add(new clsDbParameter("FunctionID", DBNull.Value)); + else + pars1.Add(new clsDbParameter("FunctionID", FunctionID)); + if (ComputerName == null) + pars1.Add(new clsDbParameter("ComputerName", DBNull.Value)); + else + pars1.Add(new clsDbParameter("ComputerName", ComputerName)); + if (CurUserNo == null) + pars1.Add(new clsDbParameter("CurUserNo", DBNull.Value)); + else + pars1.Add(new clsDbParameter("CurUserNo", CurUserNo)); + if (SendTime == null || !Information.IsDate(SendTime)) + pars1.Add(new clsDbParameter("SendTime", DBNull.Value)); + else + pars1.Add(new clsDbParameter("SendTime", Convert.ToDateTime(SendTime))); + if (Result == null) + pars1.Add(new clsDbParameter("Result", DBNull.Value)); + else + pars1.Add(new clsDbParameter("Result", Result)); + if (KeyValue == null) + pars1.Add(new clsDbParameter("KeyValue", DBNull.Value)); + else + pars1.Add(new clsDbParameter("KeyValue", KeyValue)); + + // 2017/12/06 OwenLiu, mantis:0042964 修正ERP交易紀錄刪除舊資料因時間不同步造成的問題 + pars1.Add(new clsDbParameter("CreateDate", datEventTime)); + + if (LogClass == null) + pars1.Add(new clsDbParameter("LogClass", DBNull.Value)); + else + pars1.Add(new clsDbParameter("LogClass", LogClass)); + if (Result != null && Result.ToUpper() == "SUCCESS") + pars1.Add(new clsDbParameter("ErrorCode", DBNull.Value)); + else + pars1.Add(new clsDbParameter("ErrorCode", ErrorCode)); + if (Result != null && Result.ToUpper() == "SUCCESS") + pars1.Add(new clsDbParameter("ErrorType", DBNull.Value)); + else if (ErrorCode == "0000-999999") + pars1.Add(new clsDbParameter("ErrorType", 2)); + else + pars1.Add(new clsDbParameter("ErrorType", 1)); + + CollectionSQL.Add("insert into tblERPTransactionLog(id,transactionid,moduleid,functionid,computername,curuserno,sendtime,result,keyvalue,createdate,logclass,errorcode,errortype) " + + "values('" + g + "',:TransactionID, :ModuleID, :FunctionID, :ComputerName, :CurUserNo, :SendTime, :Result, :KeyValue, :CreateDate, :LogClass, :ErrorCode, :ErrorType)"); + + // ----- Transaction XML Log 組參數----- + if (KeepXML != 0) + { + parameters.Add(pars2); + + if (strMessage.Count == 0) + { + pars2.Add(new clsDbParameter("Message", DBNull.Value)); + } + else + { + // mcode, mtype, mmsg + string str = string.Empty; + foreach (ArrayList al in strMessage) + { + // 2018/05/10 OwenLiu, 調整TransactionLog針對 ArrayList處理邏輯,以便與中台EAI共用 + if (!string.IsNullOrEmpty(str)) + str += Convert.ToString(ControlChars.Cr); + if (!string.IsNullOrEmpty(Convert.ToString(al[0]))) + { + str = str + "mcode: " + al[0] + ";".ToString(); + } + if (!string.IsNullOrEmpty(Convert.ToString(al[0]))) + { + str = str + "mtype: " + al[1] + ";".ToString(); + } + // str += "mmsg: " & al.Item(2) + if (!string.IsNullOrEmpty(Convert.ToString(al[0]))) + { + str = str + "mmsg: " + al[2] + ";".ToString(); + } + } + pars2.Add(new clsDbParameter("Message", str)); + } + + if (strException.Count == 0) + { + pars2.Add(new clsDbParameter("Exception", DBNull.Value)); + } + else + { + // code, sysmsg, mesmsg, stack + string str = string.Empty; + foreach (ArrayList al in strException) + { + // 2018/05/10 OwenLiu, 調整TransactionLog針對 ArrayList處理邏輯,以便與中台EAI共用 + if (!string.IsNullOrEmpty(str)) + str += Convert.ToString(ControlChars.Cr); + if (!string.IsNullOrEmpty(Convert.ToString(al[0]))) + { + str = str + "code: " + al[0] + ";".ToString(); + } + if (!string.IsNullOrEmpty(Convert.ToString(al[1]))) + { + str = str + "sysmsg: " + al[1] + ";".ToString(); + } + if (!string.IsNullOrEmpty(Convert.ToString(al[2]))) + { + str = str + "mesmsg: " + al[2].ToString().Replace("[%", "").Replace("%]", "") + ";"; + } + if (!string.IsNullOrEmpty(Convert.ToString(al[3]))) + { + str = str + "stack: " + al[3].ToString(); + } + } + pars2.Add(new clsDbParameter("Exception", str)); + } + + if (InXml == null) + pars2.Add(new clsDbParameter("InXml", DBNull.Value)); + else + pars2.Add(new clsDbParameter("InXml", InXml)); + if (OutXml == null) + pars2.Add(new clsDbParameter("OutXml", DBNull.Value)); + else + pars2.Add(new clsDbParameter("OutXml", OutXml)); + if (ExceptionFun == null) + pars2.Add(new clsDbParameter("ExceptionFun", DBNull.Value)); + else + pars2.Add(new clsDbParameter("ExceptionFun", ExceptionFun)); + + // -----執行Transaction XML Log----- + CollectionSQL.Add("insert into tblERPTransactionXMLLog(id,messagexml,exceptionxml,inxml,outxml,exceptionfun) values('" + g + + "',:Message, :Exception, :InXml, :OutXml, :ExceptionFun)"); + } + ExecuteSQLNoneQuery_UPD_Parameter(strDataBaseType, strConnectionString, CollectionSQL, parameters); + + r = true; + } + + catch (Exception ex) + { + r = false; + throw; + } + + return r; + } + + + #region-----------add by 14166 for 新增人员接口----------- + /// + /// (ref strMessage, ref strException, UserNo, UserName, UserLevel, Creator, CreateDate, Description, IssueState, ChangeDate, ResetPassword, UserType, UserDP, UserEmail); + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool funAddUser(ref List aryMessage, ref List aryException, string UserNo = defString, string UserName = defString, string UserLever = defString, string Creator = defString, string CreateDate = defString, string Description = defString, string IssueState = defString, string ChangeDate = defString, string ResetPassword = defString, string UserType = defString, string UserDP = defString, string UserEmail = defString, string Password = defString) + { + bool result = false; + DataRow dr; + int i, j; + string strSQLAddField, strSQLAddValue; + Collection MTLCollection = new Collection(); + Collection CollectionSQL = new Collection(); + + + string strSQL = ""; + + IDbConnection cnnTemp = null; + DbDataReader drTemp; + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + + bool blnAdd = false; ; + string PasswordDecoding = ""; + try + { + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + //默认用户密码123 + using (var objsys = new clsSYSFunction()) + { + PasswordDecoding = objsys.PasswordEncoding(Password); + } + + try + { + strSQL = " SELECT * FROM TBLUSRUSERBASIS WHERE USERNO='" + UserNo + "' "; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + throw new iMESException.MESException("0000-003000", "[%UserNo : " + UserNo + "人员已存在!%]"); + } + else + { + blnAdd = true; + } + drTemp.Close(); + + // ----- Exception => Fail ----- + if (aryException.Count > 0) + goto exitfun; + + // Add + if (blnAdd) + { + strSQLAddField = " INSERT INTO TBLUSRUSERBASIS (USERNO,USERNAME,USERLEVEL,PASSWORD,DEPARTMENTNO,EMAILADDRESS,DESCRIPTION,USERTYPE,ISSUESTATE,RESETPASSWORD,CREATOR,CREATEDATE,CHANGEDATE"; + strSQLAddValue = " Values ('" + UserNo + "','" + UserName + "','" + UserLever + "','" + PasswordDecoding + "','" + UserDP + "','" + UserEmail + "','" + Description + "','" + UserType + "','" + IssueState + "','" + ResetPassword + "','" + Creator + "',To_Date('" + Strings.Format(Conversions.ToDate(CreateDate), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),To_Date('" + Strings.Format(Conversions.ToDate(ChangeDate), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + + // 當沒有額外的欄位時,直接給定strSQL + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + CollectionSQL.Add(strSQL); + + } + else + { + // Edit + //strSQL = " UPDATE TBLUSRUSERBASIS set USERNAME='" + UserName + "',USERLEVEL='" + UserLever + "',DEPARTMENTNO='" + UserDP + "',EMAILADDRESS='" + UserEmail + "' WHERE USERNO='" + UserNo + "' "; + strSQL = " UPDATE TBLUSRUSERBASIS set USERNAME='" + UserName + "',USERLEVEL='" + UserLever + "' WHERE USERNO='" + UserNo + "' "; + CollectionSQL.Add(strSQL); + + } + // 呼叫執行SQL指令 + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + result = true; + + //clsERP.combineMessage(ref aryMessage, null, null, "[%AddUserSuccess%]"); + } + catch (Exception ex) + { + // trans.Rollback() + clsERP.combineException(ref aryException, null, ex.Message, "[%AddUserFail%]", CInput(ex.StackTrace)); + } + } + catch (Exception ex) + { + clsERP.combineException(ref aryException, null, ex.Message, "[%AddUserFail%]", CInput(ex.StackTrace)); + } + + exitfun: + ; + } + catch (Exception ex) + { + clsERP.combineException(ref aryException, null, ex.Message, "[%AddUserFail%]", CInput(ex.StackTrace)); + } + finally + { + CloseConnection(cnnTemp); + } + + + return result; + } + + + public static bool funDelUser(ref List aryMessage, ref List aryException, string UserNo = defString, string UserName = defString, string UserLever = defString, string Creator = defString, string CreateDate = defString, string Description = defString, string IssueState = defString, string ChangeDate = defString, string ResetPassword = defString, string UserType = defString, string UserDP = defString, string UserEmail = defString, string Password = defString) + { + bool result = false; + + Collection CollectionSQL = new Collection(); + + + string strSQL = ""; + + IDbConnection cnnTemp = null; + DbDataReader drTemp; + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + + + try + { + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + ////默认用户密码123 + //using (var objsys = new clsSYSFunction()) + //{ + // PasswordDecoding = objsys.PasswordEncoding(Password); + //} + + try + { + strSQL = " SELECT * FROM TBLUSRUSERBASIS WHERE USERNO='" + UserNo + "' "; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + throw new iMESException.MESException("0000-003000", "[%UserNo : " + UserNo + "人员不存在!%]"); + } + drTemp.Close(); + + // ----- Exception => Fail ----- + if (aryException.Count > 0) + goto exitfun; + + + strSQL = "DELETE FROM TBLUSRUSERBASIS WHERE USERNO='" + UserNo + "' "; + CollectionSQL.Add(strSQL); + + // 呼叫執行SQL指令 + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + result = true; + + } + catch (Exception ex) + { + // trans.Rollback() + clsERP.combineException(ref aryException, null, ex.Message, "[%DelUserFail%]", CInput(ex.StackTrace)); + } + } + catch (Exception ex) + { + clsERP.combineException(ref aryException, null, ex.Message, "[%DelUserFail%]", CInput(ex.StackTrace)); + } + + exitfun: + ; + } + catch (Exception ex) + { + clsERP.combineException(ref aryException, null, ex.Message, "[%DelUserFail%]", CInput(ex.StackTrace)); + } + finally + { + CloseConnection(cnnTemp); + } + + + return result; + } + + + #endregion + + + + #region 辅料调拨接口 + + public static bool funAddMaterial_WIP(string SubInventoryTransferNo, string Description, string Creator, int Status, DateTime CreateDate = default(DateTime), DataTable dtMTL = null, List aryMessage = null, List aryException = null, List aryAlert = null) + { + bool AddMaterial_WIPRet = default(bool); + + bool r = false; + string strSQL = default(string); + IDbConnection cnnTemp = null; + DbDataReader drTemp; + + AppSettings objSetting = new AppSettings(); + var CollectionSQL = new Collection(); + + try + { + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + try + { + if (dtMTL.Rows.Count > 0) + { + //status:0为发料,1为退料; + if (Status == 0) + { + foreach (DataRow row in dtMTL.Rows) + { + //若是同仓库编号、同物料编号、同物料批号,则数量进行叠加,若是其中一项不一样,则进行新增; + strSQL = " select * from TBLINVWIPINVENTORY_RAW where INVENTORYNO = '" + row["ToInventoryNo"] + "' and MATERIALNO = '" + row["MaterialNo"] + "' and MATERIALLOTNO = '" + row["MaterialLotNo"] + "' "; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + //叠加 + strSQL = " update TBLINVWIPINVENTORY_RAW set QTY = QTY + " + Convert.ToInt32(row["TransferQty"]) + " where INVENTORYNO = '" + row["ToInventoryNo"] + "' and MATERIALNO = '" + row["MaterialNo"] + "' and MATERIALLOTNO = '" + row["MaterialLotNo"] + "' "; + CollectionSQL.Add(strSQL); + } + else + { + //TBLMTLMATERIALBASIS + strSQL = " select * from TBLMTLMATERIALBASIS where MATERIALNO = '" + row["MaterialNo"] + "' "; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + //新增 + strSQL = " insert into TBLINVWIPINVENTORY_RAW(INVENTORYNO,MATERIALNO,MATERIALLOTNO,UNITNO,QTY,INPUTDATE,LOCATORNO,MATERIALTYPE) "; + strSQL += " values('" + row["ToInventoryNo"] + "','" + row["MaterialNo"] + "','" + row["MaterialLotNo"] + "','" + row["MaterialUnitNo"] + "'," + Convert.ToInt32(row["TransferQty"]) + ",To_Date('" + Strings.Format(CreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'N/A','" + drTemp["MATERIALTYPE"] + "') "; + CollectionSQL.Add(strSQL); + } + else + { + combineException(ref aryException, mesmsg: "[%物料基本资料无相关信息%]"); + } + + } + + //记录调拨以及取消调拨记录 + strSQL = " insert into TBLINVWIPINVENTORY_RAWLOG(subinventorytransferno,materialno,materiallotno,transferqty,materialunitno,frominventoryno,fromlocatorno,toinventoryno,tolocatorno,description,creator,createdate,Status) "; + strSQL += " values('" + SubInventoryTransferNo + "','" + row["MaterialNo"] + "','" + row["MaterialLotNo"] + "'," + Convert.ToInt32(row["TransferQty"]) + ",'" + row["MaterialUnitNo"] + "','" + row["FromInventoryNo"] + "','" + row["FromLocatorNo"] + "','" + row["ToInventoryNo"] + "','" + row["ToLocatorNo"] + "','" + Description + "','" + Creator + "',To_Date('" + Strings.Format(CreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + Status + ") "; + CollectionSQL.Add(strSQL); + } + } + else if (Status == 1) + { + foreach (DataRow row in dtMTL.Rows) + { + //取消调拨:则直接扣减数量即可,若是扣减数量 > 库存数,则直接回复失败:库存不足; + strSQL = " select * from TBLINVWIPINVENTORY_RAW where INVENTORYNO = '" + row["FromInventoryNo"] + "' and MATERIALNO = '" + row["MaterialNo"] + "' and MATERIALLOTNO = '" + row["MaterialLotNo"] + "' "; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (Convert.ToInt32(row["TransferQty"]) > Convert.ToInt32(drTemp["QTY"])) + { + combineException(ref aryException, mesmsg: "[%库存不足%]"); + } + else + { + //扣减 + strSQL = " update TBLINVWIPINVENTORY_RAW set QTY = QTY - " + Convert.ToInt32(row["TransferQty"]) + " where INVENTORYNO = '" + row["FromInventoryNo"] + "' and MATERIALNO = '" + row["MaterialNo"] + "' and MATERIALLOTNO = '" + row["MaterialLotNo"] + "' "; + CollectionSQL.Add(strSQL); + + //记录调拨以及取消调拨记录 + strSQL = " insert into TBLINVWIPINVENTORY_RAWLOG(subinventorytransferno,materialno,materiallotno,transferqty,materialunitno,frominventoryno,fromlocatorno,toinventoryno,tolocatorno,description,creator,createdate,Status) "; + strSQL += " values('" + SubInventoryTransferNo + "','" + row["MaterialNo"] + "','" + row["MaterialLotNo"] + "'," + Convert.ToInt32(row["TransferQty"]) + ",'" + row["MaterialUnitNo"] + "','" + row["FromInventoryNo"] + "','" + row["FromLocatorNo"] + "','" + row["ToInventoryNo"] + "','" + row["ToLocatorNo"] + "','" + Description + "','" + Creator + "',To_Date('" + Strings.Format(CreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + Status + ") "; + CollectionSQL.Add(strSQL); + + } + + } + + } + } + } + else + { + combineException(ref aryException, mesmsg: "[%无调拨信息%]"); + } + + if (aryException.Count > 0) + goto exitfun; + + ExecuteSQLNoneQuery_UPD(objSetting.GetDataBaseType(), objSetting.GetConnectionString(), CollectionSQL); + r = true; + combineMessage(ref aryMessage, mmsg: "[%AddMaterial_WIPSuccess%]"); + } + + catch (Exception ex) + { + combineException(ref aryException, sysmsg: ex.Message, mesmsg: "[%AddMaterial_WIPFail%]", stack: iMESCore.Base.iMESComXML.CInput(ex.StackTrace)); + + } + + exitfun: + ; + } + catch (Exception ex) + { + combineException(ref aryException, sysmsg: ex.Message, mesmsg: "[%AddMaterial_WIPFail%]", stack: iMESCore.Base.iMESComXML.CInput(ex.StackTrace)); + } + finally + { + CloseConnection(cnnTemp); + AddMaterial_WIPRet = r; + } + + return AddMaterial_WIPRet; + } + + #endregion + + #region MES箱号变更 + #endregion + + #region 湿敏接口 + #endregion + + #region MES退料 + #endregion + + #region "WMS发料回传前,先回传发料明细关联reel信息,datahub调用MES服务,推送发料明细数据至MES;" + public static bool funAddMaterial_WIP(string factory, DataTable dtReel) + { + bool funAddMaterial_WIP = default(bool); + bool r = false; + string strSQL = default(string); + IDbConnection cnnTemp = null; + DbDataReader drTemp; + + AppSettings objSetting = new AppSettings(); + var CollectionSQL = new Collection(); + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + DataRow[] dataRows = null; + try + { + + if (dtReel.Rows.Count == 0) + { + throw new Exception("无明细数据!"); + } + + //先取出dtReel所有的MATERIALNO字段,拼接成IN语句 + string strMaterialNo = ""; + for (int i = 0; i <= dtReel.Rows.Count - 1; i++) + { + if (strMaterialNo == "") + { + strMaterialNo = "'" + dtReel.Rows[i]["MCODE"] + "'"; + } + else + { + strMaterialNo = strMaterialNo + ",'" + dtReel.Rows[i]["MCODE"] + "'"; + } + } + + strSQL = "SELECT MATERIALNO,MATERIALTYPE,UNITNO FROM TBLMTLMATERIALBASIS WHERE MATERIALNO IN (" + strMaterialNo + ") AND ISSUESTATE = 2"; + DataTable dtMaterial = new DataTable("TBLMTLMATERIALBASIS"); + ExecuteSQLQuery_Adapter(strSQL, dtMaterial, cnnTemp); + if (dtMaterial.Rows.Count == 0) + { + throw new Exception("MES无物料信息!"); + } + + + for (int i = 0; i <= dtReel.Rows.Count - 1; i++) + { + + //物料单位 + string strUnitNo = ""; + + dataRows = dtMaterial.Select("MATERIALNO = '" + dtReel.Rows[i]["MCODE"] + "'"); + if (dataRows.Length > 0) + { + strUnitNo = dataRows[0]["UNITNO"].ToString(); + } + else + { + throw new Exception($"{dtReel.Rows[i]["MCODE"]}找不到对应的物料信息!"); + } + + //数量 + decimal QTY = 0; + if (dtReel.Rows[i]["QTY"].ToString() != "") + { + QTY = Convert.ToDecimal(dtReel.Rows[i]["QTY"]); + } + + //物料类别 MATERIALTYPE 来着dtMaterial + string strMaterialType = ""; + if (dataRows.Length > 0) + { + strMaterialType = dataRows[0]["MATERIALTYPE"].ToString(); + } + + //输入时间 INPUTDATE 来着于 dtReel的MTIME,时间格式,orcal + DateTime InputDate = DateTime.Now; + if (dtReel.Rows[i]["MTIME"].ToString() != "") + { + //InputDate = Convert.ToDateTime(dtReel.Rows[i]["MDATE"]); + InputDate = DateTime.ParseExact(dtReel.Rows[i]["MDATE"].ToString(), "yyyyMMdd", CultureInfo.InvariantCulture); + } + + ////制造日期 MANUFACTUREDATE 来着于 dtReel的VENDERDATE,时间格式 + DateTime ManufactureDate = ConvertYearWeekToMonday(dtReel.Rows[i]["VENDERDATE"].ToString()); + //if (dtReel.Rows[i]["VENDERDATE"].ToString() != "") + //{ + // ManufactureDate = Convert.ToDateTime(dtReel.Rows[i]["VENDERDATE"]); + //} + + + //超限日期 EXDATE + DateTime EXDATE = DateTime.Now; + if (dtReel.Rows[i]["EXDATE"].ToString() != "") + { + EXDATE = DateTime.ParseExact(dtReel.Rows[i]["EXDATE"].ToString(), "yyyyMMdd", CultureInfo.InvariantCulture); + } + string MONO = ""; + strSQL = $"SELECT * from TBLCUSMATERIALSUMDETAIL where MATERIALINNO = '{dtReel.Rows[i]["RECEIPTNO"].ToString()}'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + MONO = drTemp["MONO"].ToString(); + } + drTemp.Close(); + + ////插入 TBLINVWIPINVENTORY_RAW + //strSQL = @"INSERT INTO TBLINVWIPINVENTORY_RAW(INVENTORYNO, MATERIALNO, MATERIALLOTNO, UNITNO, QTY, MATERIALTYPE, INPUTDATE,MANUFACTUREDATE,RECEIPTNO,REELID,EXDATE,DATECODE,LOTCODE,VENDORCODE,VENDORITEMCODE,MANUFACTURER,SNSCALE) "; + //strSQL += " VALUES('" + dtReel.Rows[i]["STORAGECODE"].ToString() + "','" + dtReel.Rows[i]["MCODE"].ToString() + "','" + dtReel.Rows[i]["REELID"].ToString() + "', '" + strUnitNo + "'," + QTY + ",'" + strMaterialType + "','" + dtReel.Rows[i]["MTIME"].ToString() + + // "','"+ dtReel.Rows[i]["VENDERDATE"] + "','" + dtReel.Rows[i]["RECEIPTNO"].ToString() + "' ,'" + dtReel.Rows[i]["REELID"].ToString() + "',To_Date('" + Strings.Format(EXDATE, "yyyy/MM/dd HH:mm:ss") + $"','YYYY/MM/DD HH24:MI:SS'),'{dtReel.Rows[i]["DATECODE"].ToString()}','{dtReel.Rows[i]["VENDERLOTNO"].ToString()}','{dtReel.Rows[i]["VENDORCODE"].ToString()}','{dtReel.Rows[i]["VENDORITEMCODE"].ToString()}','{dtReel.Rows[i]["MANUFACTURER"].ToString()}','{dtReel.Rows[i]["SNSCALE"].ToString()}')"; + + //CollectionSQL.Add(strSQL); + + ////插入 TBLINVWIPINVENTORY_RAWLOG + //strSQL = @"INSERT INTO TBLINVWIPINVENTORY_RAWLOG(INVENTORYNO, MATERIALNO, MATERIALLOTNO, UNITNO, QTY, MATERIALTYPE, INPUTDATE,MANUFACTUREDATE,RECEIPTNO,REELID,EXDATE,EVENTTIME,DATECODE,LOTCODE,VENDORCODE,VENDORITEMCODE,MANUFACTURER,SNSCALE) "; + //strSQL += " VALUES('" + dtReel.Rows[i]["STORAGECODE"].ToString() + "','" + dtReel.Rows[i]["MCODE"].ToString() + "','" + dtReel.Rows[i]["REELID"].ToString() + "', '" + strUnitNo + "'," + QTY + ",'" + strMaterialType + "','"+ dtReel.Rows[i]["MTIME"].ToString() + + // "','"+ dtReel.Rows[i]["VENDERDATE"] + "','" + dtReel.Rows[i]["RECEIPTNO"].ToString() + "' ,'" + dtReel.Rows[i]["REELID"].ToString() + "',To_Date('" + Strings.Format(EXDATE, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + $"','YYYY/MM/DD HH24:MI:SS'),'{dtReel.Rows[i]["DATECODE"].ToString()}','{dtReel.Rows[i]["VENDERLOTNO"].ToString()}','{dtReel.Rows[i]["VENDORCODE"].ToString()}','{dtReel.Rows[i]["VENDORITEMCODE"].ToString()}','{dtReel.Rows[i]["MANUFACTURER"].ToString()}','{dtReel.Rows[i]["SNSCALE"].ToString()}')"; + + //CollectionSQL.Add(strSQL); + + //插入 TBLINVWIPINVENTORY_RAW + strSQL = @"INSERT INTO TBLINVWIPINVENTORY_RAW(INVENTORYNO, MATERIALNO, MATERIALLOTNO, UNITNO, QTY, MATERIALTYPE, INPUTDATE,MANUFACTUREDATE,RECEIPTNO,REELID,EXDATE,DATECODE,LOTCODE,VENDORCODE,VENDORITEMCODE,MANUFACTURER,SNSCALE,VENDERLOTNO,EXPIREDATE,MONO) "; + strSQL += " VALUES('" + dtReel.Rows[i]["STORAGECODE"].ToString() + "','" + dtReel.Rows[i]["MCODE"].ToString() + "','" + dtReel.Rows[i]["REELID"].ToString() + "', '" + strUnitNo + "'," + QTY + ",'" + strMaterialType + "',To_Date('" + Strings.Format(InputDate, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + + ",To_Date('" + Strings.Format(ManufactureDate, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'" + dtReel.Rows[i]["RECEIPTNO"].ToString() + "' ,'" + dtReel.Rows[i]["REELID"].ToString() + + "',To_Date('" + Strings.Format(EXDATE, "yyyy/MM/dd HH:mm:ss") + $"','YYYY/MM/DD HH24:MI:SS'),'{dtReel.Rows[i]["DATECODE"].ToString()}','{dtReel.Rows[i]["VENDERLOTNO"].ToString()}','{dtReel.Rows[i]["VENDORCODE"].ToString()}','{dtReel.Rows[i]["VENDORITEMCODE"].ToString()}','{dtReel.Rows[i]["MANUFACTURER"].ToString()}','{dtReel.Rows[i]["SNSCALE"].ToString()}','{dtReel.Rows[i]["VENDERLOTNO"].ToString()}',To_Date('" + Strings.Format(EXDATE, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'"+MONO+"')"; + + CollectionSQL.Add(strSQL); + + //插入 TBLINVWIPINVENTORY_RAWLOG + strSQL = @"INSERT INTO TBLINVWIPINVENTORY_RAWLOG(INVENTORYNO, MATERIALNO, MATERIALLOTNO, UNITNO, QTY, MATERIALTYPE, INPUTDATE,MANUFACTUREDATE,RECEIPTNO,REELID,EXDATE,EVENTTIME,DATECODE,LOTCODE,VENDORCODE,VENDORITEMCODE,MANUFACTURER,SNSCALE,VENDERLOTNO,EXPIREDATE,MONO) "; + strSQL += " VALUES('" + dtReel.Rows[i]["STORAGECODE"].ToString() + "','" + dtReel.Rows[i]["MCODE"].ToString() + "','" + dtReel.Rows[i]["REELID"].ToString() + "', '" + strUnitNo + "'," + QTY + ",'" + strMaterialType + "',To_Date('" + Strings.Format(InputDate, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + + ",To_Date('" + Strings.Format(ManufactureDate, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'" + dtReel.Rows[i]["RECEIPTNO"].ToString() + "' ,'" + dtReel.Rows[i]["REELID"].ToString() + + "',To_Date('" + Strings.Format(EXDATE, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + $"','YYYY/MM/DD HH24:MI:SS'),'{dtReel.Rows[i]["DATECODE"].ToString()}','{dtReel.Rows[i]["VENDERLOTNO"].ToString()}','{dtReel.Rows[i]["VENDORCODE"].ToString()}','{dtReel.Rows[i]["VENDORITEMCODE"].ToString()}','{dtReel.Rows[i]["MANUFACTURER"].ToString()}','{dtReel.Rows[i]["SNSCALE"].ToString()}','{dtReel.Rows[i]["VENDERLOTNO"].ToString()}',To_Date('" + Strings.Format(EXDATE, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'"+MONO+"')"; + + CollectionSQL.Add(strSQL); + + + + } + + if (CollectionSQL.Count > 0) + { + ExecuteSQLNoneQuery_UPD(objSetting.GetDataBaseType(), objSetting.GetConnectionString(), CollectionSQL); + } + + + + exitfun: + ; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } + finally + { + CloseConnection(cnnTemp); + } + return funAddMaterial_WIP; + + } + + public static DateTime ConvertYearWeekToMonday(string yearWeek) + { + if (string.IsNullOrEmpty(yearWeek) || yearWeek.Length != 4) + throw new ArgumentException("输入格式必须为4位数字,前2位为年份,后2位为周数"); + + int year = int.Parse(yearWeek.Substring(0, 2)) + 2000; // 26 -> 2026 + int week = int.Parse(yearWeek.Substring(2, 2)); // 21 -> 21 + + return GetMondayOfWeek(year, week); + } + + /// + /// 获取指定年份第几周的周一日期 + /// + public static DateTime GetMondayOfWeek(int year, int week) + { + // 1. 计算该年1月1日 + DateTime jan1 = new DateTime(year, 1, 1); + + // 2. 计算1月1日所在周的周一 + int daysOffset = ((int)jan1.DayOfWeek + 6) % 7; // 周一=0, 周日=6 + DateTime firstMonday = jan1.AddDays(-daysOffset); + + // 3. 计算目标周周一(第1周从第一个周一开始) + DateTime targetMonday = firstMonday.AddDays((week - 1) * 7); + + return targetMonday; + } + #endregion + + + #region "SPC 接收数据" + + //计量 + public static bool funGetJLSPCData(ref List aryMessage, ref List aryException, string SPCSerial_QMS, string MaterialNo, string MTLVendor, string Employee, string LotNo, string OPNo, string QCItemNo, string DC, string PartNo, List listTestValue) + { + bool funGetJLSPCData = default(bool); + //bool r = false; + //string strSQL = default(string); + //IDbConnection cnnTemp = null; + //DbDataReader drTemp; + + AppSettings objSetting = new AppSettings(); + + + //string strDataBaseType = objSetting.GetDataBaseType(); + //string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + //cnnTemp = CreateConnection(strConnectionString); + + DataSet dsData = new DataSet(); + + + + DataRow addrow; + DataRow addrow2; + string strReturn = ""; + + int intSerial; + + try + { + if (dsData.Tables.Contains("SPCData")) + { + dsData.Tables.Remove("SPCData"); + } + + dsData.Tables.Add("SPCData"); + dsData.Tables["SPCData"].Columns.Add("Execute", System.Type.GetType("System.String")); + dsData.Tables["SPCData"].Columns.Add("Result", System.Type.GetType("System.String")); + dsData.Tables["SPCData"].Columns.Add("LotNo", System.Type.GetType("System.String")); + dsData.Tables["SPCData"].Columns.Add("QCItemNo", System.Type.GetType("System.String")); + dsData.Tables["SPCData"].Columns.Add("Employee", System.Type.GetType("System.String")); + dsData.Tables["SPCData"].Columns.Add("OP", System.Type.GetType("System.String")); + dsData.Tables["SPCData"].Columns.Add("OpNo", System.Type.GetType("System.String")); + dsData.Tables["SPCData"].Columns.Add("ComponentNo", System.Type.GetType("System.String")); + dsData.Tables["SPCData"].Columns.Add("LotSerial", System.Type.GetType("System.String")); + dsData.Tables["SPCData"].Columns.Add("intResult", System.Type.GetType("System.String")); + + + dsData.Tables["SPCData"].Columns.Add("SPCSerial_QMS", System.Type.GetType("System.String")); + dsData.Tables["SPCData"].Columns.Add("Material", System.Type.GetType("System.String")); + dsData.Tables["SPCData"].Columns.Add("MTLVendor", System.Type.GetType("System.String")); + dsData.Tables["SPCData"].Columns.Add("DC", System.Type.GetType("System.String")); + dsData.Tables["SPCData"].Columns.Add("PartNo", System.Type.GetType("System.String")); + + + + + if (dsData.Tables.Contains("TestValue")) + { + dsData.Tables.Clear(); + } + else + { + dsData.Tables.Add("TestValue"); + dsData.Tables["TestValue"].Columns.Add("LotNo", System.Type.GetType("System.String")); + dsData.Tables["TestValue"].Columns.Add("QCItemNo", System.Type.GetType("System.String")); + dsData.Tables["TestValue"].Columns.Add("SerialNo", System.Type.GetType("System.Int32")); + dsData.Tables["TestValue"].Columns.Add("TestValue", System.Type.GetType("System.Double")); + dsData.Tables["TestValue"].Columns.Add("MEMO", System.Type.GetType("System.String")); + dsData.Tables["TestValue"].Columns.Add("ComponentNo", System.Type.GetType("System.String")); + dsData.Tables["TestValue"].Columns.Add("LotSerial", System.Type.GetType("System.String")); + } + + addrow = dsData.Tables["SPCData"].NewRow(); + addrow["Execute"] = "True"; + addrow["LotNo"] = LotNo; + addrow["QCItemNo"] = QCItemNo; + addrow["Employee"] = Employee; + addrow["OP"] = OPNo; + addrow["OpNo"] = OPNo; + addrow["LotSerial"] = 0; + //addrow["PartNo"] = PartNo; + addrow["SPCSerial_QMS"] = SPCSerial_QMS; + addrow["Material"] = MaterialNo; + addrow["MTLVendor"] = MTLVendor; + addrow["DC"] = DC; + addrow["PartNo"] = PartNo; + dsData.Tables["SPCData"].Rows.Add(addrow); + + intSerial = 0; + foreach (decimal TestValue in listTestValue) + { + + + intSerial += 1; + addrow2 = dsData.Tables["TestValue"].NewRow(); + addrow2["LotNo"] = LotNo; + addrow2["QCItemNo"] = QCItemNo; + addrow2["SerialNo"] = intSerial; + addrow2["TestValue"] = TestValue; + addrow2["LotSerial"] = 0; + addrow2["ComponentNo"] = ""; + + dsData.Tables["TestValue"].Rows.Add(addrow2); + + + } + + string LotSerialTmp = string.Empty; + string LogGroupSerialTmp = string.Empty; + string LotStampTmp = string.Empty; + string ProductNoTmp = string.Empty; + string CustomerNoTmp = "N/A"; + + var drDataTmp = dsData.Tables["SPCData"].Rows[0]; + var dvValue = default(DataView); + dvValue = dsData.Tables["TestValue"].DefaultView; + + bool blnChkOnly = false; + bool blnAttachChart = true; + + //tcSPC_IC.clsSPC objtc_SPC = new tcSPC_IC.clsSPC(); + //objtc_SPC.funAutoBRSPCContorl_Var(ref LotSerialTmp, ref LogGroupSerialTmp, ref LotStampTmp, ref ProductNoTmp, ref CustomerNoTmp, ref drDataTmp, dvValue, blnChkOnly: blnChkOnly, blnAttachChart: blnAttachChart); + strReturn = funAutoBRSPCContorl_Var_M(ref LotSerialTmp, ref LogGroupSerialTmp, ref LotStampTmp, ref ProductNoTmp, ref CustomerNoTmp, ref drDataTmp, dvValue, blnChkOnly: blnChkOnly, blnAttachChart: blnAttachChart); + + if (!strReturn.ToLower().Contains("success")) + { + throw new Exception(strReturn); + } + + + + + + exitfun: + ; + } + catch (Exception ex) + { + // 一行调用,拿到完整异常字符串 + string errorMsg = GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + dsData?.Dispose(); + //CloseConnection(cnnTemp); + } + return funGetJLSPCData; + + } + + //计数 计数不需要开立异常单或者任何法则检查,只需要做数据收集(多计数品管项目) + public static bool funGetJSSPCData(ref List aryMessage, ref List aryException, string SPCSerial_QMS, string MaterialNo, string MTLVendor, string Employee, string LotNo, string ProDuct, string EquipMent, string DC, List listQCItemDetail) + { + bool funGetJSSPCData = default(bool); + //bool r = false; + //string strSQL = default(string); + IDbConnection cnnTemp = null; + //DbDataReader drTemp; + + AppSettings objSetting = new AppSettings(); + + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + string SpcSerial = string.Empty; + Collection CollectionSQL = new Collection(); + Collection CollectionSQL_Rows = new Collection(); + DateTime nowTime = DateTime.Now; + var oSQLContent = new Dictionary(); + uint intSQLIndex = 1U; + kcSPC.clsSPC objSPC = new kcSPC.clsSPC(); + + try + { + + foreach (var item in listQCItemDetail) + { + //这里的回写序号,防止多人操作时序号被占用,导致数据录不进,且序号不要求连续 + SpcSerial = objSPC.InitSPCSerial(ref cnnTemp); + + if (string.IsNullOrEmpty(SpcSerial)) + { + throw new Exception("[%SpcSerial生成失败%]"); + } + + //参考兆驰 + + //计量计数项目基础资料 + funCreateSPCATTBASIS(ref aryMessage, ref aryException, ref CollectionSQL, + SpcSerial, item.QCITEMNO, LotNo, item.SAMPLEQTY.ToString(), item.GOODQTY.ToString(), item.DefectQty.ToString(), + "0", item.RESULT, SPCSerial_QMS, MaterialNo, MTLVendor, + Employee, ProDuct, EquipMent, DC, nowTime.ToString("yyyy/MM/dd H:mm:ss")); + + //TBLSPCATTDETAILLOG 计数线上检验明细资料历史纪录 + //不良原因填QMS,顾问固定的 + funCreateSPCATTDETAIL(ref aryMessage, ref aryException, ref CollectionSQL, + SpcSerial, item.QCITEMNO, "QMS", item.DefectQty.ToString(), nowTime.ToString("yyyy/MM/dd H:mm:ss")); + + //TBLSPCATTDETAILLOGSECTION 计数线上检验区域明细资料历史纪录档 + //funCreateSPCATTSECTION(ref aryMessage, ref aryException, ref CollectionSQL, + // SpcSerial,"", "QMS","2", item.DefectQty.ToString()); + + } + + + + //执行数据库 + if (CollectionSQL.Count > 0) + { + for (int k = 1, loopTo10 = CollectionSQL.Count; k <= loopTo10; k++) + CollectionSQL_Rows.Add(-1); + funAddSQLContent(oSQLContent, ref intSQLIndex, CollectionSQL, CollectionSQL_Rows); + ExecuteSQLNoneQuery_ArrayBinding(strDataBaseType, strConnectionString, oSQLContent); + } + + + + + + exitfun: + ; + } + catch (Exception ex) + { + // 一行调用,拿到完整异常字符串 + string errorMsg = GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + if (objSPC != null) + { + objSPC.Dispose(); + } + + CloseConnection(cnnTemp); + } + return funGetJSSPCData; + + } + + + // 2020/11/25 Grace 增加傳入前端畫面輸入的要因, 若有傳, 直接使用 + public static string funAutoBRSPCContorl_Var_M(ref string LotSerial, ref string LogGroupSerial, ref string LotStamp, ref string ProductNo, ref string CustomerNo, + ref DataRow drData, DataView dvValue = null, + string MClassNo = defString, bool blnChkOnly = true, bool blnAttachChart = false, + Collection CollectionSQL = null, + DataTable dtQCItemFactorAll = null, string UserNo = defString, string ShiftNo = defString, bool BrControl = false, bool EAPControl = false, bool blnReleaseLog = true, bool blnHoldLot = true) + { + string funAutoBRSPCContorl_VarRet = default(string); + + // 此 Function 將自動判別檢測數據_計量 + // 傳入值: drData (一次傳入一組檢驗資料,內有LotNo,OpNo,QCItemNo,PratNo,Employee)TestValue 等 + // 傳回值funAutoBRSPCContorl_Var: success(成功), QCItemNo(找不到品管項目編號), LotNo(找不到批號)... + // 傳回值: drData(檢測結果) + + IDbConnection cnnTemp = null; + // 'Dim cmmTemp As OleDb.OleDbCommand + DbDataReader drTemp = null; + string strSQL; + + var kcQC = new kcQC.clsQCBasis(); + var kcWIP = new kcWIP.clsLot(); + var kcSPC = new kcSPC.clsSPC(); + var udSPC = new udSPC.clsSPC(); + var udWIP = new udWIP.clsWIP(); + + // Table + DataSet dsTemp; + var dtQCItemBasis = default(DataTable); + var dtQCItemFactor = default(DataTable); + DataTable dtLotData; + var dtWIPFactor = default(DataTable); + DataTable dtQCItem; // 主要是儲存Check後的結果 + DataRow drAdd; + DataRow[] drSel; + + // 傳入的資料 + var LotNo = default(string); + var OpNo = default(string); + var QCItemNo = default(string); + var QCItemName = default(string); + var Employee = default(string); + + int i, j; + var ERFAction = default(string); + var ERFMsg = default(string); + var strSPCSerial = new string[2]; + + + int intResult; + int intERFSource; + string LinkName; + // Dim LotSerial As String + // Dim LogGroupSerial As String + string ExecuteSPCSerial; + string PopulationQty = ""; + // Dim ProductNo As String + // Dim CustomerNo As String = "N/A" '開異常單時 customerNo不能 Null + // Dim LotStamp As String + bool MailNotice = false; + string[] aryAdditionalSQL; + + string[] aryUpdateSQLReplace; // Added by Neil 2008/05/19 + bool blnCheckOK = true; // Added by Neil 2008/05/19 作為各項檢查的指標,任何一項檢查不過則為False + var strCheckNotOKMessage = default(string); // Added by Neil 2008/05/19 + DataSet dsChartData = null; // Added by Neil 2008/05/20 存放管制圖資料 + + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + + + tcSPC_IC.clsSPC objtc_SPC = new tcSPC_IC.clsSPC(); + + try + { + + funAutoBRSPCContorl_VarRet = "error"; // Initial + + // ===== 整理傳入的資料 ========= + if (drData.Table.Columns.Contains("LotNo")) + { + LotNo = drData["LotNo"] + "".ToString(); + } + if (drData.Table.Columns.Contains("QCItemNo")) + { + QCItemNo = (drData["QCItemNo"] + "").ToString().ToUpper(); // 請注意一定要轉大寫 + } + if (drData.Table.Columns.Contains("OpNo")) + { + OpNo = drData["OpNo"] + "".ToString(); + } + if (drData.Table.Columns.Contains("Employee")) + { + Employee = drData["Employee"] + "".ToString(); + } + + DataTable dtTestValue; + + if (dvValue != null) + { + dtTestValue = dvValue.Table.Clone(); + var loopTo = dvValue.Count - 1; + for (i = 0; i <= loopTo; i++) + dtTestValue.ImportRow(dvValue[i].Row); + } + else + { + dtTestValue = new DataTable("TestValue"); + dtTestValue.Columns.Add("QCItemNo", Type.GetType("System.String")); + dtTestValue.Columns.Add("SerialNo", Type.GetType("System.Int32")); + dtTestValue.Columns.Add("TestValue", Type.GetType("System.Double")); + dtTestValue.Columns.Add("MEMO", Type.GetType("System.String")); + dtTestValue.Columns.Add("ComponentNo", Type.GetType("System.String")); + + for (j = 0; j <= 19; j++) + { + if (drData.Table.Columns.Contains("S" + Strings.Format(j + 1, "00")) && !(drData["S" + Strings.Format(j + 1, "00")] is DBNull) && !string.IsNullOrEmpty(drData["S" + Strings.Format(j + 1, "00")].ToString())) + { + drAdd = dtTestValue.NewRow(); + drAdd["QCItemNo"] = QCItemNo; + drAdd["SerialNo"] = j + 1; + drAdd["TestValue"] = drData["S" + Strings.Format(j + 1, "00")]; + dtTestValue.Rows.Add(drAdd); + } + else + { + break; + } + } + + } + + if (dtTestValue.Rows.Count == 0) + { + strCheckNotOKMessage = "No Data"; + // Exit Function + blnCheckOK = false; // Added by Neil 2008/05/19 + } + + // ===== 檢查資料是否正確 ========= + // 1.取出品管項目 + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + + dtQCItemBasis = kcQC.ShowQCItemForVariables(QCItemNo, IssueState: 2).Tables[0]; + + if (dtQCItemBasis == null || dtQCItemBasis.Rows.Count == 0) + { + strCheckNotOKMessage = "QCItemNo Error"; + // Exit Function + blnCheckOK = false; // Added by Neil 2008/05/19 + } + + } + + + // 2 取出Lot資料 + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + + dtLotData = kcWIP.ShowLotBasisJoinState(LotNo).Tables[0]; + if (dtLotData == null || dtLotData.Rows.Count == 0) + { + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtQCItemBasis.Rows[0]["LotIsValid"], 1, false))) // 必須檢查批號有效,但找不到批號資料 + { + strCheckNotOKMessage = "LotData Error"; + // Exit Function + blnCheckOK = false; // Added by Neil 2008/05/19 + } + } + else + { + PopulationQty = dtLotData.Rows[0]["CurQty"].ToString(); + LotSerial = dtLotData.Rows[0]["LotSerial"] + "".ToString(); + LogGroupSerial = dtLotData.Rows[0]["LogGroupSerial"] + "".ToString(); + LotStamp = dtLotData.Rows[0]["LotStamp"] + "".ToString(); + ProductNo = dtLotData.Rows[0]["ProductNo"] + "".ToString(); + CustomerNo = dtLotData.Rows[0]["CustomerNo"] + "".ToString(); + OpNo = dtLotData.Rows[0]["OpNo"] + "".ToString(); + } + + } + + + // ===== 整理要因資料 ========= + // 3.1 取出 QCItemFactor + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + if (!(dtQCItemFactorAll == null)) + { + dtQCItemFactor = dtQCItemFactorAll; + } + else + { + dtQCItemFactor = kcQC.ShowQCItemFactor(QCItemNo).Tables[0]; + } + + dtQCItemFactor = kcQC.ShowQCItemFactor(QCItemNo).Tables[0]; + if (dtQCItemFactor == null || dtQCItemFactor.Rows.Count == 0) + { + strCheckNotOKMessage = "QCItemFactor Error"; + // Exit Function + blnCheckOK = false; // Added by Neil 2008/05/19 + } + + } + + + // 3.2 取得檢驗批的要因資料 + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + dtWIPFactor = udSPC.LoadLotFactorValue(LotNo).Tables[0]; + foreach (DataColumn dcFactor in drData.Table.Columns) + { + if (dcFactor.ColumnName.ToUpper() == "OPNO") + { + drSel = dtWIPFactor.Select("ParameterNo = 'OP'"); + + //0144256: [607]SC107匯入報錯 19120 + if (drSel != null && drSel.Length > 0) + { + drSel[0]["Value"] = drData[dcFactor]; + } + + } + + drSel = dtWIPFactor.Select("ParameterNo = '" + dcFactor.ColumnName + "'"); + if (drSel.Length > 0) + { + drSel[0]["Value"] = drData[dcFactor]; + } + } + } + + + // 3.3.將取得的要因值填入品管項目要因,取不到值的則填入N/A + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + dtQCItemFactor.Columns.Add("FactorValue", Type.GetType("System.String")); + var loopTo1 = dtQCItemFactor.Rows.Count - 1; + for (i = 0; i <= loopTo1; i++) + { + drSel = dtWIPFactor.Select("ParameterNo = '" + dtQCItemFactor.Rows[i]["FactorNo"] + "'".ToString()); + if (drSel.Length > 0) + { + dtQCItemFactor.Rows[i]["FactorValue"] = drSel[0]["Value"]; + } + else if (drData.Table.Columns.Contains(Convert.ToString(dtQCItemFactor.Rows[i]["FactorNo"])) && !(drData[dtQCItemFactor.Rows[i]["FactorNo"].ToString()] is DBNull) && Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drData[dtQCItemFactor.Rows[i]["FactorNo"].ToString()], "", false))) + { + dtQCItemFactor.Rows[i]["FactorValue"] = drData[dtQCItemFactor.Rows[i]["FactorNo"].ToString()]; // 從傳入的drData 中取得要因 + } + else + { + dtQCItemFactor.Rows[i]["FactorValue"] = "N/A"; + } + } + + //0190824: 【澳洋】SPC接口 Edison 251023 補上SC101取得自定義要因值的做法 + var dtTempSPCFactorData = new DataTable(); + var dtValueList = new DataTable("ConditionValueList"); + dtValueList.Columns.Add("InspLotNo", typeof(string)); + var drValueList = dtValueList.NewRow(); + drValueList["InspLotNo"] = LotNo; + dtValueList.Rows.Add(drValueList); + foreach (DataRow drw in dtQCItemFactor.Rows) + { + dtValueList.Columns.Add(Convert.ToString(drw["FactorNo"]), typeof(string)); + dtValueList.Rows[0][drw["FactorNo"].ToString()] = drw["FactorValue"].ToString(); + } + + using (var objSys = new kcSYS.clsSYSMesParameter()) + { + // 以SQLCMDMap方式取要因值 + IDbConnection argcnnTemp = null; + objSys.LoadMesParameterValueBySQLCMD(ref dtValueList, cnnTemp: argcnnTemp); + } + + if (dtValueList.Rows.Count > 0) + { + foreach (DataRow drw in dtQCItemFactor.Rows) + { + // 填入要因預設值 + drw["FactorValue"] = dtValueList.Rows[0][drw["FactorNo"].ToString()].ToString().Trim(); + + if (dtQCItemFactorAll == null) + continue; + var drSel2 = dtQCItemFactorAll.Select("ParameterNo = '" + drw["FactorNo"].ToString() + "'"); + // 填入要因預設值 + if (drSel2.Length > 0) + { + foreach (DataRow dr in drSel2) + { + dr["FactorValue"] = dtValueList.Rows[0][drw["FactorNo"].ToString()].ToString().Trim(); + } + } + + } + } + + // 取得暫存要因資料 + strSQL = " Select * From tblWIPTemp_SPCFactorData Where LotNo = '" + LotNo + "' And OPNO = '" + OpNo + "' And LotSerial = '" + LotSerial + "'"; + + dtTempSPCFactorData = new DataTable("WIPTemp_SPCFactorData"); + using (IDbConnection cnnQ = CreateConnection(strConnectionString)) + { + ExecuteSQLQuery_Adapter(SQLCommandTuning(strDataBaseType, ref strSQL), dtTempSPCFactorData, connection: cnnQ); + + if (dtTempSPCFactorData.Rows.Count > 0) + { + foreach (DataRow drw in dtQCItemFactor.Rows) + { + var drtTempSPCFactorData = dtTempSPCFactorData.Select( + "FactorNo = '" + drw["FactorNo"].ToString() + + "' And QCItemNo ='" + drw["QCItemNo"].ToString() + "'"); + + // 填入要因預設值 + if (drtTempSPCFactorData.Length > 0) + { + drw["FactorValue"] = drtTempSPCFactorData[0]["FactorValue"]; + + if (dtQCItemFactorAll == null) + continue; + + var drQCItemFactorAll = dtQCItemFactorAll.Select( + "ParameterNo = '" + drw["FactorNo"].ToString() + + "' And QCItemNo ='" + drw["QCItemNo"].ToString() + "'"); + + // 填入要因預設值 + if (drQCItemFactorAll.Length > 0) + { + foreach (DataRow dr in drQCItemFactorAll) + { + dr["FactorValue"] = drtTempSPCFactorData[0]["FactorValue"]; + } + } + } + } + } + } + } + + // ===== 檢查此筆檢測資料是否已經存過 ========= + var LatestLotsMappingCreateDateTmp = defDateTime; + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + if (blnChkOnly == true) + { + if (kcSPC.ShowVarFactorLog(ref LatestLotsMappingCreateDateTmp, QCItemNo, LotNo).Tables["SPCVarFactorLog"].Rows.Count > 0) + { + strCheckNotOKMessage = "Already Exist"; + // Exit Function + blnCheckOK = false; // Added by Neil 2008/05/19 + } + } + } + + // ===== Check 規格與管制法則 ========= + var FactorSerial = default(string); + string strChkTemp; + + var dtViolation = new DataTable("Violation"); // 執行 funChkQCChartValue 後回傳結果 + + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + + dtViolation.Columns.Add("QCItemNo", Type.GetType("System.String")); + dtViolation.Columns.Add("SPCSerial", Type.GetType("System.String")); + dtViolation.Columns.Add("ComponentNo", Type.GetType("System.String")); + dtViolation.Columns.Add("SPCID", Type.GetType("System.String")); + dtViolation.Columns.Add("SerialNo", Type.GetType("System.String")); // Raw ID , 非Raw=-1 + dtViolation.Columns.Add("ViolationID", Type.GetType("System.String")); // 違反類型:WE001, WE002, ..,WE008 + + if (blnAttachChart == true) // 若blnAttachChart = True 則建立dsXlsChartData基本架構,待經過funChkQCChartValue後取得資料,後續畫管制圖用 + { + + dsChartData = new DataSet(); + DataRow tmprow; + + dsChartData.Tables.Add("ChartInfo"); + dsChartData.Tables["ChartInfo"].Columns.Add("SpecLineType"); + dsChartData.Tables["ChartInfo"].Columns.Add("SampleSize"); + dsChartData.Tables["ChartInfo"].Columns.Add("TUCL"); + dsChartData.Tables["ChartInfo"].Columns.Add("TLCL"); + dsChartData.Tables["ChartInfo"].Columns.Add("TCL"); + dsChartData.Tables["ChartInfo"].Columns.Add("TUS"); + dsChartData.Tables["ChartInfo"].Columns.Add("TLS"); + dsChartData.Tables["ChartInfo"].Columns.Add("XUCL"); + dsChartData.Tables["ChartInfo"].Columns.Add("XLCL"); + dsChartData.Tables["ChartInfo"].Columns.Add("XCL"); + dsChartData.Tables["ChartInfo"].Columns.Add("XUS"); + dsChartData.Tables["ChartInfo"].Columns.Add("XLS"); + dsChartData.Tables["ChartInfo"].Columns.Add("GUCL"); + dsChartData.Tables["ChartInfo"].Columns.Add("GLCL"); + dsChartData.Tables["ChartInfo"].Columns.Add("GCL"); + dsChartData.Tables["ChartInfo"].Columns.Add("GUS"); + dsChartData.Tables["ChartInfo"].Columns.Add("GLS"); + dsChartData.Tables["ChartInfo"].Rows.Add(dsChartData.Tables["ChartInfo"].NewRow()); + + // dsChartData.Tables.Add("TrendData") + // dsChartData.Tables.Add("XbarData") + // dsChartData.Tables.Add("GraphData") + + } + + string argEnterpriseNo = ""; + strChkTemp = kcSPC.funChkQCChartValue(LotNo, QCItemNo, Employee, + dtQCItemFactor, dtTestValue, ref FactorSerial, ref dtViolation, + ref ERFAction, ref ERFMsg, dsChartData, + EnterpriseNo: argEnterpriseNo); + if (Convert.ToBoolean(Strings.InStr(strChkTemp, "fail"))) // 無管制圖或檢查過程錯誤 + { + strCheckNotOKMessage = "ChkQCChartValue" + strChkTemp; + // Exit Function + blnCheckOK = false; // Added by Neil 2008/05/19 + } + } + + + // 若純檢查,只要做到這裡為止 'Added by Yun 2007/11/2 + if (blnChkOnly == true) + { + funAutoBRSPCContorl_VarRet = strCheckNotOKMessage; // last modify by Neil 2008/06/03 + return funAutoBRSPCContorl_VarRet; + } + + // Added by Neil 2008/05/19 + if (blnCheckOK == false) + { + drData["Execute"] = strCheckNotOKMessage; // Add Yun 2017/11/28 將Check 結果傳出 + + // 檢查沒過回寫狀態 + if (drData.Table.Columns.Contains("UpdateSQL") && !(drData["UpdateSQL"] is DBNull)) + { + if (drData.Table.Columns.Contains("UpdateSQLReplace") && !(drData["UpdateSQLReplace"] is DBNull)) + { + var CollectSQL = new Collection(); + // drData("Execute") = strCheckNotOKMessage 'Marked Yun 2017/11/28 移到上面 + objtc_SPC.CollectUpdateSQL(ref drData, ref CollectSQL); + if (CollectSQL.Count != 0) + { + kcSPC.ExecuteSQL(CollectSQL); + } + } + } + + funAutoBRSPCContorl_VarRet = strCheckNotOKMessage; + return funAutoBRSPCContorl_VarRet; + + } + + + // 備用 + DataTable dtComponent; + dtComponent = new DataTable("Component"); + dtComponent.Columns.Add("SPCSerial", Type.GetType("System.String")); + dtComponent.Columns.Add("QCItemNo", Type.GetType("System.String")); + dtComponent.Columns.Add("ComponentNo", Type.GetType("System.String")); + dtComponent.Columns.Add("CompResult", Type.GetType("System.String")); + + + // ===== 整理生產批(各品管項目綜合)結果,並存入資料庫 ========= + if (Strings.InStr(ERFAction, "Hold") > 0) + { + LinkName = "Hold"; + intResult = 1; + } + else if (Strings.InStr(ERFAction, "Alarm") > 0) + { + LinkName = "Alarm"; + intResult = 4; + } + else if (Strings.InStr(ERFAction, "Alert") > 0) + { + LinkName = "Alert"; + intResult = 4; + } + else if (Strings.InStr(ERFAction, "Wait") > 0) + { + LinkName = "Wait"; + intResult = 2; + } + else if (Strings.InStr(ERFAction, "Warning") > 0) + { + LinkName = "Warning"; + intResult = 3; + } + else + { + LinkName = "Pass"; + intResult = 0; + } + drData["Result"] = LinkName; // 回傳出去給人看的所以用字串 + drData["intResult"] = intResult; + + // Add QCItem Test Value + dtQCItem = new DataTable("QCItem"); + dtQCItem.Columns.Add("QCItemNo", Type.GetType("System.String")); + dtQCItem.Columns.Add("FactorSerial", Type.GetType("System.String")); + dtQCItem.Columns.Add("RetestLotNo", Type.GetType("System.String")); + dtQCItem.Columns.Add("ERFMsg", Type.GetType("System.String")); + dtQCItem.Columns.Add("Result", Type.GetType("System.String")); // 紀錄結果 0,1,2,.... + dtQCItem.Columns.Add("SPCSerial", Type.GetType("System.String")); // 在UpdVar_TestValue中會將SPCSerial 填入 + + drAdd = dtQCItem.NewRow(); + drAdd["QCItemNo"] = QCItemNo; + drAdd["FactorSerial"] = FactorSerial; + drAdd["RetestLotNo"] = ""; + drAdd["ERFMsg"] = ERFMsg; + drAdd["Result"] = intResult.ToString(); + dtQCItem.Rows.Add(drAdd); + + //EAP过站组件信息 + if (EAPControl) + { + DataView dataView = dtTestValue.DefaultView; + DataTable QcItemNoDistinct = dataView.ToTable(true, "ComponentNo", "QCItemNo"); + DataRow[] drSelCom; + // 將資料存入暫存Table + for (int q = 0; q < QcItemNoDistinct.Rows.Count; q++) + { + var drcomData = dtComponent.NewRow(); + drcomData["QCItemNo"] = QCItemNo; + if (QcItemNoDistinct.Rows[q]["QCItemNo"].ToString() == QCItemNo) + { + drcomData["ComponentNo"] = QcItemNoDistinct.Rows[q]["ComponentNo"].ToString(); + } + + if (dtViolation.Rows.Count > 0) + { + drSelCom = dtViolation.Select("ComponentNo='" + QcItemNoDistinct.Rows[q]["ComponentNo"].ToString() + "'"); + if (drSelCom.Length > 0) + { + drcomData["CompResult"] = "1"; + } + else + { + drcomData["CompResult"] = "0"; + } + } + else + { + drcomData["CompResult"] = "0"; + } + dtComponent.Rows.Add(drcomData); + } + + } + + var colSQL = new Collection(); + string strGSPCSerialTmp = defString; + kcSPC.UpdVar_TestValue(ref strGSPCSerialTmp, dtQCItemFactor, dtQCItem, dtTestValue, LotNo, LotSerial, Employee, dtComponent: dtComponent, colSQL: colSQL, LogGroupSerial: LogGroupSerial, OPNo: OpNo); + + // 取得 SPCSerial + strSPCSerial[0] = dtQCItem.Rows[0]["SPCSerial"].ToString(); + if (drData.Table.Columns.Contains("SPCSerial")) + { + drData["SPCSerial"] = dtQCItem.Rows[0]["SPCSerial"]; + } + + // 2020/01/20 ,Yenru Add ERFMSG + if (drData.Table.Columns.Contains("ERFMsg")) + { + drData["ERFMsg"] = dtQCItem.Rows[0]["ERFMsg"]; + } + //回写法则编号 + string ruleno = ""; + if (drData.Table.Columns.Contains("RuleNo")) + { + if (dtViolation.Rows.Count > 0) + { + for (int r = 0; r < dtViolation.Rows.Count; r++) + { + if (dtViolation.Rows[r]["QCItemNo"].ToString() == QCItemNo && dtViolation.Rows[r]["ComponentNo"].ToString() == drData["ComponentNo"].ToString()) + { + ruleno = dtViolation.Rows[r]["ViolationID"].ToString(); + } + } + } + drData["RuleNo"] = ruleno; + } + + // Add SPC待檢清單 + kcSPC.UpdSpcLotQCList(LotNo, OpNo, 1, dtQCItem, strSPCSerial, colSQL); + //争对EAP处理 + if (EAPControl) + { + //对生产批的处理 + if (BrControl || intResult != 0) + { + // WIP的BR_SPCControl + DataTable dtSamplePara = new DataTable("SamplePara"); + dtSamplePara.Columns.Add("ParameterNo", Type.GetType("System.String")); + dtSamplePara.Columns.Add("ParameterValue", Type.GetType("System.String")); + kcWIP.BR_SPCControl(long.Parse(LotStamp), LotNo, ref LinkName, QCItemNo, UserNo, ShiftNo, colSQL, dtSamplePara, strMsg: ERFMsg, blnFirstLotOf2ndInsp: false, blnReleaseLog: blnReleaseLog); + funAutoBRSPCContorl_VarRet = LinkName; + // 紀錄Cont_QCItem + var loopTo13 = dtQCItem.Rows.Count - 1; + string[] comp_SPCSerial; + string[] comp_ERFMsg; + for (i = 0; i <= loopTo13; i++) + { + comp_SPCSerial = strSPCSerial[i].Split(';'); // 當計算方式為 ByComponent時會用;隔開 + var loopTo14 = comp_SPCSerial.Length - 1; + for (int c = 0; c <= loopTo14; c++) + kcSPC.AddWIPQCItemContent(LotNo, LotSerial, OpNo, QCItemNo, Convert.ToString(dtQCItem.Rows[i]["QCItemNo"]), 1, comp_SPCSerial[c], UserNo, LogGroupSerial, colSQL); + } + } + } + + // Add Limit + dsTemp = kcSPC.ShowQCChartDetail(FactorSerial); + if (!(dsTemp.Tables["QCChartDetail"] == null) && dsTemp.Tables["QCChartDetail"].Rows.Count > 0) + { + dsTemp.Tables["QCChartDetail"].Columns.Add("SPCSerial", Type.GetType("System.String")); + var loopTo2 = dsTemp.Tables["QCChartDetail"].Rows.Count - 1; + for (i = 0; i <= loopTo2; i++) + dsTemp.Tables["QCChartDetail"].Rows[i]["SPCSerial"] = dtQCItem.Rows[0]["SPCSerial"]; + kcSPC.AddSPCVarLimitContent(dsTemp.Tables["QCChartDetail"], colSQL); + } + + // Add Violation + if (!(dtViolation == null) && dtViolation.Rows.Count > 0) + { + var loopTo3 = dtViolation.Rows.Count - 1; + if (EAPControl && Convert.ToInt32(dtQCItemBasis.Rows[0]["CalType"]) == 1) + { + DataTable dtComSpcserial = dtComponent; + for (i = 0; i <= loopTo3; i++) + { + for (int s = 0; s < dtComSpcserial.Rows.Count; s++) + { + if (dtViolation.Rows[i]["QCItemNo"].ToString() == dtComSpcserial.Rows[s]["QCItemNo"].ToString() && dtViolation.Rows[i]["ComponentNo"].ToString() == dtComSpcserial.Rows[s]["ComponentNo"].ToString()) + { + dtViolation.Rows[i]["SPCSerial"] = dtComSpcserial.Rows[s]["SPCSerial"]; + } + } + } + } + else + { + for (i = 0; i <= loopTo3; i++) + dtViolation.Rows[i]["SPCSerial"] = dtQCItem.Rows[0]["SPCSerial"]; + } + kcSPC.AddSPCViolationContent(dtViolation, colSQL); + } + + //0173294: [6.0.7]SDD240326_01-04 / Execute_InLineSPC_Judge 將異常單訊息上提到新增ERFCrerateData之前 Edison 241126 + var strMsg = default(string); + // ↓=================================================================================================================== + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtQCItem.Rows[0]["Result"], 4, false)) || Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtQCItem.Rows[0]["Result"], 1, false))) + { + strMsg = "Auto SPC " + "[" + QCItemNo + "]" + Strings.Replace(dtQCItem.Rows[0]["ERFMsg"].ToString(), "$", ""); + } + + string strSPCSerialPlitByDot = string.Join(",", + dtViolation.AsEnumerable() + .Select(row => row.Field("SPCSerial")) + .Distinct()); + if (!blnHoldLot && strMsg != default(string)) + kcWIP.AddERFCreateData(LotNo, OpNo, "1", 0, strMsg, PopulationQty, UserNo, strSPCSerialPlitByDot, Conversions.ToInteger(dtQCItemBasis.Rows[0]["LotIsValid"]), 1, LotSerial: LotSerial, colSQL: colSQL); + + // 額外需執行的指令 + if (drData.Table.Columns.Contains("AdditionalSQL") && !(drData["AdditionalSQL"] is DBNull)) + { + aryAdditionalSQL = Strings.Split(drData["AdditionalSQL"].ToString(), "|"); + var loopTo4 = aryAdditionalSQL.Length - 1; + for (i = 0; i <= loopTo4; i++) + colSQL.Add(aryAdditionalSQL[i]); + } + + // 額外需執行的指令 Added by Neil 2008/05/19 + if (drData.Table.Columns.Contains("UpdateSQL") && !(drData["UpdateSQL"] is DBNull)) + { + objtc_SPC.CollectUpdateSQL(ref drData, ref colSQL); + } + + + // 呼叫執行SQL指令 + if (CollectionSQL == null) + { + // Call ExecuteSQLNoneQuery_UPD(DataBaseType, strConnectionString, CollectionSQL) + + // 執行彙總的 SQL 指令 + kcSPC.ExecuteSQL(colSQL); + drData["Execute"] = "success"; // 表示SPC資料已儲存成功 + } + else + { + // 2020/11/23 Grace 不執行指令,將指令傳出 + var loopTo5 = colSQL.Count; + for (i = 1; i <= loopTo5; i++) + CollectionSQL.Add(colSQL[i]); + } + + + + // ↑=================================================================================================================== + + + // 開立異常單 + string ERFNo; + + intERFSource = 1; + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtQCItem.Rows[0]["Result"], 1, false)) && blnAttachChart == true) + { + + if (MClassNo == defString) + { + + // 取得MClassNo (取不到則不開 )=============================================== + cnnTemp = CreateConnection(strConnectionString); + strSQL = "Select MClassNo, QCItemName From tblQCItemForVariables Where QCItemNo = '" + QCItemNo + "'"; + + // 'cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) 'Select data + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + MClassNo = drTemp["MClassNo"] + "".ToString(); + QCItemName = drTemp["QCItemName"] + "".ToString(); + if (!string.IsNullOrEmpty(MClassNo)) // Added by Yun 2007/12/19 + { + ERFNo = udWIP.InitERFNo(InitNo: "SPC"); + kcWIP.UpdERF_Create(1, -1, LotNo, intERFSource, ERFNo, 0, MClassNo, strMsg, Employee, CreateERF: true, OPNo: OpNo, CustomerNo: CustomerNo, ProductNo: ProductNo, SPCSerial: strSPCSerial[0], QCItemType: 1, MailNotice: false); + // 建立異常單附件並發送 Added by Neil 2008/05/21============================================================================ + // Dim dtHoldReason As New DataTable("HoldReason") + var AttachFileContent = default(byte[]); // Added by Neil 2008/05/21 mail附件 + if (objtc_SPC.funCreateAttachFile(ERFNo + ".pdf", QCItemNo, LotNo, ERFNo, ProductNo, CustomerNo, OpNo, MClassNo, Strings.Replace(Convert.ToString(dtQCItem.Rows[0]["ERFMsg"]), "$", ""), Employee, dsChartData, drData, dtTestValue, dtQCItemFactor, ref AttachFileContent, true, QCItemName) == true) + { + kcSPC.SendAlertMail(OpNo, MClassNo, QCItemNo, "1", "[ERF Create Notice]: ERFNo:" + ERFNo + " LotNo:" + LotNo, "ERFNo:" + ERFNo, ERFNo + ".pdf", AttachFileContent); + } + } + } + drTemp.Close(); + CloseConnection(cnnTemp); + + } + + } + + // ===== 發Mail ========= + // ↓=================================================================================================================== + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtQCItem.Rows[0]["Result"], 4, false))) // Alert 發 mail + { + // Last Modify:Neil 2008/05/22 + var AttachAlertFileContent = default(byte[]); // Added by Neil 2008/05/21 mail附件 + if (objtc_SPC.funCreateAttachFile("Alert.pdf", QCItemNo, LotNo, "", ProductNo, CustomerNo, OpNo, MClassNo, Strings.Replace(Convert.ToString(dtQCItem.Rows[0]["ERFMsg"]), "$", ""), Employee, dsChartData, drData, dtTestValue, dtQCItemFactor, ref AttachAlertFileContent, false, QCItemName) == true) + { + kcSPC.SendAlertMail(OpNo, MClassNo, QCItemNo, "1", "[Alert Mail]: QCItemNo:" + QCItemNo, "QCItemNo:" + QCItemNo, "Alert.pdf", AttachAlertFileContent); + } + } + // ↑=================================================================================================================== + if (EAPControl) + { + if (!BrControl) + { + if (intResult == 0) + { + funAutoBRSPCContorl_VarRet = "success"; // 表示 Function 執行成功 + } + } + } + else + { + funAutoBRSPCContorl_VarRet = "success"; // 表示 Function 執行成功 + } + + } + + + catch (Exception e1) + { + funAutoBRSPCContorl_VarRet = "fail"; + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + } // New Exception("kcSPC.funBRSPConlinetrans: " & e1.Message) + + finally + { + if (kcWIP != null) + kcWIP = null; + if (kcQC != null) + kcQC = null; + if (kcSPC != null) + kcSPC = null; + if (objtc_SPC != null) + objtc_SPC = null; + + if (cnnTemp != null) + CloseConnection(cnnTemp); + } + + return funAutoBRSPCContorl_VarRet; + + + } + + + + + /// + /// 计数标准-标版备用 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public string funAutoBRSPCContorl_Att(ref string LotSerial, ref string LogGroupSerial, ref string LotStamp, ref string ProductNo, ref string CustomerNo, + ref DataRow drData, DataView dvError = null, + string MClassNo = defString, bool blnChkOnly = true, bool blnCreateERF = true, + bool blnChkAttRule = true, Collection CollectionSQL = null, + long AQLRejectNum = defInteger, string LotRuleNo = defString, + DataTable dtQCItemFactorAll = null, string UserNo = defString, string ShiftNo = defString, bool BrControl = false, bool EAPControl = false, DataTable dtAttDetailLogComponent = null, bool blnReleaseLog = true, bool blnHoldLot = true) + { + string funAutoBRSPCContorl_AttRet = default(string); + + + // 此 Function 將自動判別檢測數據_計數 + // 傳入值: drData (一次傳入一組檢驗資料,內有LotNo,OpNo,QCItemNo,PratNo,Employee)等 + // 傳入 : dtError (不良原因) + // 傳回值funAutoBRSPCContorl_Att: success(成功), QCItemNo(找不到品管項目編號), LotNo(找不到批號)... + // 傳回值: drData(檢測結果) + + IDbConnection cnnTemp = null; + // 'Dim cmmTemp As OleDb.OleDbCommand + DbDataReader drTemp = null; + string strSQL; + + var kcQC = new kcQC.clsQCBasis(); + var kcWIP = new kcWIP.clsLot(); + var kcSPC = new kcSPC.clsSPC(); + var udSPC = new udSPC.clsSPC(); + var udWIP = new udWIP.clsWIP(); + + // Table + DataSet dsTemp; + var dtQCItemBasis = default(DataTable); + var dtQCItemFactor = default(DataTable); + var dtFactorOnline = default(DataTable); + DataTable dtLotData; + var dtWIPFactor = default(DataTable); + DataTable dtQCItem; // 主要是儲存Check後的結果 + var dtError = default(DataTable); + DataRow drAdd; + DataRow[] drSel; + + // 傳入的資料 + var LotNo = default(string); + var OpNo = default(string); + var QCItemNo = default(string); + string QCItemName; + var Employee = default(string); + decimal SampleQty = default(decimal), ScrapQty = default(decimal), DefectQty = default(decimal), GoodQty = default(decimal); + + int i, j; + string ERFAction; + var ERFMsg = default(string); + var strSPCSerial = new string[2]; + + + var intResult = default(int); + int intERFSource; + var LinkName = default(string); + // Dim LotSerial As String + // Dim LogGroupSerial As String + string ExecuteSPCSerial; + string PopulationQty = ""; + // Dim ProductNo As String + // Dim CustomerNo As String = "N/A" '開異常單時 customerNo不能 Null + // Dim LotStamp As String + bool MailNotice = false; + string[] aryAdditionalSQL; + int LimitLotNum; // 計數品管項目的最大顯示批數 + + string[] aryUpdateSQLReplace; // Added by Neil 2008/05/22 + bool blnCheckOK = true; // Added by Neil 2008/05/22 作為各項檢查的指標,任何一項檢查不過則為False + var strCheckNotOKMessage = default(string); // Added by Neil 2008/05/22 + + tcSPC_IC.clsSPC objtc_SPC = new tcSPC_IC.clsSPC(); + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + + try + { + funAutoBRSPCContorl_AttRet = "error"; // Initial + + // ===== 整理傳入的資料 ========= + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + if (drData.Table.Columns.Contains("LotNo")) + { + LotNo = drData["LotNo"] + "".ToString(); + } + else + { + strCheckNotOKMessage = "No LotNo"; + // Exit Function + blnCheckOK = false; + } // Added by Neil 2008/05/22 + } + + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + if (drData.Table.Columns.Contains("QCItemNo")) + { + QCItemNo = drData["QCItemNo"] + "".ToString().ToUpper(); // 請注意一定要轉大寫 + } + else + { + strCheckNotOKMessage = "No QCItemNo"; + // Exit Function + blnCheckOK = false; + } // Added by Neil 2008/05/22 + } + + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + if (drData.Table.Columns.Contains("OpNo")) + { + OpNo = drData["OpNo"] + "".ToString(); + } + + if (drData.Table.Columns.Contains("Employee")) + { + Employee = drData["Employee"] + "".ToString(); + } + + if (drData.Table.Columns.Contains("Product")) + { + ProductNo = drData["Product"] + "".ToString(); + } + if (drData.Table.Columns.Contains("SampleQty")) + { + SampleQty = Convert.ToDecimal(drData["SampleQty"]); + } + else + { + strCheckNotOKMessage = "No SampleQty"; + // Exit Function + blnCheckOK = false; + } // Added by Neil 2008/05/22 + } + + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + if (drData.Table.Columns.Contains("ScrapQty")) + { + ScrapQty = Convert.ToDecimal(drData["ScrapQty"]); + } + else + { + strCheckNotOKMessage = "No ScrapQty"; + // Exit Function + blnCheckOK = false; + } // Added by Neil 2008/05/22 + } + + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + if (drData.Table.Columns.Contains("DefectQty")) + { + DefectQty = Convert.ToDecimal(drData["DefectQty"]); + } + else + { + DefectQty = 0m; + } + if (drData.Table.Columns.Contains("GoodQty")) + { + GoodQty = Convert.ToDecimal(drData["GoodQty"]); + } + else + { + strCheckNotOKMessage = "No GoodQty"; + // Exit Function + blnCheckOK = false; + } // Added by Neil 2008/05/22 + } + + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + // 不良原因 + if (dvError != null) + { + dtError = dvError.Table.Clone(); + var loopTo = dvError.Count - 1; + for (i = 0; i <= loopTo; i++) + dtError.ImportRow(dvError[i].Row); + if (funChkReasonsExist(dtError, ref ScrapQty, ref DefectQty, ref GoodQty, ref SampleQty) == false) + { + strCheckNotOKMessage = "ReasonNo is not exist"; + blnCheckOK = false; + } + } + + + // ===== 檢查資料是否正確 ========= + // 1.取出品管項目 + dtQCItemBasis = kcQC.ShowQCItemForAttributes(QCItemNo, IssueState: 2).Tables[0]; + + if (dtQCItemBasis == null || dtQCItemBasis.Rows.Count == 0) + { + strCheckNotOKMessage = "QCItemNo Error"; + // Exit Function + blnCheckOK = false; // Added by Neil 2008/05/22 + } + } + + + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + // 2 取出Lot資料 + dtLotData = kcWIP.ShowLotBasisJoinState(LotNo).Tables[0]; + if (dtLotData == null || dtLotData.Rows.Count == 0) + { + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtQCItemBasis.Rows[0]["LotIsValid"], 1, false))) // 必須檢查批號有效,但找不到批號資料 + { + strCheckNotOKMessage = "LotData Error"; + // Exit Function + blnCheckOK = false; // Added by Neil 2008/05/22 + } + } + else + { + PopulationQty = dtLotData.Rows[0]["CurQty"].ToString(); + LotSerial = dtLotData.Rows[0]["LotSerial"] + "".ToString(); + LogGroupSerial = dtLotData.Rows[0]["LogGroupSerial"] + "".ToString(); + LotStamp = dtLotData.Rows[0]["LotStamp"] + "".ToString(); + ProductNo = dtLotData.Rows[0]["ProductNo"] + "".ToString(); + CustomerNo = dtLotData.Rows[0]["CustomerNo"] + "".ToString(); + OpNo = dtLotData.Rows[0]["OpNo"] + "".ToString(); + } + } + + // ===== 整理要因資料 ========= + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + // 3.1 取出 QCItemFactor + if (!(dtQCItemFactorAll == null)) + { + dtQCItemFactor = dtQCItemFactorAll; + } + else + { + dtQCItemFactor = kcQC.ShowQCItemFactor(QCItemNo).Tables[0]; + } + + if (dtQCItemFactor == null || dtQCItemFactor.Rows.Count == 0) + { + strCheckNotOKMessage = "QCItemFactor Error"; + // Exit Function + blnCheckOK = false; // Added by Neil 2008/05/22 + } + } + + + // 3.2 取得檢驗批的要因資料 + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + dtWIPFactor = udSPC.LoadLotFactorValue(LotNo).Tables[0]; + } + + + // 3.3.將取得的要因值填入品管項目要因,取不到值的則填入N/A + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + dtQCItemFactor.Columns.Add("FactorValue", Type.GetType("System.String")); + dtFactorOnline = dtQCItemFactor.Clone(); // 複製Table Schema + var loopTo1 = dtQCItemFactor.Rows.Count - 1; + for (i = 0; i <= loopTo1; i++) + { + drSel = dtWIPFactor.Select("ParameterNo = '" + dtQCItemFactor.Rows[i]["FactorNo"] + "'".ToString()); + if (drSel.Length > 0) + { + dtQCItemFactor.Rows[i]["FactorValue"] = drSel[0]["Value"]; + } + else if (drData.Table.Columns.Contains(Convert.ToString(dtQCItemFactor.Rows[i]["FactorNo"])) && !(drData[dtQCItemFactor.Rows[i]["FactorNo"].ToString()] is DBNull) && Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drData[dtQCItemFactor.Rows[i]["FactorNo"].ToString()], "", false))) + { + dtQCItemFactor.Rows[i]["FactorValue"] = drData[dtQCItemFactor.Rows[i]["FactorNo"].ToString()]; // 從傳入的drData 中取得要因 + } + else + { + dtQCItemFactor.Rows[i]["FactorValue"] = "N/A"; + } + + // 取出線上管制要因 + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtQCItemFactor.Rows[i]["FactorOnline"], "Y", false))) + { + dtFactorOnline.ImportRow(dtQCItemFactor.Rows[i]); + } + } + } + + + // '===== 檢查此筆檢測資料是否已經存過 ========= + // If blnChkOnly = True Then + // If kcSPC.ShowVarFactorLog(, , QCItemNo, LotNo).Tables("SPCVarFactorLog").Rows.Count > 0 Then + // funAutoBRSPCContorl_Var = "Already Exist" + // Exit Function + // End If + // End If + + + // 若純檢查,只要做到這裡為止 + if (blnChkOnly == true) + { + funAutoBRSPCContorl_AttRet = ""; + return funAutoBRSPCContorl_AttRet; + } + + // '===== Check 規格與管制法則 ========= + var dtViolation = new DataTable("Violation"); // 執行 funChkAttRule 後回傳結果 + if (blnChkAttRule == true) + { + if (blnCheckOK == true) // 前項檢查通過才繼續下面的動作 + { + dtViolation.Columns.Add("SPCSerial", Type.GetType("System.String")); + dtViolation.Columns.Add("ViolationID", Type.GetType("System.String")); // 違反類型:WE001, WE002, ..,WE008 + dtViolation.Columns.Add("PChartFlag", Type.GetType("System.Int16")); // 0:否 1:是 + + if (!(dtQCItemBasis.Rows[0]["LimitLotNum"] is DBNull)) + { + LimitLotNum = Conversions.ToInteger(dtQCItemBasis.Rows[0]["LimitLotNum"]); + } + else + { + LimitLotNum = defInteger; + } + + // 檢查法則(取出LinkeName,ERFMsg,intResult,dtViolation) + if (Convert.ToBoolean(objtc_SPC.funChkAttRule(QCItemNo, dtError, Convert.ToString(dtQCItemBasis.Rows[0]["RuleNo"] + + ""), (long)Math.Round(SampleQty), ref LinkName, ref ERFMsg, ref intResult, ref dtViolation, ScrapQty / SampleQty, dtFactorOnline, LimitLotNum, AQLRejectNum, LotRuleNo)) == false) + { + strCheckNotOKMessage = "Check Rule Error"; + // Exit Function + blnCheckOK = false; // Added by Neil 2008/05/22 + } + } + } + + // Added by Neil 2008/05/19 + if (blnCheckOK == false) + { + drData["Execute"] = strCheckNotOKMessage; // 從下面搬移過來 Yun 2009/6/4 + + // 檢查沒過回寫狀態 + if (drData.Table.Columns.Contains("UpdateSQL") && !(drData["UpdateSQL"] is DBNull)) + { + if (drData.Table.Columns.Contains("UpdateSQLReplace") && !(drData["UpdateSQLReplace"] is DBNull)) + { + var CollectSQL = new Collection(); + // drData("Execute") = strCheckNotOKMessage '搬移 Yun 2009/6/4 + objtc_SPC.CollectUpdateSQL(ref drData, ref CollectSQL); + if (CollectSQL.Count != 0) + { + kcSPC.ExecuteSQL(CollectSQL); + } + } + } + + funAutoBRSPCContorl_AttRet = strCheckNotOKMessage; + return funAutoBRSPCContorl_AttRet; + + } + + drData["Result"] = LinkName; // 回傳出去給人看的所以用字串 + drData["intResult"] = intResult; + + // Add QCItem Test Value + dtQCItem = new DataTable("QCItem"); + dtQCItem.Columns.Add("QCItemNo", Type.GetType("System.String")); + dtQCItem.Columns.Add("QCAttSPSerial", Type.GetType("System.String")); + dtQCItem.Columns.Add("SampleQty", Type.GetType("System.Int32")); + dtQCItem.Columns.Add("GoodQty", Type.GetType("System.Int32")); + dtQCItem.Columns.Add("ScrapQty", Type.GetType("System.Int32")); + dtQCItem.Columns.Add("DefectQty", Type.GetType("System.Int32")); + dtQCItem.Columns.Add("Result", Type.GetType("System.Int32")); + dtQCItem.Columns.Add("ERFMsg", Type.GetType("System.String")); + dtQCItem.Columns.Add("SPCSerial", Type.GetType("System.String")); // 產生SPCSerial後可存在此欄位 + + if (blnChkAttRule == true) + { + drAdd = dtQCItem.NewRow(); + drAdd["QCItemNo"] = QCItemNo; + drAdd["QCAttSPSerial"] = ""; + drAdd["SampleQty"] = SampleQty; + drAdd["GoodQty"] = GoodQty; + drAdd["ScrapQty"] = ScrapQty; + drAdd["DefectQty"] = DefectQty; + drAdd["Result"] = intResult.ToString(); + drAdd["ERFMsg"] = ERFMsg; + drAdd["SPCSerial"] = ""; + if (MClassNo != defString) + { + drAdd["MClassNo"] = MClassNo; + } + dtQCItem.Rows.Add(drAdd); + + // 2020/01/20 ,Yenru Add ERFMSG + if (drData.Table.Columns.Contains("ERFMsg")) + { + drData["ERFMsg"] = dtQCItem.Rows[0]["ERFMsg"]; + } + //回写法则编号 + string ruleno = ""; + if (drData.Table.Columns.Contains("RuleNo")) + { + drData["RuleNo"] = dtQCItemBasis.Rows[0]["RuleNo"]; + } + } + else + { + drAdd = dtQCItem.NewRow(); + drAdd["QCItemNo"] = drData["QCItemNo"]; + drAdd["QCAttSPSerial"] = ""; + drAdd["SampleQty"] = drData["SampleQty"]; + drAdd["GoodQty"] = drData["GoodQty"]; + drAdd["ScrapQty"] = drData["ScrapQty"]; + drAdd["DefectQty"] = 0; + drAdd["Result"] = drData["DefaultResult"]; + drAdd["ERFMsg"] = ""; + drAdd["SPCSerial"] = ""; + if (MClassNo != defString) + { + drAdd["MClassNo"] = MClassNo; + } + dtQCItem.Rows.Add(drAdd); + } + + // 收集要執行的指令 + var colSQL = new Collection(); + string strReturnValue; + + // Update SPC Log + if (!dtQCItem.Columns.Contains("Rank")) + { + dtQCItem.Columns.Add("Rank", Type.GetType("System.String")); // 2010/06/28 Lai + } + if (!dtQCItem.Columns.Contains("RankDetail")) + { + dtQCItem.Columns.Add("RankDetail", Type.GetType("System.String")); // 2010/06/28 Lai + } + + strReturnValue = kcSPC.UpdAtt_TestValue(dtQCItemFactor, dtQCItem, dtError, LotNo, LotSerial, Creator: Employee, colSQL: colSQL, LogGroupSerial: LogGroupSerial); + + // 取得 SPCSerial + strSPCSerial = Strings.Split(strReturnValue, "|"); + if (drData.Table.Columns.Contains("SPCSerial")) + { + drData["SPCSerial"] = strSPCSerial[0]; + } + + // Add SPC待檢清單 + kcSPC.UpdSpcLotQCList(LotNo, OpNo, 0, dtQCItem, strSPCSerial, colSQL); + + //争对EAP处理 + if (EAPControl) + { + //对生产批的处理 + if (BrControl || intResult != 0) + { + // WIP的BR_SPCControl + DataTable dtSamplePara = new DataTable("SamplePara"); + dtSamplePara.Columns.Add("ParameterNo", Type.GetType("System.String")); + dtSamplePara.Columns.Add("ParameterValue", Type.GetType("System.String")); + kcWIP.BR_SPCControl(long.Parse(LotStamp), LotNo, ref LinkName, QCItemNo, UserNo, ShiftNo, colSQL, dtSamplePara, strMsg: ERFMsg, blnFirstLotOf2ndInsp: false, blnReleaseLog: blnReleaseLog); + funAutoBRSPCContorl_AttRet = LinkName; + // 紀錄Cont_QCItem + var loopTo13 = dtQCItem.Rows.Count - 1; + string[] comp_SPCSerial; + string[] comp_ERFMsg; + for (i = 0; i <= loopTo13; i++) + { + comp_SPCSerial = strSPCSerial[i].Split(';'); // 當計算方式為 ByComponent時會用;隔開 + var loopTo14 = comp_SPCSerial.Length - 1; + for (int c = 0; c <= loopTo14; c++) + kcSPC.AddWIPQCItemContent(LotNo, LotSerial, OpNo, QCItemNo, Convert.ToString(dtQCItem.Rows[i]["QCItemNo"]), 1, comp_SPCSerial[c], UserNo, LogGroupSerial, colSQL); + } + } + } + + string strPChcartViolationID; + // Add Att Violation + if (!(dtViolation == null) && dtViolation.Rows.Count > 0) + { + strPChcartViolationID = ""; + var loopTo2 = dtViolation.Rows.Count - 1; + for (i = 0; i <= loopTo2; i++) + { + dtViolation.Rows[i]["SPCSerial"] = dtQCItem.Rows[0]["SPCSerial"]; + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtViolation.Rows[i]["PChartFlag"], 1, false))) + { + strPChcartViolationID = strPChcartViolationID + (string.IsNullOrEmpty(strPChcartViolationID) ? "" : "|") + + dtViolation.Rows[i]["ViolationID"]; + } + } + kcSPC.AddSPCAttViolationContent(dtViolation, colSQL); + kcSPC.AddSPCPChartFailLog(strSPCSerial[0], QCItemNo, (ScrapQty / SampleQty).ToString(), strPChcartViolationID, ProductNo, OpNo); // P-Chart 不良紀錄 + } + + //0173294: [6.0.7]SDD240326_01-04 / Execute_InLineSPC_Judge 將異常單訊息上提到新增ERFCrerateData之前 Edison 241126 + + var strMsg = default(string); + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtQCItem.Rows[0]["Result"], 4, false)) || Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtQCItem.Rows[0]["Result"], 3, false))) // Alert 或 Hold 要發 mail (4=Alert,計數的Result,與計量不同) + { + strMsg = "Auto SPC " + "[" + QCItemNo + "]" + Strings.Replace(dtQCItem.Rows[0]["ERFMsg"].ToString(), "$", ""); + // Call kcSPC.SendAlertMail(OpNo, MClassNo, QCItemNo, "0", "[Alert Mail]:" & QCItemNo, strMsg) + } + + string strSPCSerialPlitByDot = string.Join(",", + dtViolation.AsEnumerable() + .Select(row => row.Field("SPCSerial")) + .Distinct()); + if (!blnHoldLot && strMsg != default(string)) + kcWIP.AddERFCreateData(LotNo, OpNo, "1", 0, strMsg, PopulationQty, UserNo, strSPCSerialPlitByDot, Conversions.ToInteger(dtQCItemBasis.Rows[0]["LotIsValid"]), 1, LotSerial: LotSerial, colSQL: colSQL); + + if (!(dtAttDetailLogComponent == null)) + { + var loopTo14 = dtAttDetailLogComponent.Rows.Count - 1; + for (i = 0; i <= loopTo14; i++) + kcSPC.AddSPCAttDetailLogComponent(strSPCSerial[0], dtAttDetailLogComponent.Rows[i]["ComponentNo"].ToString(), dtAttDetailLogComponent.Rows[i]["ErrorNo"].ToString(), Convert.ToDecimal(dtAttDetailLogComponent.Rows[i]["ErrorQty"]), dtAttDetailLogComponent.Rows[i]["Area"].ToString(), dtAttDetailLogComponent.Rows[i]["Memo"].ToString(), colSQL); + } + + // 額外需執行的指令 + if (drData.Table.Columns.Contains("AdditionalSQL") && Operators.ConditionalCompareObjectNotEqual(drData["AdditionalSQL"] + "", "", false)) + { + aryAdditionalSQL = Strings.Split(drData["AdditionalSQL"].ToString(), "|"); + var loopTo3 = aryAdditionalSQL.Length - 1; + for (i = 0; i <= loopTo3; i++) + colSQL.Add(aryAdditionalSQL[i]); + } + + // 額外需執行的指令 Added by Neil 2008/05/22 + if (drData.Table.Columns.Contains("UpdateSQL") && !(drData["UpdateSQL"] is DBNull)) + { + objtc_SPC.CollectUpdateSQL(ref drData, ref colSQL); + } + + + // 呼叫執行SQL指令 + if (CollectionSQL == null) + { + // Call ExecuteSQLNoneQuery_UPD(DataBaseType, strConnectionString, CollectionSQL) + // 執行彙總的 SQL 指令 + kcSPC.ExecuteSQL(colSQL); + drData["Execute"] = "success"; // 表示SPC資料已儲存成功 + } + else + { + // 2020/11/23 Grace 不執行指令,將指令傳出 + var loopTo4 = colSQL.Count; + for (i = 1; i <= loopTo4; i++) + CollectionSQL.Add(colSQL[i]); + } + + if (blnCreateERF == true) + { + // ===== 發Mail ========= + // //Create connection + //var strMsg = default(string); + + //// ↓=================================================================================================================== + //if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtQCItem.Rows[0]["Result"], 4, false)) || Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtQCItem.Rows[0]["Result"], 3, false))) // Alert 或 Hold 要發 mail (4=Alert,計數的Result,與計量不同) + //{ + // strMsg = "Auto SPC " + "[" + QCItemNo + "]" + Strings.Replace(dtQCItem.Rows[0]["ERFMsg"].ToString(), "$", ""); + // // Call kcSPC.SendAlertMail(OpNo, MClassNo, QCItemNo, "0", "[Alert Mail]:" & QCItemNo, strMsg) + //} + // ↑=================================================================================================================== + + + // 開立異常單 + string ERFNo; + string OPName = defString; // added by Neil 2008/07/29 + + intERFSource = 1; + + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dtQCItem.Rows[0]["Result"], 3, false))) // Hold + { + + if (MClassNo == defString) + { + // 取得MClassNo (取不到則不開) ======================================================== 'update by Yun 2007/12/19 + cnnTemp = CreateConnection(strConnectionString); + strSQL = "Select MClassNo, QCItemName From tblQCItemForAttributes Where QCItemNo = '" + QCItemNo + "'"; + + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) 'Select data + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + MClassNo = drTemp["MClassNo"] + "".ToString(); + QCItemName = drTemp["QCItemName"] + "".ToString(); + if (!string.IsNullOrEmpty(MClassNo)) // Added by Yun 2007/12/19 + { + ERFNo = udWIP.InitERFNo(InitNo: "SPC"); + kcWIP.UpdERF_Create(1, Conversions.ToLong(LotStamp), LotNo, intERFSource, ERFNo, 0, MClassNo, strMsg, Employee, CreateERF: true, OPNo: OpNo, CustomerNo: CustomerNo, ProductNo: ProductNo, SPCSerial: strSPCSerial[0], QCItemType: 0); + } + } + drTemp.Close(); + CloseConnection(cnnTemp); + } + } + } + + + if (EAPControl) + { + if (!BrControl) + { + if (intResult == 0) + { + funAutoBRSPCContorl_AttRet = "success"; // 表示 Function 執行成功 + } + } + } + else + { + funAutoBRSPCContorl_AttRet = "success"; // 表示 Function 執行成功 + } + } + + + catch (Exception e1) + { + funAutoBRSPCContorl_AttRet = "fail"; + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + } // New Exception("kcSPC.funBRSPConlinetrans: " & e1.Message) + + finally + { + if (kcWIP != null) + kcWIP = null; + if (kcQC != null) + kcQC = null; + if (kcSPC != null) + kcSPC = null; + + if (objtc_SPC != null) + objtc_SPC = null; + + if (cnnTemp != null) + CloseConnection(cnnTemp); + } + + return funAutoBRSPCContorl_AttRet; + + + } + + // Added by Neil 2008/07/29 檢查原因是否存在並更新ScrapQty,DefectQty,GoodQty資料 + private bool funChkReasonsExist(DataTable dtError, ref decimal ScrapQty, ref decimal DefectQty, ref decimal GoodQty, ref decimal SampleQty) + { + bool funChkReasonsExistRet = default(bool); + + IDbConnection cnnTemp = null; + // Dim cmmTemp As OleDb.OleDbCommand + DbDataReader drTemp = null; + + var ScrapCount = default(decimal); + var DefectCount = default(decimal); + + int inti; + + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + string strSQL = ""; + + try + { + + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + // cmmTemp = New OleDb.OleDbCommand + // cmmTemp.Connection = cnnTemp + + funChkReasonsExistRet = true; + + var loopTo = dtError.Rows.Count - 1; + for (inti = 0; inti <= loopTo; inti++) + { + // 檢查資料在 TBL_QUICS_SPCDETAILLOG 中是否存在 + strSQL = "SELECT REASONTYPE FROM TBLQCREASONBASIS " + "WHERE " + "REASONNO = '" + + dtError.Rows[inti]["ErrorNo"] + "' AND ISSUESTATE = 2"; + + // cmmTemp.CommandText = strSQL + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + + if (drTemp.Read() == false) // 若不存在則結束 + { + funChkReasonsExistRet = false; + return funChkReasonsExistRet; + } + else + { + + switch (drTemp["ReasonType"].ToString()) + { + case "0": // Scrap + { + ScrapCount = (decimal)((double)ScrapCount + Conversion.Val(dtError.Rows[inti]["ErrorQty"])); + break; + } + case "1": // Defect + { + DefectCount = (decimal)((double)DefectCount + Conversion.Val(dtError.Rows[inti]["ErrorQty"])); + break; + } + } + } + drTemp.Close(); + } + + ScrapQty = ScrapCount; + DefectQty = DefectCount; + GoodQty = SampleQty - (ScrapQty + DefectQty); + } + + catch (Exception ex) + { + funChkReasonsExistRet = false; + throw; + } + finally + { + if (!(cnnTemp == null)) + CloseConnection(cnnTemp); + + } + + return funChkReasonsExistRet; + + } + + + //建立计数检验数据收集接口 + public static bool funCreateSPCATTBASIS(ref List aryMessage, ref List aryException, ref Collection CollectionSQL, string SpcSerial, string QCItemNo, string LotNo, string SampleQty, string GoodQty, string ScrapQty, string DefectQty, string Result, string SPCSerial_QMS, string MaterialNo, string MTLVendor, string Employee, string ProDuct, string EquipMent, string DC, string CreateDate) + { + bool result = false; + //int i; + string strSQL = ""; + string strSQL_Value = ""; + //IDbConnection cnnTemp = null; + //DbDataReader drTemp = null; + //Collection CollectionSQL = new Collection(); + + //AppSettings objSetting = new AppSettings(); + //string strDataBaseType = objSetting.GetDataBaseType(); + //string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + decimal decResult = 0; + try + { + //cnnTemp = CreateConnection(strConnectionString); + + //因为前面先锁住序号,所有这里不需要再次检查 + + ////先检查是否已经存在相同数据 + //strSQL = $@"Select * From tblSPCAttBasisLog Where SpcSerial ='{SpcSerial}'"; + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + //if (drTemp.Read()) + //{ + // //combineException(ref aryException, null, null, "[%已经存在对应的计数检验数据!%]"); + // //return result; + // throw new Exception("已经存在对应的计数检验数据!"); + //} + //drTemp.Dispose(); + + //主档 + strSQL = "Insert Into tblSPCAttBasisLog(SpcSerial,QCItemNo,LotNo,CreateDate,Creator,Product,Equipment,SPCSerial_QMS,MATERIAL,MTLVendor,EMPLOYEE,DC"; + strSQL_Value = $@" Values('{SpcSerial}','{QCItemNo}','{LotNo}',To_Date('{Strings.Format(Convert.ToDateTime(CreateDate), "yyyy/MM/dd H:mm:ss")}','YYYY/MM/DD HH24:MI:SS'),'QMS','{ProDuct}', +'{EquipMent}','{SPCSerial_QMS}','{MaterialNo}','{MTLVendor}','{Employee}','{DC}'"; + + if (SampleQty != "") + { + strSQL += ",SampleQty"; + strSQL_Value += $@",{SampleQty}"; + } + if (GoodQty != "") + { + strSQL += ",GoodQty"; + strSQL_Value += $@",{GoodQty}"; + } + if (ScrapQty != "") + { + strSQL += ",ScrapQty"; + strSQL_Value += $@",{ScrapQty}"; + } + if (DefectQty != "") + { + strSQL += ",DefectQty"; + strSQL_Value += $@",{DefectQty}"; + } + if (Result != "") + { + if (Result.ToUpper() == "PASS") + { + //成功 + decResult = 0; + } + else + { + //失败 //先默认4 + decResult = 4; + } + + + strSQL += ",Result"; + strSQL_Value += $@",{decResult}"; + } + + strSQL += ")"; + strSQL_Value += ")"; + + CollectionSQL.Add(strSQL + strSQL_Value); + + //ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + result = true; + + } + catch (Exception ex) + { + //combineException(ref aryException, null, ex.Message, "[%新增计数检验数据失败%]", ex.StackTrace); + throw; + } + finally + { + //if (drTemp != null && !drTemp.IsClosed) + //{ + // drTemp.Close(); + //} + //CloseConnection(cnnTemp); + } + + return result; + } + //建立计数检验数据明细记录接口 + public static bool funCreateSPCATTDETAIL(ref List aryMessage, ref List aryException, ref Collection CollectionSQL, string SpcSerial, string QCItemNo, string ErrorNo, string strErrorQty, string CreateDate) + { + bool result = false; + string strSQL = ""; + string strSQL_Value = ""; + //IDbConnection cnnTemp = null; + //DbDataReader drTemp = null; + //Collection CollectionSQL = new Collection(); + + //AppSettings objSetting = new AppSettings(); + //string strDataBaseType = objSetting.GetDataBaseType(); + //string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + decimal ErrorQty = 0; + + try + { + //cnnTemp = CreateConnection(strConnectionString); + + //因为前面先锁住序号,所有这里不需要再次检查 + + ////先检查是否已经存在相同数据 + //strSQL = $@"Select * From tblSPCAttDetailLog Where SpcSerial ='{SpcSerial}'"; + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + //if (drTemp.Read()) + //{ + // combineException(ref aryException, null, null, "[%已经存在对应的计数检验数据!%]"); + // return result; + //} + //drTemp.Dispose(); + + if (!decimal.TryParse(strErrorQty, out ErrorQty)) + { + throw new Exception("不良数量格式错误!"); + } + + //主档 + + strSQL = "Insert Into tblSPCAttDetailLog(SpcSerial,QCItemNo,ErrorNo,ErrorQty,CreateDate"; + strSQL_Value = $@" Values('{SpcSerial}','{QCItemNo}','{ErrorNo}',{ErrorQty},To_Date('{Strings.Format(Convert.ToDateTime(CreateDate), "yyyy/MM/dd H:mm:ss")}','YYYY/MM/DD HH24:MI:SS')"; + + strSQL += ")"; + strSQL_Value += ")"; + + CollectionSQL.Add(strSQL + strSQL_Value); + + + + //ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + result = true; + + } + catch (Exception ex) + { + //combineException(ref aryException, null, ex.Message, "[%新增计数检验数据失败%]", ex.StackTrace); + throw; + } + finally + { + //if (drTemp != null && !drTemp.IsClosed) + //{ + // drTemp.Close(); + //} + //CloseConnection(cnnTemp); + } + + return result; + } + //建立计数检验数据区域明细接口 + public static bool funCreateSPCATTSECTION(ref List aryMessage, ref List aryException, ref Collection CollectionSQL, string SpcSerial, string SectionNo, string ErrorNo, string Area, string strErrorQty) + { + bool result = false; + //int i; + string strSQL = ""; + string strSQL_Value = ""; + //IDbConnection cnnTemp = null; + //DbDataReader drTemp = null; + //Collection CollectionSQL = new Collection(); + + //AppSettings objSetting = new AppSettings(); + //string strDataBaseType = objSetting.GetDataBaseType(); + //string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + decimal ErrorQty = 0; + try + { + //cnnTemp = CreateConnection(strConnectionString); + + //因为前面先锁住序号,所有这里不需要再次检查 + + ////先检查是否已经存在相同数据 + //strSQL = $@"Select * From tblSPCAttDetailLogSection Where SpcSerial ='{SpcSerial}'"; + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + //if (drTemp.Read()) + //{ + // combineException(ref aryException, null, null, "[%已经存在对应的计数检验数据区域明细!%]"); + // return result; + //} + //drTemp.Dispose(); + + + + + //主档 + + strSQL = "Insert Into tblSPCAttDetailLogSection(SpcSerial,SectionNo,ErrorNo,Area"; + strSQL_Value = $@" Values('{SpcSerial}','{SectionNo}','{ErrorNo}','{Area}'"; + + if (strErrorQty != "") + { + if (!decimal.TryParse(strErrorQty, out ErrorQty)) + { + throw new Exception("不良数量格式错误!"); + } + + strSQL += ",ErrorQty"; + strSQL_Value += $@",{ErrorQty}"; + } + + strSQL += ")"; + strSQL_Value += ")"; + + CollectionSQL.Add(strSQL + strSQL_Value); + + + + ////sql集合一起执行 + //ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + + ////成功后回写最大码 + //funGetSPCSerialNo(true); + + result = true; + + } + catch (Exception ex) + { + //combineException(ref aryException, null, ex.Message, "[%新增计数检验数据失败%]", ex.StackTrace); + throw; + } + finally + { + //if (drTemp != null && !drTemp.IsClosed) + //{ + // drTemp.Close(); + //} + //CloseConnection(cnnTemp); + } + + return result; + } + + public static string funGetSPCSerialNo(bool ReserveSerialNo) + { + string funExeSerialCreate_SerialRet = default(string); + + DbDataReader drTemp = null; + var colSQL = new Collection(); + var colSQL_Rows = new Collection(); + var arySerial = new ArrayList(); + + string SerialType = "SPCAPI"; + string SerialString = "SPCSERIAL"; + int SerialLength = 4; + int DecimalType = 1; + long SerialCount = 1; + int PadLeft = defInteger; + string strSQL = ""; + IDbConnection cnnTemp = null; + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + + + try + { + + cnnTemp = CreateConnection(strConnectionString); + + // 取出最大碼. + bool blnInsert; + long lngMaxSerialNo; // 起始碼. + long lngSerialNo_Last; // 最大一個序號. + var strSerialNo_Last_nn = default(string); // 轉換成10,16,36表示式. + + strSQL = "Select MaxSerialNo From tblSYSSerialCreateMax " + " Where SerialType='" + SerialType + "'" + " And SerialString='" + SerialString + "'" + " And SerialLength=" + SerialLength + " And DecimalType=" + DecimalType + ""; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + blnInsert = false; + lngMaxSerialNo = Conversions.ToLong(drTemp["MaxSerialNo"]); + } + else + { + blnInsert = true; + lngMaxSerialNo = 0L; + } + drTemp.Close(); + + // 最大的序號 + lngSerialNo_Last = lngMaxSerialNo + SerialCount; + + if (DecimalType == 1) + { + strSerialNo_Last_nn = lngSerialNo_Last.ToString(); + } + else if (DecimalType == 2) + { + strSerialNo_Last_nn = Tran10_16(lngSerialNo_Last); + } + else if (DecimalType == 3) + { + strSerialNo_Last_nn = Tran10_36(lngSerialNo_Last); + } + + // 86774: [6.0.5] 序號規則新增34進位序號 + // ===================================== 86774 Start ===================================== + else if (DecimalType == 4) + { + strSerialNo_Last_nn = Tran10_34(lngSerialNo_Last); + // ===================================== 86774 End ===================================== + + } + + // 最大碼是否超出序號長度. + if (strSerialNo_Last_nn != null && strSerialNo_Last_nn.Length > SerialLength) + { + throw new iMESException.MESException("9P12-200028", "[%SerialString%]: " + SerialString + Constants.vbNewLine + "[%SerialLength%]: " + SerialLength + Constants.vbNewLine + "[%SerialNo%]: " + strSerialNo_Last_nn); + } + + if (ReserveSerialNo == true) + { + // 回填最大碼(利用MaxSerialNo來確保資料的一致性及使用的序號為唯一) + if (blnInsert) + { + strSQL = "Insert into tblSYSSerialCreateMax " + " (SerialType,SerialString,SerialLength,DecimalType,MaxSerialNo) " + " Values('" + SerialType + "','" + SerialString + "'," + SerialLength + "," + DecimalType + "," + lngSerialNo_Last + ")"; + colSQL.Add(strSQL); + colSQL_Rows.Add(1); + } + else + { + strSQL = "Update tblSYSSerialCreateMax Set MaxSerialNo=" + lngSerialNo_Last + " Where SerialType='" + SerialType + "'" + " And SerialString='" + SerialString + "'" + " And SerialLength=" + SerialLength + " And DecimalType=" + DecimalType + " And MaxSerialNo=" + lngMaxSerialNo; + colSQL.Add(strSQL); + colSQL_Rows.Add(1); + } + + ExecuteSQLNoneQuery_ChkRowCount(Convert.ToString(strDataBaseType), strConnectionString, colSQL, colSQL_Rows); + } + + for (int i = 1, loopTo = (int)SerialCount; i <= loopTo; i++) + { + if (PadLeft == 0) + { + if (DecimalType == 1) + { + arySerial.Add((lngMaxSerialNo + i).ToString()); + } + else if (DecimalType == 2) + { + arySerial.Add(Tran10_16(lngMaxSerialNo + i).ToString()); + } + else if (DecimalType == 3) + { + arySerial.Add(Tran10_36(lngMaxSerialNo + i).ToString()); + } + + // 86774: [6.0.5] 序號規則新增34進位序號 + // ===================================== 86774 Start ===================================== + else if (DecimalType == 4) + { + arySerial.Add(Tran10_34(lngMaxSerialNo + i).ToString()); + // ===================================== 86774 End ===================================== + } + } + else if (DecimalType == 1) + { + arySerial.Add((lngMaxSerialNo + i).ToString().PadLeft(SerialLength, '0')); + } + else if (DecimalType == 2) + { + arySerial.Add(Tran10_16(lngMaxSerialNo + i).ToString().PadLeft(SerialLength, '0')); + } + else if (DecimalType == 3) + { + arySerial.Add(Tran10_36(lngMaxSerialNo + i).ToString().PadLeft(SerialLength, '0')); + } + + // 86774: [6.0.5] 序號規則新增34進位序號 + // ===================================== 86774 Start ===================================== + else if (DecimalType == 4) + { + arySerial.Add(Tran10_34(lngMaxSerialNo + i).ToString().PadLeft(SerialLength, '0')); + // ===================================== 86774 End ===================================== + } + } + + // 回傳最大碼 + if (arySerial.Count > 0) + { + funExeSerialCreate_SerialRet = arySerial[0].ToString(); + } + else + { + funExeSerialCreate_SerialRet = null; + } + } + + catch (Exception e1) + { + funExeSerialCreate_SerialRet = null; + throw; + } + finally + { + CloseConnection(cnnTemp); + } + + return funExeSerialCreate_SerialRet; + + } + + /// + /// 拼接异常信息:Message + StackTrace,用于日志/输出 + /// + public static string GetExceptionFullMessage(Exception ex) + { + if (ex == null) + return "无异常信息"; + + return $"异常信息:{ex.Message} 堆栈信息:{ex.StackTrace}"; + } + #endregion + + #region "工单砍单、取消卡控接口" + public static bool funCheckMONoCanEditCancel_M(ref List aryMessage, ref List aryException, ref decimal InputQty, ref decimal OutputQty, ref string CurrentStatus, string MONo, decimal decQuantity, int intStatus) + { + bool funCheckMONoCanEditCancel_M = default(bool); + //bool r = false; + string strSQL = default(string); + IDbConnection cnnTemp = null; + DbDataReader drTemp = null; + + AppSettings objSetting = new AppSettings(); + + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + DataSet dsData = new DataSet(); + + + + string strReturn = ""; + + var ReleaseQty = default(decimal); + + kcWIP.clsLot objLot = new kcWIP.clsLot(); + DataRow drOE = null; + try + { + + //标准基础检查 + using (var objOE = new clsOEBasis()) + { + + drOE = objOE.GetMOBasis(MONo.ToUpper()); + if (drOE["MONo"] is DBNull == true) + { + //clsERP.combineException(aryException, mesmsg: "[%MONo%]:" + drOE["MONo"] + " [%MONoNotExist%]"); + //break; + + //throw new Exception("工单号不存在"); + + clsERP.combineMessage(ref aryMessage, mmsg: "[%工单号不存在!%]"); + return false; + } + + // 如果MES這邊是不使用IssueState = -1, 也要可以改,以EPR那邊為主, + if (!(drOE["MOState"] is DBNull)) + { + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drOE["MOState"], 99, false))) + { + //clsERP.combineException(aryException, mesmsg: "[%MONo%]:" + drOE["MONo"] + " [%MONoClosed%]"); + //break; + + //throw new Exception("工单状态已经结案!"); + + clsERP.combineMessage(ref aryMessage, mmsg: "[%工单状态已经结案!%]"); + return false; + } + + + } + + // ----- 3. 檢查MO剩餘數量 ----- + if (!(drOE["MOQty"] is DBNull)) + { + ReleaseQty = Convert.ToDecimal(Operators.SubtractObject(drOE["MOQty"], drOE["UnReleaseLotQty"])); + if (decQuantity > ReleaseQty && intStatus == 0) + { + //clsERP.combineException(aryException, mesmsg: "[%MONo%]:" + + // drOE["MONo"] + " [%MOQtyLessThenReleaseLotQty%]"); + //break; + + //throw new Exception("砍单数量小于现在工单未下线数量!"); + + clsERP.combineMessage(ref aryMessage, mmsg: "[%砍单数量大于现在工单未下线数量/工单数量!%]"); + return false; + } + } + + } + + //如当前设置A站点前可以砍单/取消,可以手动变更为B站点前可以砍单/取消;在作业站属性中配置标识:Delflag(只针对线上的生产批) + //找到目前线上的生产批 + + strSQL = $"SELECT A.BASELOTNO,B.STATUS,B.LotStamp FROM TBLWIPLOTBASIS A INNER JOIN TBLWIPLOTSTATE B ON A.BASELOTNO = B.LOTNO WHERE A.MONO='{MONo}' AND B.STATUS IN (0,1,2,3,4,5) AND A.LotState = '1'"; + ExecuteSQLQuery_Adapter(strSQL, dsData, "TBLWIPLOTBASIS", cnnTemp); + + if (dsData.Tables["TBLWIPLOTBASIS"].Rows.Count > 0) + { + //有线上生产批 + //检查线上生产批是否过了有 【在作业站属性中配置标识:Delflag】 + + //拼接成IN语句 + string strLotNo = ""; + foreach (DataRow dr in dsData.Tables["TBLWIPLOTBASIS"].Rows) + { + strLotNo += "'" + dr["BASELOTNO"] + "',"; + } + strLotNo = strLotNo.Substring(0, strLotNo.Length - 1); + + strSQL = $@"SELECT 1 +FROM DUAL +WHERE EXISTS ( + SELECT 1 + FROM TBLOPPROPERTY A + INNER JOIN TBLOPBASIS B + ON A.OPNO = B.OPNO AND B.ISSUESTATE = 2 + INNER JOIN TBLWIPLOTLOG C + ON C.OPNO = B.OPNO AND C.STATUS = 1 + WHERE A.PROPERTYNO = 'Delflag' + AND A.ISSUESTATE = 2 + AND C.LOTNO IN ({strLotNo}) +)"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + //存在,说明过了特殊站点,不能变更 + clsERP.combineMessage(ref aryMessage, mmsg: "[%线上生产批已经过了带有Delflag站点,不能变更!%]"); + return false; + } + else + { + //不存在,说明没有过特殊站点,可以变更 + + //可以变更,先将线上的生产批全部wait,顾问说一搬流程就是 一个批,这里直接调用标准wait + foreach (DataRow dr in dsData.Tables["TBLWIPLOTBASIS"].Rows) + { + //如果是 STATUS 字段是 3或者4则,则不wait + if (Convert.ToInt32(dr["STATUS"]) == 3 || Convert.ToInt32(dr["STATUS"]) == 4) + { + continue; + } + else + { + int intLotStamp = dr["LotStamp"].ToString().Trim() == "" ? 0 : Convert.ToInt32(dr["LotStamp"]); + + //wait + objLot.SetLotStateToWait(LotStamp: intLotStamp, dr["BASELOTNO"].ToString(), + WaitType: 2, UserNo: "ERP", WaitSource: 0, WaitDescription: "砍单接口立即暂停所有批次"); + } + } + + + + } + drTemp.Close(); + } + + + //若是成功,返回 工单投入、产出数量 、工单状态工单状态 + if (drOE != null) + { + //工单投入(InputQty) = 工单数量(MOQTY) - 未下线数量(UNRELEASELOTQTY) + if (!(drOE["MOQty"] is DBNull) && !(drOE["UnReleaseLotQty"] is DBNull)) + { + //使用三元运算符转换工单数量和未下线数量,防止出现空值报错 + decimal MOQty = Convert.ToDecimal(drOE["MOQty"] is DBNull ? 0 : drOE["MOQty"]); + decimal UnReleaseLotQty = Convert.ToDecimal(drOE["UnReleaseLotQty"] is DBNull ? 0 : drOE["UnReleaseLotQty"]); + InputQty = MOQty - UnReleaseLotQty; + + } + + //产出数量 OnputQty MOFINISHQTY + decimal MOFINISHQTY = Convert.ToDecimal(drOE["MOFINISHQTY"] is DBNull ? 0 : drOE["MOFINISHQTY"]); + OutputQty = MOFINISHQTY; + + //工单状态 根据 MOSTATE判断,赋值给CurrentStatus + + // 工单状态 + //0:未确认 + //1:确认中 + //2:已确认 + //3:生产中 + //4:已在客托仓或退货仓 + //99:结案 + + int MOSTATE = Convert.ToInt32(drOE["MOSTATE"] is DBNull ? 0 : drOE["MOSTATE"]); + switch (MOSTATE) + { + case 0: + CurrentStatus = "未确认"; + break; + case 1: + CurrentStatus = "确认中"; + break; + case 2: + CurrentStatus = "已确认"; + break; + case 3: + CurrentStatus = "生产中"; + break; + case 4: + CurrentStatus = "已在客托仓或退货仓"; + break; + case 99: + CurrentStatus = "结案"; + break; + default: + CurrentStatus = "未知状态"; + break; + } + + } + + + funCheckMONoCanEditCancel_M = true; + exitfun: + ; + } + catch (Exception ex) + { + // 一行调用,拿到完整异常字符串 + string errorMsg = GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + if (objLot != null) + { + objLot.Dispose(); + } + + + drTemp?.Close(); + + dsData?.Dispose(); + CloseConnection(cnnTemp); + } + return funCheckMONoCanEditCancel_M; + + } + + + + + + + + #endregion + + #region"Mapping反转" + public static bool funGetPrdMapping(ref List aryMessage, ref List aryException, string Productid, string Eqp_id, ref int REVERSALMETHOD) + { + bool funGetPrdMappingref = false; + string strSQL = default(string); + IDbConnection cnnTemp = null; + DbDataReader drTemp = null; + + AppSettings objSetting = new AppSettings(); + + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + + DataSet dsData = new DataSet(); + + + + + try + { + strSQL = "select d.* from TBLWIPPRDSTATE_LQ a inner join TBLWIPLOTSTATE b on a.LotNo=b.LotNo inner join TBLWIPLOTBASIS c on b.LotNo=c.BaseLotNo inner join TBLPRDMAPPING_LQ d on d.OPNO=b.OPNO and d.ProductNo=c.ProductNo where a.productid ='" + Productid + "'and a.state = '1'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + REVERSALMETHOD = Convert.ToInt16(drTemp["REVERSALMETHOD"].ToString()); + funGetPrdMappingref = true; + } + else + { + throw new Exception("产品作业站未配置反转方式!"); + } + drTemp.Close(); + } + catch (Exception ex) + { + // 一行调用,拿到完整异常字符串 + string errorMsg = GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + dsData?.Dispose(); + CloseConnection(cnnTemp); + } + return funGetPrdMappingref; + + } + + public static bool funGetMaterialhold(ref List aryMessage, ref List aryException, string source, string materialno, string materiallotno, string holdstate, string creator, string date, string reasonno) + { + bool funGetPrdMappingref = false; + string strSQL = default(string); + IDbConnection cnnTemp = null; + DbDataReader drTemp = null; + + AppSettings objSetting = new AppSettings(); + + Collection CollectionSQL = new Collection(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + + DataSet dsData = new DataSet(); + + + string MaterialFrom; + + try + { + if (materiallotno == "*") + { + materiallotno = "ALL"; + } + if (holdstate == "0") + { + + if (source == "0") + { + //工单 + MaterialFrom = "工单"; + strSQL = "select * from TBLOEMOMATERIALSTATE WHERE MaterialNo='" + materialno + "' AND QTY>0"; + if (!string.IsNullOrWhiteSpace(materiallotno) && !materiallotno.Equals("ALL", StringComparison.OrdinalIgnoreCase) && !materiallotno.Equals("*", StringComparison.OrdinalIgnoreCase)) + { + strSQL += " AND MaterialLotNo ='" + materiallotno + "'"; + + } + } + else + { + MaterialFrom = "虚拟库"; + strSQL = "select * from TBLINVWIPINVENTORY_RAW WHERE MaterialNo='" + materialno + "' AND QTY>0"; + if (!string.IsNullOrWhiteSpace(materiallotno) && !materiallotno.Equals("ALL", StringComparison.OrdinalIgnoreCase) && !materiallotno.Equals("*", StringComparison.OrdinalIgnoreCase)) + { + strSQL += " AND MaterialLotNo ='" + materiallotno + "'"; + + } + } + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + + strSQL = "INSERT INTO TBLCUSHOLDMATERIALSTATE ( MATERIALFROM , MATERIALNO , MATERIALLOTNO , REASONNO , CREATOR ) VALUES ('" + MaterialFrom + "', '" + materialno + "', '" + materiallotno + "', '" + reasonno + "', '" + creator + "')"; + CollectionSQL.Add(strSQL); + strSQL = "INSERT INTO TBLCUSHOLDMATERIALLOG ( MATERIALFROM , MATERIALNO , MATERIALLOTNO , HOLDSTATE , REASONNO , CREATOR) VALUES ('" + MaterialFrom + "', '" + materialno + "', '" + materiallotno + "',1, '" + reasonno + "', '" + creator + "')"; + CollectionSQL.Add(strSQL); + } + else + { + throw new Exception("物料不存在或数量不足!"); + + } + drTemp.Close(); + } + else + { + DataTable dtdata = new DataTable(); + if (source == "0") + { + //工单 + MaterialFrom = "工单"; + } + else + { + MaterialFrom = "虚拟库"; + } + strSQL = "select * from TBLCUSHOLDMATERIALSTATE where 1=1 "; + if (materiallotno != "*") + { + strSQL += " AND MaterialNo='" + materialno + "'"; + } + if (MaterialFrom != "*") + { + strSQL += " AND MaterialFrom='" + MaterialFrom + "'"; + } + if ( reasonno != "ERPhold") + { + strSQL += " AND REASONNO='" + reasonno + "'"; + } + if (materiallotno != "*") + { + strSQL += " AND MaterialLotNo='" + materiallotno + "'"; + } + else + { + strSQL += " AND MaterialLotNo='ALL'"; + } + ExecuteSQLQuery_Adapter(strSQL, dtdata, cnnTemp); + + if (dtdata.Rows.Count == 0) + { + throw new Exception("物料未被Hold!"); + } + foreach (DataRow dr in dtdata.Rows) + { + strSQL = "delete from TBLCUSHOLDMATERIALSTATE where MaterialNo='" + dr["MATERIALNO"] + "' AND MaterialFrom='" + dr["MaterialFrom"] + "' AND REASONNO='" + dr["REASONNO"] + "' AND MaterialLotNo='" + dr["MaterialLotNo"] + "' AND Creator='" + dr["Creator"] + "'"; + CollectionSQL.Add(strSQL); + strSQL = "INSERT INTO TBLCUSHOLDMATERIALLOG ( MATERIALFROM , MATERIALNO , MATERIALLOTNO , HOLDSTATE , REASONNO , CREATOR) VALUES ('" + dr["MaterialFrom"] + "', '" + dr["MATERIALNO"] + "', '" + dr["MaterialLotNo"] + "',0, '" + dr["REASONNO"] + "', '" + creator + "')"; + CollectionSQL.Add(strSQL); + } + + } + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + funGetPrdMappingref=true; + } + catch (Exception ex) + { + // 一行调用,拿到完整异常字符串 + string errorMsg = GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + dsData?.Dispose(); + CloseConnection(cnnTemp); + } + return funGetPrdMappingref; + + } + + #endregion + + #region"钢片绑定" + public static bool funSteelBind(ref List aryMessage, ref List aryException, + string equipmentno, string steelno, string carrierno, ref string lotno) + { + bool result = false; + IDbConnection cnnTemp = null; + DataSet dsTemp = new DataSet(); + AppSettings objSetting = new AppSettings(); + try + { + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + + // 1. 根据设备编号查询 TBLWIPTEMP_Equipment 获取 LotNo + cnnTemp = CreateConnection(strConnectionString); + string strSQL; + lotno = carrierno; + + // 2. 检查钢片是否已被绑定(被其他批次占用) + dsTemp.Tables.Clear(); + strSQL = string.Format("SELECT STEELNO, LOTNO, STEELSTATE FROM TBLCUSSTEELSTATE WHERE STEELNO = '{0}'", steelno); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "tblSteel", cnnTemp); + + if (dsTemp.Tables["tblSteel"].Rows.Count > 0) + { + string existLotNo = dsTemp.Tables["tblSteel"].Rows[0]["LOTNO"].ToString(); + if (!string.IsNullOrEmpty(existLotNo) && existLotNo != lotno) + { + throw new Exception("钢片已被绑定:" + steelno); + } + } + + // 3. 检查该批次是否已绑定其他钢片,有则先解绑 + dsTemp.Tables.Clear(); + strSQL = string.Format("SELECT STEELNO FROM TBLCUSSTEELSTATE WHERE LOTNO = '{0}' AND STEELSTATE = '1' AND STEELNO != '{1}'", lotno, steelno); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "tblOldSteel", cnnTemp); + + var CollectionSQL = new Collection(); + foreach (DataRow dr in dsTemp.Tables["tblOldSteel"].Rows) + { + string oldSteelNo = dr["STEELNO"].ToString(); + CollectionSQL.Add(string.Format("UPDATE TBLCUSSTEELSTATE SET LOTNO = '', STEELSTATE = '0' WHERE STEELNO = '{0}'", oldSteelNo)); + CollectionSQL.Add(string.Format("INSERT INTO TBLCUSSTEELLOG(STEELNO, LOTNO, STEELSTATE, CREATOR, CREATDATE) VALUES('{0}', '{1}', '0', 'DS', SYSDATE)", oldSteelNo, lotno)); + } + + // 4. 绑定新钢片 + CollectionSQL.Add(string.Format("UPDATE TBLCUSSTEELSTATE SET LOTNO = '{0}', STEELSTATE = '1' WHERE STEELNO = '{1}'", lotno, steelno)); + CollectionSQL.Add(string.Format("INSERT INTO TBLCUSSTEELLOG(STEELNO, LOTNO, STEELSTATE, CREATOR, CREATDATE) VALUES('{0}', '{1}', '1', 'DS', SYSDATE)", steelno, lotno)); + + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + + result = true; + } + catch (Exception ex) + { + string errorMsg = GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + CloseConnection(cnnTemp); + dsTemp?.Dispose(); + } + + return result; + } + #endregion + + #region" 产品BOM信息接口" + // OPNO,NODENO,STDQTY,DECREASERATE,SUBMTL + public static bool GetProdBOMInfo(ref List aryMessage, ref List aryException, string PRODUCTNO = defString, + string PRODUCTVERSION = defString, BomRequest bomRequest = null) + { + // tcEAI_C.clsERP.AddUser(ref strMessage, ref strException, PRODUCTNO, PRODUCTNAME, PRODUCTVERSION, CREATOR, CREATEDATE, dtDPPara); + bool result = false; + + // int i, j; + string strSQLAddField, strSQLAddValue; + Collection MTLCollection = new Collection(); + Collection CollectionSQL = new Collection(); + + + string strSQL = ""; + + IDbConnection cnnTemp = null; + DbDataReader drTemp, drTemp1; + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + + bool blnAdd = false; ; + + try + { + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + try + { + + //add by 14166 for 产品已核准 则不允许进行参数收集 + strSQL = " SELECT * FROM TBLPRDPRODUCTBASIS WHERE PRODUCTNO='" + PRODUCTNO + "' And PRODUCTVERSION='" + PRODUCTVERSION + "' "; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + //if (Convert.ToInt32(drTemp["ISSUESTATE"]) == 2) + //{ + // clsERP.combineException(ref aryException, null, null, "[%产品编号:" + PRODUCTNO + " ,产品版本:" + PRODUCTVERSION + " 产品已核准,不允许产品Bom信息收集!%]"); + // // goto exitfun; + //} + + } + else + { + //手动增加一个产品主档 + strSQL = "INSERT INTO TBLPRDPRODUCTBASIS (PRODUCTNO,PRODUCTVERSION,PRODUCTNAME,PRODUCTTYPE,ISSUESTATE,\r\n CREATOR,CREATEDATE,DESCRIPTION,CURVERSION, UNITNO, UNITTYPE, SPECNO,CARTONQTY,PALLETQTY,BOXQTY,LOTSTDQTY, CUSTOMERNO , DEVICENO , ECNCONTROL , BATCHECNLOCK , DATASTAMP , UNITID , PANLEID ) VALUES ('"+ PRODUCTNO +"', '"+ PRODUCTVERSION +"', '"+ PRODUCTNO +"', 'null', '0', 'ERP',sysdate, 'ERP新增', '1', '', '', 'N/A', '0', '0', '0', '0','N/A', 'N/A', 'N', '0', '0', '','')"; + CollectionSQL.Add(strSQL); + // clsERP.combineException(ref aryException, null, null, "[%产品编号:" + PRODUCTNO + " ,产品版本:" + PRODUCTVERSION + " 产品不存在,不允许产品Bom信息收集!%]"); + //goto exitfun; + } + drTemp.Close(); + + + + // ----- Exception => Fail ----- + + foreach (Bomlist dr in bomRequest.Bomlist) + { + int NodeType = 0, PUTINPLACETYPE = 0; + string UnitNo = defString, NODEVERSION = defString; + + + strSQL = "delete from TBLPRDBOM where ProductNo='" + PRODUCTNO + "' and PRODUCTVERSION='" + PRODUCTVERSION + "' and NodeNo='" + dr.MaterialNo.ToString() + "' and OPNO='" + dr.OpNo.ToString() + "'"; + CollectionSQL.Add(strSQL); + strSQL = "delete from TBLPRDBOMMATERIALGROUP where ProductNo='" + PRODUCTNO + "' and PRODUCTVERSION='" + PRODUCTVERSION + "' and NodeNo='" + dr.MaterialNo.ToString() + "' and OPNO='" + dr.OpNo.ToString() + "'"; + CollectionSQL.Add(strSQL); + + strSQL = " SELECT * FROM TBLPRDPRODUCTBASIS WHERE PRODUCTNO='" + dr.MaterialNo.ToString() + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + //说明是半成品物料 + NodeType = 1; + PUTINPLACETYPE = 4; + UnitNo = drTemp["UnitNo"].ToString(); + NODEVERSION = "*"; + } + else + { + //再检查是不是物料 + strSQL = " SELECT * FROM TBLMTLMATERIALBASIS WHERE MATERIALNO='" + dr.MaterialNo.ToString() + "'"; + drTemp1 = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp1.Read()) + { + NodeType = 0; + PUTINPLACETYPE = 2; + UnitNo = drTemp1["UnitNo"].ToString(); + NODEVERSION = "N/A"; + } + else + { + throw new Exception("[%NODENO:" + dr.MaterialNo.ToString() + " 既不是半成品也不是物料,信息错误!%]"); + + //goto exitfun; + } + drTemp1.Close(); + } + drTemp.Close(); + strSQL = "INSERT INTO TBLPRDBOM (PRODUCTNO, PRODUCTVERSION, NODENO, NODETYPE, STDQTY, UNITNO, DECREASERATE, OPNO, SPECIFIED, CREATOR, CREATEDATE, NODEVERSION, PUTINPLACETYPE,AB,PositionCode) " + + "VALUES('" + PRODUCTNO + "', '" + PRODUCTVERSION + "', '" + dr.MaterialNo.ToString() + "', '" + NodeType + "', '" + dr.StdQty.ToString() + "', '" + UnitNo + "', '" + dr.DecreaseRate.ToString() + "', '" + dr.OpNo.ToString() + "', '0', 'ERP', sysdate, '" + NODEVERSION + "', '" + PUTINPLACETYPE + "', '" + dr.AB.ToString() + "', '" + dr.PositionCode.ToString() + "')"; + CollectionSQL.Add(strSQL); + + + if (!string.IsNullOrEmpty(dr.SubstituteMaterialNo.ToString()) && NodeType == 0) + { + string[] SUBMTLS = dr.SubstituteMaterialNo.ToString().Split(','); + for (int i = 0; i < SUBMTLS.Length; i++) + { + strSQL = "INSERT INTO TBLPRDBOMMATERIALGROUP (PRODUCTNO, PRODUCTVERSION, NODENO, OPNO, MATERIALNO) VALUES('" + PRODUCTNO + "', '" + PRODUCTVERSION + "', '" + dr.MaterialNo + "','" + dr.OpNo.ToString() + "','" + SUBMTLS[i].ToString() + "') "; + CollectionSQL.Add(strSQL); + + } + + } + } + + + // 呼叫執行SQL指令 + ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + result = true; + + + } + catch (Exception ex) + { + // trans.Rollback() + string errorMsg = GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + } + catch (Exception ex) + { + string errorMsg = GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + + + } + catch (Exception ex) + { + string errorMsg = GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + CloseConnection(cnnTemp); + } + + + return result; + } + + #endregion + + + #region + public static bool CheckReelQty(ref List aryMessage, ref List aryException, string reelId, string storageCode, ref string mcode, + ref string qty, ref string vendordate, ref string vendorcode, ref string manufacturer, ref string vendorlotno, ref string snscale, ref bool everExisted) + { + bool CheckReelQty = default(bool); + string strSQL = ""; + + IDbConnection cnnTemp = null; + DbDataReader drTemp, drTemp1; + AppSettings objSetting = new AppSettings(); + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + DataTable dtMaterial = new DataTable(); + //供应商生产日期取自制造日期栏,依WMS送入格式回传YYYYMMDD字串 + //供应商编码、生产厂家、供应商批次、09条码四栏同表取数,栏位由WMS进料写入 + strSQL = $"select MATERIALNO,QTY,To_Char(MANUFACTUREDATE,'YYYYMMDD') as VENDORDATE,VENDORCODE,MANUFACTURER,VENDERLOTNO,SNSCALE from TBLINVWIPINVENTORY_RAW where MATERIALLOTNO = '{reelId}'"; + //仓位有传则以仓别+料卷定位,未传则只以料卷号定位 + if (storageCode != "") + { + strSQL += $" and INVENTORYNO = '{storageCode}'"; + } + ExecuteSQLQuery_Adapter(strSQL, dtMaterial, cnnTemp); + if (dtMaterial.Rows.Count > 0) + { + mcode = dtMaterial.Rows[0]["MATERIALNO"].ToString(); + qty = dtMaterial.Rows[0]["QTY"].ToString(); + vendordate = dtMaterial.Rows[0]["VENDORDATE"].ToString(); + //栏位未写入时为NULL,ToString後即空字串,与既有回传空值行为一致 + vendorcode = dtMaterial.Rows[0]["VENDORCODE"].ToString(); + manufacturer = dtMaterial.Rows[0]["MANUFACTURER"].ToString(); + vendorlotno = dtMaterial.Rows[0]["VENDERLOTNO"].ToString(); + snscale = dtMaterial.Rows[0]["SNSCALE"].ToString(); + everExisted = true; + CheckReelQty = true; + goto exitfun; + } + + //线边仓查无现存量时,再查料卷日志判断该料卷是否曾经存在, + //用以区分「已扣光」与「卷号根本不存在」两种情形 + DataTable dtLog = new DataTable(); + strSQL = $"select count(1) as CNT from TBLINVWIPINVENTORY_RAWLOG where MATERIALLOTNO = '{reelId}'"; + ExecuteSQLQuery_Adapter(strSQL, dtLog, cnnTemp); + if (dtLog.Rows.Count > 0 && Convert.ToDecimal(dtLog.Rows[0]["CNT"]) > 0) + { + everExisted = true; + } + + exitfun: + ; + } + catch (Exception ex) + { + string errorMsg = GetExceptionFullMessage(ex); + throw new Exception(errorMsg); + } + finally + { + CloseConnection(cnnTemp); + } + + + return CheckReelQty; + } + + + #endregion + + + #region MES退料 + /// + /// WMS退料:依REELINFO逐笔扣减线边仓料卷数量,数量不够则清空、不报错 + /// + /// 退料单号 + /// 工单号(仅落客製退料日志备查) + /// 供应仓,对应线边仓的INVENTORYNO + /// 收货仓,仅记录不入账 + /// 料卷明细:REELID/MCODE/QTY + public static bool ReelReturn(ref List aryMessage, ref List aryException, + string mvdCode, string moCode, string fromStorage, string toStorage, + string userCode, string mDate, string mTime, DataTable dtReelInfo) + { + bool ReelReturn = default(bool); + string strSQL = default(string); + IDbConnection cnnTemp = null; + + AppSettings objSetting = new AppSettings(); + var CollectionSQL = new Collection(); + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + //同一料卷可能在REELINFO内出现多笔,须逐笔累加扣减。 + //因所有SQL累积到最后才一次提交,若每笔都回资料库取现存量, + //第二笔会取到未扣减前的数量而少扣,故在内存累计剩余量。 + var dicLeftQty = new Dictionary(); + //以料卷为单位做扣减与快照时,保持 REELINFO 的出现顺序 + var lstKeyOrder = new List(); + var dicMCode = new Dictionary(); + var dicReelId = new Dictionary(); + + try + { + if (dtReelInfo.Rows.Count == 0) + { + throw new Exception("无明细数据!"); + } + + //操作日期与时间为数字栏,未传则存空值 + string strMDate = mDate.Trim() == "" ? "null" : mDate.Trim(); + string strMTime = mTime.Trim() == "" ? "null" : mTime.Trim(); + + for (int i = 0; i <= dtReelInfo.Rows.Count - 1; i++) + { + string strReelId = dtReelInfo.Rows[i]["REELID"].ToString(); + string strMCode = dtReelInfo.Rows[i]["MCODE"].ToString(); + string strKey = fromStorage + "|" + strMCode + "|" + strReelId; + + //请求扣减量 + decimal REQQTY = 0; + if (dtReelInfo.Rows[i]["QTY"].ToString() != "") + { + REQQTY = Convert.ToDecimal(dtReelInfo.Rows[i]["QTY"]); + } + if (REQQTY <= 0) + { + throw new Exception($"{strReelId}扣减数量不能为0或者负数!"); + } + + //现存量:以仓别+物料+料卷三段键定位 + decimal CURQTY = 0; + if (dicLeftQty.ContainsKey(strKey)) + { + CURQTY = dicLeftQty[strKey]; + } + else + { + DataTable dtRaw = new DataTable(); + strSQL = $"select QTY from TBLINVWIPINVENTORY_RAW where INVENTORYNO = '{fromStorage}' and MATERIALNO = '{strMCode}' and MATERIALLOTNO = '{strReelId}'"; + ExecuteSQLQuery_Adapter(strSQL, dtRaw, cnnTemp); + if (dtRaw.Rows.Count == 0) + { + throw new Exception($"{strReelId}在仓位{fromStorage}找不到对应的料卷!"); + } + if (dtRaw.Rows[0]["QTY"].ToString() != "") + { + CURQTY = Convert.ToDecimal(dtRaw.Rows[0]["QTY"]); + } + } + + //数量不够则清空、不用报错:实扣量最多只扣到现存量, + //不套用标准「保留负数」的写法,短扣差额由客製退料日志的请求量与实扣量留证 + decimal REALQTY = REQQTY; + if (REQQTY > CURQTY) + { + REALQTY = CURQTY; + } + decimal LEFTQTY = CURQTY - REALQTY; + dicLeftQty[strKey] = LEFTQTY; + if (!lstKeyOrder.Contains(strKey)) + { + lstKeyOrder.Add(strKey); + dicMCode[strKey] = strMCode; + dicReelId[strKey] = strReelId; + } + + //① 写客製退料日志:逐笔记录请求量与实扣量,供短扣对帐;收货仓仅记录不入账 + strSQL = @"INSERT INTO TBLINVREELRETURNLOG_LQ(MVDCODE, MOCODE, REELID, MCODE, FROMSTORAGE, TOSTORAGE, REQQTY, REALQTY, USERCODE, MDATE, MTIME, EVENTTIME) "; + strSQL += $" VALUES('{mvdCode}','{moCode}','{strReelId}','{strMCode}','{fromStorage}','{toStorage}',{REQQTY},{REALQTY},'{userCode}',{strMDate},{strMTime},To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; + CollectionSQL.Add(strSQL); + } + + //料卷日志与扣减以「料卷」为单位各做一次,不随 REELINFO 逐笔做: + //TBLINVWIPINVENTORY_RAWLOG 的主键是 (INVENTORYNO, MATERIALNO, MATERIALLOTNO, EVENTTIME), + //EVENTTIME 只到秒,同一料卷若在同批内写入多列快照必然撞主键 ORA-00001 + //(规格 2.2 请求样例的 REELINFO 即同一 REELID 连续两笔)。 + //且标准的 RAWLOG 语义本就是「变更后快照」=最终状态一列,故此处只留最终一列。 + foreach (string strKey in lstKeyOrder) + { + string strMCode = dicMCode[strKey]; + string strReelId = dicReelId[strKey]; + decimal LEFTQTY = dicLeftQty[strKey]; + + //② 扣减线边仓现存量(累加扣减后的最终数量) + strSQL = $"UPDATE TBLINVWIPINVENTORY_RAW SET QTY = {LEFTQTY} WHERE INVENTORYNO = '{fromStorage}' AND MATERIALNO = '{strMCode}' AND MATERIALLOTNO = '{strReelId}'"; + CollectionSQL.Add(strSQL); + + //③ 写料卷日志(扣减后整列快照),必须排在删除资料列之前,否则删除后即无从取数 + strSQL = @"INSERT INTO TBLINVWIPINVENTORY_RAWLOG(INVENTORYNO, MATERIALNO, MATERIALLOTNO, UNITNO, QTY, MATERIALTYPE, INPUTDATE,MANUFACTUREDATE,RECEIPTNO,REELID,EXDATE,EVENTTIME,DATECODE) "; + strSQL += " SELECT INVENTORYNO, MATERIALNO, MATERIALLOTNO, UNITNO, QTY, MATERIALTYPE, INPUTDATE,MANUFACTUREDATE,RECEIPTNO,REELID,EXDATE,To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),DATECODE "; + strSQL += $" FROM TBLINVWIPINVENTORY_RAW WHERE INVENTORYNO = '{fromStorage}' AND MATERIALNO = '{strMCode}' AND MATERIALLOTNO = '{strReelId}'"; + CollectionSQL.Add(strSQL); + + //④ 扣光则删除资料列 + if (LEFTQTY <= 0) + { + strSQL = $"DELETE FROM TBLINVWIPINVENTORY_RAW WHERE INVENTORYNO = '{fromStorage}' AND MATERIALNO = '{strMCode}' AND MATERIALLOTNO = '{strReelId}' AND QTY = 0"; + CollectionSQL.Add(strSQL); + } + } + + if (CollectionSQL.Count > 0) + { + ExecuteSQLNoneQuery_UPD(objSetting.GetDataBaseType(), objSetting.GetConnectionString(), CollectionSQL); + } + + ReelReturn = true; + + exitfun: + ; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } + finally + { + CloseConnection(cnnTemp); + } + return ReelReturn; + + } + #endregion + } +} \ No newline at end of file diff --git a/MESEAI/EAItc/clsMDS.cs b/MESEAI/EAItc/clsMDS.cs new file mode 100644 index 0000000..5eb33d4 --- /dev/null +++ b/MESEAI/EAItc/clsMDS.cs @@ -0,0 +1,25 @@ + +namespace tcEAI_C +{ + + public class clsMDS + { + + public string strDataBaseType; + public string strConnectionString; + private udReverse.clsReverse objReverse = new udReverse.clsReverse(); + + // 2003/03/22,sammi. + // 因TC可能呼叫KC,在整個Function中,必須要使用同一個Reverse物件,如此在產生AddReverseUpdateContent的資料時,ReverseOrder才不會重覆. + // 若KC再往下呼叫UD,則必須將Reverse物件傳遞予UD. + public udReverse.clsReverse ReverseObj + { + get + { + return objReverse; + } + } + + + } +} \ No newline at end of file diff --git a/MESEAI/EAItc/clsOE.cs b/MESEAI/EAItc/clsOE.cs new file mode 100644 index 0000000..0cddf1f --- /dev/null +++ b/MESEAI/EAItc/clsOE.cs @@ -0,0 +1,2987 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Runtime.InteropServices; +using kcENT; +using kcMTL; +using kcPRD; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using iMESCore.Settings; +using static iMESCore.Base.iMESComSubroutine; +using static iMESCore.Base.iMESConst; +using static iMESCore.DataBase.iMESSql; +using static iMESCore.Base.iMESComXML; +using iMESCore.DataBase; +using System.Linq; +using System.Collections.ObjectModel; +using kcSYS; +using kcOE; +using kcOP; +using kcSMD; +using System.Xml; +using kcQC; + +namespace tcEAI_C +{ + + public class clsOE + { + + + public clsOE() + { + + + } + + #region MO + + + /// + /// 新增工單 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool addMO(string Orgcode,string OrgMono, string MONo, string MOUnitNo, string ProductNo, decimal MOQty, string FactoryNo, string RONo = null, string ItemNo = null, string CustomerNo = null, + int MOTypeNo = defInteger, int Priority = defInteger, DateTime PlanFinishDate = default(DateTime), string Creator = null, + DateTime CreateDate = default(DateTime), string Description = null, DataTable dtMTL = null, List MOProperty = null, List aryMessage = null, List aryException = null, + List aryAlert = null, DataTable dtMOProperty = null, string ERPMOLineNo = defString, string CustomerLotNo = null, DateTime PlanStartDate = default(DateTime), int wipEntityId = defInteger, string bomVersion = null, string lcPlantype = null, string faiFlag = null) + { + bool addMORet = default(bool); + + bool r = false; + string strSQLTemp, strSQL = default(string), strSQLAddField, strSQLAddValue; + IDbConnection cnnTemp1 = null; + //OleDbCommand cmmTemp; + DbDataReader drTemp2; + DbDataReader drTemp3; + // Dim daTemp As OleDb.OleDbDataAdapter + // Dim drSel() As DataRow + // Dim strDataBaseType, strConnectionString As String 'Connection string + // Dim i As Integer + // Dim dsTemp As DataSet + AppSettings objSetting = new AppSettings(); + var CollectionSQL = new Collection(); + + try + { + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp1 = CreateConnection(strConnectionString); + + // ----- Default Value ----- + int MOSource = 0; // 0: RO, 1: RMA, 2: None + int MOState = 0; // 0: Unconfirm, 1: Pending, 2: Confirm, 3: Release(允許開立生產批), 6: 已在客託倉或退貨倉的工單(允許開立生產批), 99:Close + int IssueState = 0; + string BelongToMONo = "N/A"; + string ENGNo = "N/A"; + string ENGVersion = "N/A"; + //string CustomerLotNo = string.Empty; + // Dim OPNo As String = "LOTCREATE" + + // ---- Get Value ----- + string CustomerName = string.Empty; + string ProductVersion = string.Empty; + string ProcessNo = string.Empty; + string ProcessVersion = string.Empty; + + bool isROExist = false; + bool isRODetailExist = false; + + string ItemProperty = defString; // 2016-10-17, Joe, 新增料件屬性,P:採購件,M:自製件,S:外包件 + int OutSourcingFlag = defInteger; // 2016-10-17, Joe, 0:off,1:on + + // Kevin 15/06/09 ,調整產品編號轉大寫,後續的程式處理並未全部都有轉大寫 + ProductNo = ProductNo.ToUpper(); + + // ----- 1. 檢查MO是否存在 ----- + + MONo = MONo.ToUpper(); + + using (var objOE = new clsOEBasis()) + { + if (objOE.GetMOBasis(MONo.ToUpper())["MONo"] is DBNull == false) + clsERP.combineException(ref aryException, mesmsg: "[%MONoExist%]"); + } + + // ----- 2. 檢查MOSource----- + if (string.IsNullOrEmpty(RONo)) + MOSource = 2; // MO來源為其他(暫不考慮RMA) + + // ----- 3. 檢查CustomerNo是否存在 ----- + if (MOSource == 0) + { + if (string.IsNullOrEmpty(CustomerNo)) + { + // 未傳入 + clsERP.combineException(ref aryException, mesmsg: "[%ROWithOutCustomer%]"); + } + else + { + // 有傳入=>檢查Customer主檔 + using (var objENT = new clsCustomerBasis()) + { + var dr = objENT.GetCustomerBasis(CustomerNo.ToUpper()); + if (dr["CustomerNo"] is DBNull == true) + { + // Customer主檔未建立 + // clsERP.combineException(aryException, , , "[%CustomerNoNotExist%]") + + // 5.3 若拋入訂單號碼,則必須拋入客戶編號,系統應檢查tblENTCustomerBasis之中是否存在此客戶,若無則自動新增 + objENT.AddCustomerBasis(CustomerNo.ToUpper(), CustomerNo, CustomerNo, "NULL", "NULL", "NULL", "NULL", "NULL", "NULL"); + objENT.SetCustomerBasisIssueState(CustomerNo.ToUpper(), 2); + } + else + { + CustomerName = dr["CustomerName"].ToString(); + } + } + } + } + + // ----- 4. 檢查Product ----- + using (var objPRD = new clsProduct()) + { + var dr = objPRD.GetProduct(ProductNo.ToUpper()); + if (dr["ProductNo"] is DBNull == true) + clsERP.combineException(ref aryException, mesmsg: "[%ProductNoNotExist%]"); + if (dr["ProductNo"] is DBNull == false && Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(dr["IssueState"], 2, false))) + clsERP.combineException(ref aryException, mesmsg: "[%ProductNoNotApproved%]"); + + // ----- 5. 檢查MOUnitNo ----- + if (dr["ProductNo"] is DBNull == false && dr["UnitNo"].ToString().ToLower() != MOUnitNo.ToLower()) + clsERP.combineException(ref aryException, mesmsg: "[%ProductMOWithDifferentUnitNo%]"); + dr.Delete(); + + try + { + ProductVersion = objPRD.GetProductCurVersion(ProductNo.ToUpper()); + } + catch (Exception ex) + { + clsERP.combineException(ref aryException, mesmsg: "[%GetProductVersionFail%]"); + } + + // 2016-10-17, Joe, 取得ItemProperty + var drItemProperty = objPRD.GetProductProperty(ProductNo, ProductVersion, "ItemProperty"); + if (drItemProperty == null == false && drItemProperty["DefaultValue"] is DBNull == false) + { + ItemProperty = drItemProperty["DefaultValue"].ToString(); + } + // 2016-10-17, Joe, 取得外包控制 + using (var objSYS = new clsSYSParameter()) + { + OutSourcingFlag = Conversions.ToInteger(objSYS.GetParameterValue("OutSourcingFlag")); + } + // 2016-10-17, Joe, 若該產品品號屬性屬於S且外包控管參數為Off時,MES不做工單新增/修改,直接回應OK,但訊息應回傳『MES系統不支持外包工單』 + if (ItemProperty == "S" & OutSourcingFlag == 0) + { + // 2018/06/26 Lena, 修正訊息語系未譯的問題. + clsERP.combineException(ref aryException, mesmsg: "[%ProductNo%]:" + ProductNo + ",[%ProductVersion%]:" + ProductVersion + ",[%IsOutSourcingProduct%], MES [%IsNotSupported%] !"); + if (aryException.Count > 0) + goto exitfun; + } + + // ----- 6. 檢查ProductProcess是否存在 ----- + // 2012/07/26, Aaron, 如果傳入的MOTypeNo找不到就用-1(*)找尋預設值,再找不到彈出錯誤 + dr = objPRD.GetProductProcess(ProductNo.ToUpper(), ProductVersion, MOTypeNo, DefaultProcess: 1); + if (dr["ProductNo"] is DBNull == true) + { + dr = objPRD.GetProductProcess(ProductNo.ToUpper(), ProductVersion, -1, DefaultProcess: 1); + if (dr["ProductNo"] is DBNull == true) + clsERP.combineException(ref aryException, mesmsg: "[%ProductProcessNoNotExist%]"); + } + } + + // ----- 7. 檢查用料清單資料 ----- + var objPRD_M = new kcPRD.clsProduct(); + DataView dvTemp; + var objMTL = new kcMTL.clsMTLBasis(); + var dsBOM = new DataSet(); + DataRow drData; + + System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); // 用以讀取Xml字串 + + // 工單用料表 + var dtMOBom = new DataTable("MOBom"); + dtMOBom.Columns.Add("MONo", Type.GetType("System.String")); + dtMOBom.Columns.Add("MaterialLevel", Type.GetType("System.Int32")); // 0:Material,1:Product + dtMOBom.Columns.Add("MaterialNo", Type.GetType("System.String")); + dtMOBom.Columns.Add("MaterialVersion", Type.GetType("System.String")); + dtMOBom.Columns.Add("StdQty", Type.GetType("System.Double")); + dtMOBom.Columns.Add("DecreaseRate", Type.GetType("System.Double")); + dtMOBom.Columns.Add("UnitNo", Type.GetType("System.String")); + dtMOBom.Columns.Add("OPNo", Type.GetType("System.String")); + dtMOBom.Columns.Add("PutInPlaceType", Type.GetType("System.Int32")); + dtMOBom.Columns.Add("Specified", Type.GetType("System.Int32")); // 0:No,1:Yes + dtMOBom.Columns.Add("MOFlag", Type.GetType("System.Int32")); // 0:Create MO,1:來自半成品庫,不用開立工單 + dtMOBom.Columns.Add("MaterialMONo", Type.GetType("System.String")); // 半成品的工單編號 + dtMOBom.Columns.Add("Description", Type.GetType("System.String")); // Bom Material Description + dtMOBom.Columns.Add("SubstituteMaterialNo", Type.GetType("System.String")); // 替代料,預設值同MaterialNo + dtMOBom.Columns.Add("SubstituteMaterialLevel", Type.GetType("System.Int32")); // 替代料等級,預設值同物料等級(materialLevel) + dtMOBom.Columns.Add("SubstituteStdQty", Type.GetType("System.Decimal")); // 替代料標準數量,預設值=標準數量StdQty + dtMOBom.Columns.Add("RequireQty", Type.GetType("System.Decimal")); // 需求數,預設值=工單數量MoQty * 標準數StdQty + dtMOBom.Columns.Add("AB", Type.GetType("System.String")); // 需求數,預設值=工單數量MoQty * 標準數StdQty + dtMOBom.Columns.Add("PositionCode", Type.GetType("System.String")); // 需求數,預設值=工單數量MoQty * 標準數StdQty + + + // 1.工單的單位可能與用料表(tblOEMOMaterialList)的標準單位(產品的單位)不同---------------------------------------------------- + // 故須以工單數量,單位換算出產品的標準量 + DataRow drTemp; + string strStdUnitNo; + double dblStdQty; + + // 工單開立,產品不一定是CurVersion. + drTemp = objPRD_M.GetProduct(ProductNo, ProductVersion, CurVersion: defInteger); + if (drTemp["ProductNo"] is DBNull) + { + throw new iMESException.MESException("0000-200002", "Get product data of ProductNo:" + ProductNo + ", Version:" + ProductVersion + " fail !"); + } + + strStdUnitNo = Conversions.ToString(drTemp["UnitNo"]); // 標準單位 + if ((strStdUnitNo.ToUpper() ?? "") == (MOUnitNo.ToUpper() ?? "")) // 單位相同 + { + dblStdQty = Conversions.ToDouble(MOQty); + } + else + { + // 將CurQty轉換為產品標準單位之數量 + udUnitTransferFunction.clsUnitTransferFunction objUnit; + var colParameters = new Collection(); + colParameters.Add(ProductNo, "ProductNo"); + colParameters.Add(ProductVersion, "ProductVersion"); + colParameters.Add(ENGNo, "ENGNo"); + colParameters.Add(ENGVersion, "ENGVersion"); + objUnit = new udUnitTransferFunction.clsUnitTransferFunction(); + dblStdQty = Conversions.ToDouble(objUnit.EXETransferQty(MOUnitNo, strStdUnitNo, Conversions.ToDouble(MOQty), colParameters)); + objUnit = null; + } + decimal DecreaseRate = 0m; + + dsBOM = objPRD_M.ShowBOM(ProductNo, ProductVersion); + var loopTo2 = dsBOM.Tables[0].Rows.Count - 1; + for (int i = 0; i <= loopTo2; i++) + { + drData = dtMOBom.NewRow(); + drData["MONo"] = MONo; + drData["MaterialLevel"] = dsBOM.Tables[0].Rows[i]["NodeType"]; + DecreaseRate = Conversions.ToDecimal(dsBOM.Tables[0].Rows[i]["DecreaseRate"]); // 取得耗損率 + + // 2008/06/17,sammi,投料點來自BOM表的設定. + drData["PutInPlaceType"] = dsBOM.Tables[0].Rows[i]["PutInPlaceType"]; + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dsBOM.Tables[0].Rows[i]["NodeType"], 1, false))) // Product + { + drData["MOFlag"] = 0; + drData["MaterialMONo"] = MONo; + // NodeVersion,取出已轉換的產品版本. + drData["MaterialVersion"] = ProductVersion; + } + else // Material (NodeType = 0) + { + drData["MOFlag"] = 1; + drData["MaterialMONo"] = "N/A"; + drData["MaterialVersion"] = dsBOM.Tables[0].Rows[i]["NodeVersion"]; + } + drData["MaterialNo"] = dsBOM.Tables[0].Rows[i]["NodeNo"]; + drData["SubstituteMaterialNo"] = dsBOM.Tables[0].Rows[i]["NodeNo"]; // 替代料,預設值同MaterialNo + drData["StdQty"] = dsBOM.Tables[0].Rows[i]["StdQty"]; + drData["DecreaseRate"] = dsBOM.Tables[0].Rows[i]["DecreaseRate"]; + drData["UnitNo"] = dsBOM.Tables[0].Rows[i]["UnitNo"]; + drData["OPNo"] = dsBOM.Tables[0].Rows[i]["OPNo"]; + drData["Specified"] = dsBOM.Tables[0].Rows[i]["Specified"]; + drData["Description"] = Strings.Replace(dsBOM.Tables[0].Rows[i]["Description"].ToString(), "'", "''"); + drData["SubstituteMaterialLevel"] = dsBOM.Tables[0].Rows[i]["NodeType"]; // 2012/12/27,Even,替代料等級,預設值為物料等級 + drData["SubstituteStdQty"] = dsBOM.Tables[0].Rows[i]["StdQty"]; // 2012/12/28,Even,替代料標準數,預設值為 標準數 + drData["RequireQty"] = Operators.MultiplyObject(Operators.MultiplyObject(MOQty, dsBOM.Tables[0].Rows[i]["StdQty"]), 1m + DecreaseRate); // 2012/12/27,Even,需求數,預設值為工單數 * 標準數 + drData["AB"] = dsBOM.Tables[0].Rows[i]["AB"].ToString(); + drData["PositionCode"] = dsBOM.Tables[0].Rows[i]["PositionCode"].ToString(); + dtMOBom.Rows.Add(drData); + } + + dsBOM.Dispose(); + // Add MO之用料表 + dvTemp = new DataView(dtMOBom); + dvTemp.RowFilter = Conversions.ToString("MONo='" + MONo + "'"); + + var loopTo8 = dvTemp.Count - 1; + for (int j = 0; j <= loopTo8; j++) + { + DecreaseRate = Conversions.ToDecimal(dvTemp[j]["DecreaseRate"]); + decimal decRequireQty = Conversions.ToDecimal(Operators.MultiplyObject(Operators.MultiplyObject(MOQty, dvTemp[j]["StdQty"]), 1m + DecreaseRate)); + + // '2012/12/27,Even,改變需求數 + dvTemp[j].BeginEdit(); + // dvTemp.Table.Rows(j)("RequireQty") = dtMO.Rows(i)("MOQty") * dvTemp.Table.Rows(j)("StdQty") * (1 + DecreaseRate) + dvTemp[j]["RequireQty"] = decRequireQty; + dvTemp[j].EndEdit(); + + AddMOMaterialList(Conversions.ToString(MONo), Conversions.ToString(dvTemp[j]["MaterialNo"]), Conversions.ToInteger(dvTemp[j]["MaterialLevel"]), Conversions.ToDouble(dvTemp[j]["StdQty"]), Conversions.ToDouble(dvTemp[j]["DecreaseRate"]), Conversions.ToString(dvTemp[j]["OPNo"]), Conversions.ToInteger(dvTemp[j]["Specified"]), Conversions.ToInteger(dvTemp[j]["PutInPlaceType"]), Conversions.ToString(dvTemp[j]["UnitNo"]), Conversions.ToInteger(dvTemp[j]["MOFlag"]), Conversions.ToString(dvTemp[j]["MaterialMONo"]), dvTemp[j]["Description"].ToString(), CollectionSQL, MaterialVersion: Conversions.ToString(dvTemp[j]["MaterialVersion"]), SubstituteMaterialNo: Conversions.ToString(dvTemp[j]["MaterialNo"]), SubstituteMaterialLevel: Conversions.ToInteger(dvTemp[j]["SubstituteMaterialLevel"]), RequireQty: Conversions.ToDecimal(dvTemp[j]["RequireQty"]), SubstituteStdQty: Conversions.ToDecimal(dvTemp[j]["SubstituteStdQty"]), Creator: Creator, CreateDate: DateTime.Now, AB:Conversions.ToString(dvTemp[j]["AB"]), PositionCode:Conversions.ToString(dvTemp[j]["PositionCode"])); + + // R1203001 不是指定用料及半成品時才處理替代料 By Acer 2012/03/06 + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dvTemp[j]["Specified"], 0, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dvTemp[j]["MaterialLevel"], 0, false))) + { + var dsSubstitute = new DataSet(); + if (objPRD_M.ShowBOMMaterialGroup(Conversions.ToString(ProductNo), Conversions.ToString(ProductVersion), Conversions.ToString(dvTemp[j]["MaterialNo"]), Conversions.ToString(dvTemp[j]["OPNo"])).Tables[0].Rows.Count > 0) + { + // 處理BOM表中指定的替代料 + dsSubstitute = objPRD_M.ShowBOMMaterialGroup(Conversions.ToString(ProductNo), Conversions.ToString(ProductVersion), Conversions.ToString(dvTemp[j]["MaterialNo"]), Conversions.ToString(dvTemp[j]["OPNo"])); + } + else + { + // 處理物料群組中指定的替代料 + dsSubstitute = objMTL.ShowMaterialSubstitute(Conversions.ToString(dvTemp[j]["MaterialNo"])); + } + + var loopTo9 = dsSubstitute.Tables[0].Rows.Count - 1; + for (int k = 0; k <= loopTo9; k++) + { + // 2012/12/27,Even,處裡替代用料的需求數量,有替代用料,用料清單會除原先清單外再加上替代用料清單 + decimal dblRequireQty = 0m * (1m + DecreaseRate); + + AddMOMaterialList(Conversions.ToString(MONo), Conversions.ToString(dvTemp[j]["MaterialNo"]), Conversions.ToInteger(dvTemp[j]["MaterialLevel"]), Conversions.ToDouble(dvTemp[j]["StdQty"]), Conversions.ToDouble(dvTemp[j]["DecreaseRate"]), Conversions.ToString(dvTemp[j]["OPNo"]), Conversions.ToInteger(dvTemp[j]["Specified"]), Conversions.ToInteger(dvTemp[j]["PutInPlaceType"]), Conversions.ToString(dvTemp[j]["UnitNo"]), Conversions.ToInteger(dvTemp[j]["MOFlag"]), Conversions.ToString(dvTemp[j]["MaterialMONo"]), dvTemp[j]["Description"].ToString(), CollectionSQL, MaterialVersion: Conversions.ToString(dvTemp[j]["MaterialVersion"]), SubstituteMaterialNo: dsSubstitute.Tables[0].Rows[k]["MaterialNo"].ToString(), SubstituteMaterialLevel: Conversions.ToInteger(dvTemp[j]["SubstituteMaterialLevel"]), RequireQty: dblRequireQty, SubstituteStdQty: Conversions.ToDecimal(dvTemp[j]["SubstituteStdQty"]), Creator: Creator, CreateDate: DateTime.Now, AB: Conversions.ToString(dvTemp[j]["AB"]), PositionCode: Conversions.ToString(dvTemp[j]["PositionCode"])); + + } + dsSubstitute = null; + } + + } + #region"注释原收用料清单逻辑 继承 PRDBOM" + + //if (dtMTL.Rows.Count > 0) + //{ + // bool blnWF = false; + // //2023/12/07,Ning,151196: [6.0.7] SDD231107_01-01_WF 工單整合接口調整 + // //取得目前ERP是否為WF + // using (var objSYSPar = new kcSYS.clsSYSParameter()) + // { + // var dsTemp = new DataSet(); + // dsTemp = objSYSPar.ShowERPSetting(ActiveERP: 1); + // if (dsTemp != null && dsTemp.Tables[0].Rows.Count > 0) + // { + // if (dsTemp.Tables[0].Rows[0]["ERP_Name"].ToString().ToUpper() == "WORKFLOW") + // { + // blnWF = true; + // } + // } + // } + + // dtMTL.Columns.Add("MaterialMONo", Type.GetType("System.String")); + // // dtMTL: MONo, MaterialNo, MaterialLevel, StdQty, UnitNo, OPNo, PutInPlaceType, DecreaseRate, Specified, *MaterialType, CountWay, *CheckLotNo, *MaterialVersion, +MaterialMONo, +*SubstituteMaterialNo + + // foreach (DataRow dr in dtMTL.Rows) + // { + // string strMaterialUnit = dr["UnitNo"].ToString(); + // decimal decTemp = 0m; + // try + // { + // if (string.IsNullOrEmpty(dr["MainItem"].ToString())) + // { + // // 未傳入 + // clsERP.combineException(ref aryException, mesmsg: "[%MainItem%]"); + // } + + // //if (string.IsNullOrEmpty(dr["PhantomItem"].ToString())) + // //{ + // // // 未傳入 + // // clsERP.combineException(ref aryException, mesmsg: "[%PhantomItem%]"); + // //} + + // if (string.IsNullOrEmpty(dr["LockRequirement"].ToString())) + // { + // // 未傳入 + // clsERP.combineException(ref aryException, mesmsg: "[%LockRequirement%]"); + // } + + // if (string.IsNullOrEmpty(dr["OperationSeqnum"].ToString())) + // { + // // 未傳入 + // clsERP.combineException(ref aryException, mesmsg: "[%OperationSeqnum%]"); + // } + + // if (blnWF == true) + // { + // if (Conversions.ToInteger(dr["StdQty"]) != Convert.ToDecimal(dr["StdQty"])) //若標準用量有小數, 需以ERP所傳入的該物料的需領用量(RequireQty)/預計產量(MOQty),並以無條件捨去取到小數六位數的值,做為該物料的標準用量 + // { + // decTemp = (Convert.ToDecimal(dr["RequireQty"]) / MOQty) * 1000000; + // decTemp = Math.Floor(decTemp); + // decTemp = decTemp / 1000000; + // dr["StdQty"] = decTemp; + // } + // if (Conversions.ToInteger(dr["SubstituteStdQty"]) != Convert.ToDecimal(dr["SubstituteStdQty"])) //若替代料標準用量有小數同標準用量處理 + // { + // decTemp = (Convert.ToDecimal(dr["RequireQty"]) / MOQty) * 1000000; + // decTemp = Math.Floor(decTemp); + // decTemp = decTemp / 1000000; + // dr["SubstituteStdQty"] = decTemp; + // } + // } + // if (dr["MaterialLevel"].ToString() == "0") + // { + // // 用料清單為物料 + // using (var objMTL = new clsMTLBasis()) + // { + // DataRow drMTL = null; + // bool errorFlag = false; + + // dr["MONo"] = dr["MONo"].ToString().ToUpper(); + + // drMTL = objMTL.GetMaterialBasis(dr["MaterialNo"].ToString().ToUpper()); + // // (skip) MONo, MaterialLevel, STDQty, DecreaseRate, OPNo, Specified, PutinPlaceType, MOFlag, CountWay, Description, OrgMaterialNo, EX_MTLList1, EX_MTLList2, MaterialVersion + + // // MaterialNo + // if (drMTL["MaterialNo"] is DBNull == true) + // { + // errorFlag = true; + // clsERP.combineException(ref aryException, mesmsg: " [%MaterialNo%]:" + + // dr["MaterialNo"] + " [%MaterialNoNotExist%][%InMESSystem%]! [%MaterialLevel%][%IsMaterial%]."); + // goto SkipMaterialList; + // } + // else + // { + // dr["MaterialNo"] = dr["MaterialNo"].ToString().ToUpper(); + // } + + // // UnitNo + // if (drMTL["UnitNo"].ToString().ToLower() != strMaterialUnit.ToLower()) + // { + // // 當用料清單和物料主檔的單位不同時 + // // 單位轉換 + // using (var objUnit = new udUnitTransferFunction.clsUnitTransferFunction()) + // { + // var colParameters = new Collection(); + // colParameters.Add(dr["MaterialNo"].ToString().ToUpper(), "ProductNo"); + // colParameters.Add("*", "ProductVersion"); + + // try + // { + // dr["StdQty"] = Convert.ToDouble(objUnit.EXETransferQty(strMaterialUnit.ToLower(), drMTL["UnitNo"].ToString().ToLower(), Convert.ToDouble(dr["StdQty"]), colParameters)); + // dr["SubstituteStdQty"] = Convert.ToDouble(objUnit.EXETransferQty(strMaterialUnit.ToLower(), drMTL["UnitNo"].ToString().ToLower(), Convert.ToDouble(dr["SubstituteStdQty"]), colParameters)); + + // dr["UnitNo"] = drMTL["UnitNo"].ToString().ToLower(); + // } + // catch (Exception ex) + // { + // errorFlag = true; + // clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitNoDifferent%]" + " [%MaterialNo%]:" + + // dr["MaterialNo"]); + // clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitTransferFail%]" + " " + ex.Message); + // } + // } + // } + // else + // { + // dr["UnitNo"] = dr["UnitNo"].ToString().ToLower(); + // } + + // // MaterialMONo (Default) + // dr["MaterialMONo"] = "N/A"; + + // // MaterialType + // if (dr["MaterialType"] is DBNull == true) + // { + // dr["MaterialType"] = drMTL["MaterialType"]; + // } + // else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dr["MaterialType"].ToString().ToUpper(), drMTL["MaterialType"], false))) + // { + // dr["MaterialType"] = dr["MaterialType"].ToString().ToUpper(); + // } + // else + // { + // clsERP.combineException(ref aryException, mesmsg: "[%MaterialListMaterialTypeDifferent%]" + " [%MaterialNo%]:" + + // dr["MaterialNo"]); + // } + + // // CheckLotNo + // if (dr["CheckLotNo"] is DBNull == true) + // { + // dr["CheckLotNo"] = drMTL["CheckLotNo"]; + // } + // else if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(dr["CheckLotNo"], drMTL["CheckLotNo"], false))) + // { + // clsERP.combineException(ref aryException, mesmsg: "[%MaterialListCheckLotNoDifferent%]" + " [%MaterialNo%]:" + + // dr["MaterialNo"]); + // } + + // // 2013/02/20,Even,修改替代料檢查 + // if (dr["SubstituteMaterialNo"] is DBNull == true) + // { + // dr["SubstituteMaterialNo"] = dr["MaterialNo"]; + // dr["SubstituteMaterialLevel"] = dr["MaterialLevel"]; + // } + // // 2013/02/25,Even,判斷替代料,替代料可為半成品或是物料 + // else if (dr["SubstituteMaterialLevel"].ToString() == "0") // 為物料 + // { + // // 查詢替代料是否在物料主檔內,若無,則出現錯誤訊息 + // drMTL = objMTL.GetMaterialBasis(dr["SubstituteMaterialNo"].ToString().ToUpper()); + // if (drMTL["MaterialNo"] is DBNull == true) + // { + // errorFlag = true; + // clsERP.combineException(ref aryException, mesmsg: " [%SubstituteMaterialNo%]:" + + // dr["SubstituteMaterialNo"] + " [%MaterialNoNotExist%][%InMESSystem%]! [%SubstituteMaterialLevel%][%IsMaterial%]."); + // goto SkipMaterialList; + // } + // else + // { + // dr["SubstituteMaterialNo"] = dr["SubstituteMaterialNo"].ToString().ToUpper(); + // } + // } + // else // 為半成品 (SubstituteMaterialLevel = 1) + // { + // DataRow drPRD = null; + // // 檢查物料是否存在於產品主檔 + // using (var objPRD = new clsProduct()) + // { + // drPRD = objPRD.GetProduct(dr["SubstituteMaterialNo"].ToString().ToUpper()); + // } + // if (drPRD["ProductNo"] is DBNull == true) + // { + // errorFlag = true; + // clsERP.combineException(ref aryException, mesmsg: " [%SubstituteMaterialNo%]:" + + // dr["SubstituteMaterialNo"] + " [%ProductNoNotExist%][%InMESSystem%]! [%SubstituteMaterialLevel%][%IsProduct%]."); + // goto SkipMaterialList; + // } + // else + // { + // dr["SubstituteMaterialNo"] = dr["SubstituteMaterialNo"].ToString().ToUpper(); + // } + // } + + // if (dr["SubstituteStdQty"] is DBNull == true) + // { + // dr["SubstituteStdQty"] = dr["StdQty"]; + // } + + // // 2019/12/16 OwenLiu, Mantis:0065576 , 工單整合(新增)時用料需求數支援單位轉換 + // decimal decRequireQty = 0m; + // if (dr["RequireQty"] is DBNull == true) + // { + // // ERP未傳入需求數(RequireQty) + // // 2019/12/23 OwenLiu, Mantis:0065953 修正工單整合 用料清單單位轉換的問題 + // dr["RequireQty"] = Operators.MultiplyObject(Operators.MultiplyObject(MOQty, dr["StdQty"]), Operators.AddObject(1, dr["DecreaseRate"])); + // } + // else + // { + // decRequireQty = Convert.ToDecimal(dr["RequireQty"]); + // // 2019/12/23 OwenLiu, Mantis:0065953 修正工單整合 用料清單單位轉換的問題 + // if (drMTL["UnitNo"].ToString().ToLower() != strMaterialUnit.ToLower()) + // { + // // 當用料清單和物料主檔的單位不同時 + // using (var objUnit = new udUnitTransferFunction.clsUnitTransferFunction()) + // { + // var colParameters = new Collection(); + // colParameters.Add(dr["MaterialNo"].ToString().ToUpper(), "ProductNo"); + // colParameters.Add("*", "ProductVersion"); + // try + // { + // dr["RequireQty"] = Convert.ToDouble(objUnit.EXETransferQty(strMaterialUnit.ToLower(), drMTL["UnitNo"].ToString().ToLower(), (double)decRequireQty, colParameters)); + // } + // catch (Exception ex) + // { + // errorFlag = true; + // clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitNoDifferent%]" + " [%MaterialNo%]:" + + // dr["MaterialNo"]); + // clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitTransferFail%]" + " " + ex.Message); + // } + // } + // } + // else + // { + // dr["RequireQty"] = decRequireQty; + // } + // } + + // // 檢查OPNo(用料作業站)是否存在 ----- + // if (dr["OPNo"].ToString().ToUpper() != "LOTCREATE") + // { + // // 有傳入=>檢查OP主檔 + // using (var objOP = new clsOpBasis()) + // { + // var drOP = objOP.GetOPBasis(dr["OPNo"].ToString().ToUpper()); + // if (drOP["OPNo"] is DBNull == true) + // { + // // OP主檔未建立 + // clsERP.combineException(ref aryException, mesmsg: "[%MaterialNo%]:" + + // dr["MaterialNo"] + " [%OPNoNotExist%](" + dr["OPNo"] + ")"); + // } + // } + // } + + // } + // } + // else + // { + // // 用料清單為半成品 + // using (var objPRD = new clsProduct()) + // { + // DataRow drPRD = null; + // bool errorFlag = false; + + // dr["MONo"] = dr["MONo"].ToString().ToUpper(); + + // drPRD = objPRD.GetProduct(dr["MaterialNo"].ToString().ToUpper()); + // // (skip) MONo, MaterialLevel, STDQty, DecreaseRate, OPNo, Specified, PutinPlaceType, MOFlag, CountWay, Description, OrgMaterialNo, EX_MTLList1, EX_MTLList2, MaterialVersion + + // // MaterialNo + // if (drPRD["ProductNo"] is DBNull == true) + // { + // errorFlag = true; + // clsERP.combineException(ref aryException, mesmsg: " [%MaterialNo%]:" + + // dr["MaterialNo"] + " [%ProductNoNotExist%][%InMESSystem%]! [%MaterialLevel%][%IsProduct%]."); + // goto SkipMaterialList; + // } + // else + // { + // dr["MaterialNo"] = dr["MaterialNo"].ToString().ToUpper(); + // } + + // // UnitNo + // if (drPRD["UnitNo"].ToString().ToLower() != strMaterialUnit.ToLower()) + // { + // // 當用料清單和物料主檔的單位不同時 + // // 單位轉換 + // using (var objUnit = new udUnitTransferFunction.clsUnitTransferFunction()) + // { + // var colParameters = new Collection(); + // colParameters.Add(dr["MaterialNo"].ToString().ToUpper(), "ProductNo"); + // colParameters.Add("*", "ProductVersion"); + + // try + // { + + // dr["StdQty"] = Convert.ToDouble(objUnit.EXETransferQty(strMaterialUnit.ToLower(), drPRD["UnitNo"].ToString().ToLower(), Convert.ToDouble(dr["StdQty"]), colParameters)); + // dr["SubstituteStdQty"] = Convert.ToDouble(objUnit.EXETransferQty(strMaterialUnit.ToLower(), drPRD["UnitNo"].ToString().ToLower(), Convert.ToDouble(dr["SubstituteStdQty"]), colParameters)); + + // dr["UnitNo"] = drPRD["UnitNo"].ToString().ToLower(); + // } + // catch (Exception ex) + // { + // errorFlag = true; + // clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitNoDifferent%]" + " [%MaterialNo%]:" + + // dr["MaterialNo"]); + // clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitTransferFail%]" + " " + ex.Message); + // } + // } + // } + // else + // { + // dr["UnitNo"] = dr["UnitNo"].ToString().ToLower(); + // } + + // // MaterialMONo (Default) + // dr["MaterialMONo"] = "N/A"; + + // // MaterialType + // if (dr["MaterialType"] is DBNull == true) + // { + // dr["MaterialType"] = drPRD["ProductType"]; + // } + // else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dr["MaterialType"].ToString().ToUpper(), drPRD["ProductType"], false))) + // { + // dr["MaterialType"] = dr["MaterialType"].ToString().ToUpper(); + // } + // else + // { + // clsERP.combineException(ref aryException, mesmsg: "[%MaterialListMaterialTypeDifferent%]" + " [%MaterialNo%]:" + + // dr["MaterialNo"]); + // } + + // // CheckLotNo + // dr["CheckLotNo"] = 1; // 半成品固定為1 + + // // SubstituteMaterialNo + // // ---2013/02/20,Even,替代料是否存在的檢查---- + // if (dr["SubstituteMaterialNo"] is DBNull == true) + // { + // dr["SubstituteMaterialNo"] = dr["MaterialNo"]; + // dr["SubstituteMaterialLevel"] = dr["MaterialLevel"]; + // } + // else + // { + // DataRow drMTL = null; + // // 2013/02/25,Even,判斷替代料,替代料可為半成品或是物料 + // if (dr["SubstituteMaterialLevel"].ToString() == "0") // 為物料 + // { + // // 查詢替代料是否在物料主檔內,若無,則出現錯誤訊息 + // using (var objMTL = new clsMTLBasis()) + // { + // drMTL = objMTL.GetMaterialBasis(dr["SubstituteMaterialNo"].ToString().ToUpper()); + // } + + // if (drMTL["MaterialNo"] is DBNull == true) + // { + // errorFlag = true; + // clsERP.combineException(ref aryException, mesmsg: " [%SubstituteMaterialNo%]:" + + // dr["SubstituteMaterialNo"] + " [%MaterialNoNotExist%][%InMESSystem%]! [%SubstituteMaterialLevel%][%IsMaterial%]."); + // goto SkipMaterialList; + // } + // else + // { + // dr["SubstituteMaterialNo"] = dr["SubstituteMaterialNo"].ToString().ToUpper(); + // } + // } + // else // 為半成品 (SubstituteMaterialLevel = 1) + // { + // // 檢查物料是否存在於產品主檔 + // drPRD = objPRD.GetProduct(dr["SubstituteMaterialNo"].ToString().ToUpper()); + // if (drPRD["ProductNo"] is DBNull == true) + // { + // errorFlag = true; + // clsERP.combineException(ref aryException, mesmsg: " [%SubstituteMaterialNo%]:" + + // dr["SubstituteMaterialNo"] + " [%ProductNoNotExist%][%InMESSystem%]! [%SubstituteMaterialLevel%][%IsProduct%]."); + // goto SkipMaterialList; + // } + // else + // { + // dr["SubstituteMaterialNo"] = dr["SubstituteMaterialNo"].ToString().ToUpper(); + // } + // } + // } + + // if (dr["SubstituteStdQty"] is DBNull == true) + // { + // dr["SubstituteStdQty"] = dr["StdQty"]; + // } + + + // // 2019/12/16 OwenLiu, Mantis:0065576 , 工單整合(新增)時用料需求數支援單位轉換 + // decimal decRequireQty = 0m; + // if (dr["RequireQty"] is DBNull == true) + // { + // // ERP未傳入需求數(RequireQty) + // // 2019/12/23 OwenLiu, Mantis:0065953 修正工單整合 用料清單單位轉換的問題 + // dr["RequireQty"] = Operators.MultiplyObject(Operators.MultiplyObject(MOQty, dr["StdQty"]), Operators.AddObject(1, dr["DecreaseRate"])); + // } + // else + // { + // decRequireQty = Convert.ToDecimal(dr["RequireQty"]); + // // 2019/12/23 OwenLiu, Mantis:0065953 修正工單整合 用料清單單位轉換的問題 + // if (drPRD["UnitNo"].ToString().ToLower() != strMaterialUnit.ToLower()) + // { + // // 當用料清單和產品主檔的單位不同時 + // using (var objUnit = new udUnitTransferFunction.clsUnitTransferFunction()) + // { + // var colParameters = new Collection(); + // colParameters.Add(dr["MaterialNo"].ToString().ToUpper(), "ProductNo"); + // colParameters.Add("*", "ProductVersion"); + // try + // { + // dr["RequireQty"] = Convert.ToDouble(objUnit.EXETransferQty(strMaterialUnit.ToLower(), drPRD["UnitNo"].ToString().ToLower(), (double)decRequireQty, colParameters)); + // } + // catch (Exception ex) + // { + // errorFlag = true; + // clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitNoDifferent%]" + " [%MaterialNo%]:" + + // dr["MaterialNo"]); + // clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitTransferFail%]" + " " + ex.Message); + // } + // } + // } + // else + // { + // dr["RequireQty"] = decRequireQty; + // } + // } + + // // 檢查OPNo(用料作業站)是否存在 ----- + // if (dr["OPNo"].ToString().ToUpper() != "LOTCREATE") + // { + // // 有傳入=>檢查OP主檔 + // using (var objOP = new clsOpBasis()) + // { + // var drOP = objOP.GetOPBasis(dr["OPNo"].ToString().ToUpper()); + // if (drOP["OPNo"] is DBNull == true) + // { + // // OP主檔未建立 + // clsERP.combineException(ref aryException, mesmsg: "[%MaterialNo%]:" + + // dr["MaterialNo"] + " [%OPNoNotExist%](" + dr["OPNo"] + ")"); + // } + // } + // } + // } + // } + + // SkipMaterialList: + // ; + // } + + // catch (Exception ex) + // { + // clsERP.combineException(ref aryException, sysmsg: ex.Message, mesmsg: "[%doMaterialListFail%]", stack: iMESCore.Base.iMESComXML.CInput(ex.StackTrace)); + // } + // } + //} + #endregion + + // ----- 8. 檢查FactoryNo ----- + // FactoryNo = "N/A" + List argstrMessage = null; + List argstrException = null; + doFactoryNo(FactoryNo, Creator, CreateDate, strMessage: argstrMessage, strException: argstrException); + + // ----- 9. 檢查MO Property --- + if (!(dtMOProperty == null) && dtMOProperty.Rows.Count > 0) + { + foreach (DataRow dr in dtMOProperty.Rows) + { + List argaryMessage = null; + List argaryException = null; + doSYSMOProperty(Convert.ToString(dr["PropertyNo"]), Convert.ToString(dr["DataType"]), aryMessage: argaryMessage, aryException: argaryException); + } + } + + // ----- Exception => Fail ----- + if (aryException.Count > 0) + goto exitfun; + + // ----- Add MO ----- + // Dim objLic As New iMESLicxManager.clsDBCom + // Using cn As New OleDbConnection(objSetting.GetConnectionString) + // Using cmd As New OleDbCommand("", cn) + // cn.Open() + // Using trans As OleDbTransaction = cn.BeginTransaction + // cmd.Transaction = trans + try + { + + if (string.IsNullOrEmpty(RONo) == false) + { + var objOE = new clsOEBasis(); + // 檢查訂單是否已存在 + var dr = objOE.GetROBasis(RONo.ToUpper()); + if (dr["RONo"] is DBNull == false) + isROExist = true; + + // 檢查訂單明細是否已存在 + // 若訂單號碼有傳入,此項目應一併傳入,若未傳入則預設為1 + if (string.IsNullOrEmpty(ItemNo)) + ItemNo = "1"; + dr = objOE.GetRODetail(RONo.ToUpper(), Convert.ToDecimal(ItemNo.ToUpper())); + if (dr["ItemNo"] is DBNull == false) + { + isRODetailExist = true; + } + + // ----- RO ----- + if (isROExist == false) + { + // add ROBasis + strSQL = "insert into tbloerobasis(rono,customerno,creator,createdate,issuestate,rostate) values('" + RONo.ToUpper() + "','" + CustomerNo.ToUpper() + "','" + Creator + "',To_Date('" + Strings.Format(CreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),2,2)"; + CollectionSQL.Add(strSQL); + // cmd.CommandText = _ + // "insert into tbloerobasis(rono,customerno,description,creator,createdate,issuestate,lotserial,rostate) values(?,?,?,?,?,?,?,?)" + // cmd.Parameters.AddWithValue(":RONo", RONo.ToUpper) + // cmd.Parameters.AddWithValue(":CustomerNo", CustomerNo.ToUpper) + // cmd.Parameters.AddWithValue(":Description", DBNull.Value) + // cmd.Parameters.AddWithValue(":Creator", Creator) + // cmd.Parameters.AddWithValue(":CreateDate", CreateDate) + // cmd.Parameters.AddWithValue(":IssueState", 2) + // cmd.Parameters.AddWithValue(":LotSerial", DBNull.Value) + // cmd.Parameters.AddWithValue(":ROState", 2) + // cmd.ExecuteNonQuery() + // cmd.Parameters.Clear() + } + + switch (isRODetailExist) + { + case true: + { + // update RODetail + strSQL = "update tbloerodetail set orderqty=orderqty+" + MOQty + ", unreleaseqty=unreleaseqty+" + MOQty; + strSQL += "where RONO='" + RONo.ToUpper() + "' and ItemNo=" + ItemNo.ToUpper(); + break; + } + // Gary Lu 20130307:原本無Where條件,不修正會使得TBLOERODETAIL內其他訂單明細也受到影響 + // cmd.CommandText = _ + // "update tbloerodetail set orderqty=orderqty+?, unreleaseqty=unreleaseqty+?" + // cmd.Parameters.AddWithValue(":OrderQty", MOQty) + // cmd.Parameters.AddWithValue(":UnReleaseQty", MOQty) + case false: + { + // add RODetail + strSQL = "insert into tbloerodetail(rono,itemno,productno,orderqty,unreleaseqty,creator,createdate,rounitno,customerno,customername) " + "values('" + RONo.ToUpper() + "'," + ItemNo + ",'" + ProductNo.ToUpper() + "'," + MOQty + "," + MOQty + ",'" + Creator + "',To_Date('" + Strings.Format(CreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'" + MOUnitNo.ToLower() + "','" + CustomerNo.ToUpper() + "','" + ChkSingleQuation(CustomerName) + "')"; + break; + } + // cmd.CommandText = _ + // "insert into tbloerodetail(rono,itemno,productno,orderqty,unreleaseqty,description,creator,createdate,rounitno,customerno,customername) " & _ + // "values(?,?,?,?,?,?,?,?,?,?,?)" + // cmd.Parameters.AddWithValue(":RONo", RONo.ToUpper) + // cmd.Parameters.AddWithValue(":ItemNo", ItemNo) + // cmd.Parameters.AddWithValue(":ProductNo", ProductNo.ToUpper) + // cmd.Parameters.AddWithValue(":OrderQty", MOQty) + // cmd.Parameters.AddWithValue(":UnReleaseQty", MOQty) + // cmd.Parameters.AddWithValue(":Description", DBNull.Value) + // cmd.Parameters.AddWithValue(":Creator", Creator) + // cmd.Parameters.AddWithValue(":CreateDate", CreateDate) + // cmd.Parameters.AddWithValue(":ROUnitNo", MOUnitNo.ToLower) + // cmd.Parameters.AddWithValue(":CustomerNo", CustomerNo.ToUpper) + // cmd.Parameters.AddWithValue(":CustomerName", CustomerName) + } + CollectionSQL.Add(strSQL); + // cmd.ExecuteNonQuery() + // cmd.Parameters.Clear() + } + + // ----- MO ----- + + // 2019/08/16 Mantis60378: 新增FromERP欄位, 若來自EAI整合(TT、WF、T100),需填入1 + // add MO Basis + strSQLAddField = "insert into tblOEMOBasis(mono,mostate,moqty,productno,productversion,priority,planfinishdate," + "belongtomono,description,creator,createdate,issuestate,unreleaselotqty,mounitno,motypeno,mosource,engno,engversion,customerno,factoryno" + ", FromERP,wipEntityId,bomVersion,lcPlantype,faiFlag"; + strSQLAddValue = "values('" + MONo.ToUpper() + "'," + MOState + "," + MOQty + ",'" + ProductNo.ToUpper() + "','" + ProductVersion.ToUpper() + "'," + Priority + ",To_Date('" + Strings.Format(PlanFinishDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'" + BelongToMONo + "','" + Description + "','" + Creator + "',To_Date('" + Strings.Format(CreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + IssueState + "," + MOQty + ",'" + MOUnitNo.ToLower() + "'," + MOTypeNo + "," + MOSource + ",'" + ENGNo + "','" + ENGVersion + "','" + CustomerNo.ToUpper() + "','" + FactoryNo + "'," + "1," + wipEntityId + ",'" + bomVersion + "','" + lcPlantype + "','" + faiFlag + "'"; + if (string.IsNullOrEmpty(RONo) == true) + { + strSQLAddField += ",rono"; + strSQLAddValue += ",'N/A'"; + } + else + { + strSQLAddField += ",rono"; + strSQLAddValue += ",'" + RONo.ToUpper() + "'"; + } + if (string.IsNullOrEmpty(Orgcode) == true) + { + strSQLAddField += ",Orgcode"; + strSQLAddValue += ",'N/A'"; + } + else + { + strSQLAddField += ",Orgcode"; + strSQLAddValue += ",'" + Orgcode + "'"; + } + if (string.IsNullOrEmpty(OrgMono) == true) + { + strSQLAddField += ",OrgMono"; + strSQLAddValue += ",'N/A'"; + } + else + { + strSQLAddField += ",OrgMono"; + strSQLAddValue += ",'" + OrgMono + "'"; + } + + if (string.IsNullOrEmpty(ItemNo) == true) + { + strSQLAddField += ",itemno"; + strSQLAddValue += ",-1"; + } + else + { + strSQLAddField += ",itemno"; + strSQLAddValue += "," + ItemNo; + } + if (!string.IsNullOrEmpty(CustomerLotNo)) + { + strSQLAddField += ",customerlotno"; + strSQLAddValue += ",'" + CustomerLotNo + "'"; + } + + // 2018/3/19 Vick 新增欄位 ERPMOLineNo + if (ERPMOLineNo != defString) + { + strSQLAddField += ",ERPMOLineNo"; + strSQLAddValue += ",'" + ERPMOLineNo + "'"; + } + + if (PlanStartDate != default(DateTime)) + { + strSQLAddField += ",PlanStartDate"; + strSQLAddValue += ", To_Date('" + Strings.Format(PlanStartDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + } + + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + // cmd.CommandText = _ + // "insert into tbloemobasis(mono,rono,itemno,mostate,moqty,productno,productversion,priority,planfinishdate,belongtomono,description,creator,createdate," & _ + // "issuestate,unreleaselotqty,mounitno,lotserial,motypeno,mosource,engno,engversion,customerno,incomingkey,customerlotno,factoryno) " & _ + // "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" + // cmd.Parameters.AddWithValue(":MONo", MONo.ToUpper) + // If String.IsNullOrEmpty(RONo) = True) + // cmd.Parameters.AddWithValue(":RONo", "N/A") + // Else + // cmd.Parameters.AddWithValue(":RONo", RONo.ToUpper) + // End If + // If String.IsNullOrEmpty(ItemNo) = True) + // cmd.Parameters.AddWithValue(":ItemNo", -1) + // Else + // cmd.Parameters.AddWithValue(":ItemNo", ItemNo) + // End If + // cmd.Parameters.AddWithValue(":MOState", MOState) + // cmd.Parameters.AddWithValue(":MOQty", MOQty) + // cmd.Parameters.AddWithValue(":ProductNo", ProductNo.ToUpper) + // cmd.Parameters.AddWithValue(":ProductVersion", ProductVersion.ToUpper) + // cmd.Parameters.AddWithValue(":Priority", Priority) + // cmd.Parameters.AddWithValue(":PlanFinishDate", PlanFinishDate) + // cmd.Parameters.AddWithValue(":BelongToMONo", BelongToMONo) + // cmd.Parameters.AddWithValue(":Description", Description) + // cmd.Parameters.AddWithValue(":Creator", Creator) + // cmd.Parameters.AddWithValue(":CreateDate", CreateDate) + // cmd.Parameters.AddWithValue(":IssueState", IssueState) + // cmd.Parameters.AddWithValue(":UnReleaseLotQty", MOQty) + // cmd.Parameters.AddWithValue(":MOUnitNo", MOUnitNo.ToLower) + // cmd.Parameters.AddWithValue(":LotSerial", DBNull.Value) + // cmd.Parameters.AddWithValue(":MOTypeNo", MOTypeNo) + // cmd.Parameters.AddWithValue(":MOSource", MOSource) + // cmd.Parameters.AddWithValue(":EngNo", ENGNo) + // cmd.Parameters.AddWithValue(":EngVersion", ENGVersion) + // cmd.Parameters.AddWithValue(":CustomerNo", CustomerNo.ToUpper) + // cmd.Parameters.AddWithValue(":IncomingKey", DBNull.Value) + // If CustomerLotNo = String.Empty) + // cmd.Parameters.AddWithValue(":CustomerLotNo", DBNull.Value) + // Else + // cmd.Parameters.AddWithValue(":CustomerLotNo", CustomerLotNo) + // End If + // cmd.Parameters.AddWithValue(":FactoryNo", FactoryNo) + // cmd.ExecuteNonQuery() + // cmd.Parameters.Clear() + + // add MO Component + // + + + // add MO Material List + // dtMTL: MONo, MaterialNo, MaterialLevel, StdQty, UnitNo, OPNo, PutInPlaceType, DecreaseRate, Specified, *MaterialType, CountWay, *CheckLotNo, *MaterialVersion, +*MaterialMONo, +SubstituteMaterialNo + //if (dtMTL.Rows.Count > 0) + //{ + // if (!dtMTL.Columns.Contains("MaterialMONo")) + // dtMTL.Columns.Add("MaterialMONo", Type.GetType("System.String")); + + // foreach (DataRow dr in dtMTL.Rows) + // { + // if (dr["MaterialMONo"] is DBNull || string.IsNullOrEmpty(dr["MaterialMONo"].ToString())) + // dr["MaterialMONo"] = "N/A"; + + // bool blnAddMaterial = true; // 是否將工單用料加入tblOEMOMaterialList, True:是 False:否 + + // // 2019/09/25 Grace 增加檢查, 若有傳入DeliveryMethod且值=4, 這筆工單用料清單, 不加入至tblOEMOMaterialList;否或非4則不做任何處理 + // // 材料型態tagname:DeliveryMethod (Optional參數,非必傳) + // if (!(dr["DeliveryMethod"] is DBNull)) + // { + // if (dr["DeliveryMethod"].ToString() == "4") + // { + // blnAddMaterial = false; + // } + // } + + // if (blnAddMaterial) + // { + // // 2019/01/30 OwenLiu, Mantis: 0054631 工單拋轉時,避免oracle與SQLServer對於空字串('')處理不同 + // // Oracle會將欄位值存成Null, SQLServer會將欄位值成空字串,造成後續功能判斷上的問題 + // string strSQLAddMTLField, strSQLAddMTLValue; + // // 先設定Not Null欄位 + // strSQLAddMTLField = "INSERT INTO tblOEMOMaterialList(MONo,MaterialNo,MaterialLevel,StdQty,UnitNo"; + // strSQLAddMTLValue = " VALUES('" + dr["MONo"].ToString().ToUpper() + "'" + ",'" + dr["MaterialNo"].ToString().ToUpper() + "'," + + // dr["MaterialLevel"] + "," + dr["StdQty"] + ",'" + dr["UnitNo"].ToString().ToLower() + "'"; + + // strSQLAddMTLField += ",DecreaseRate,OPNo,Specified,PutinplaceType,MaterialMONo,MaterialType" + ",CountWay,CheckLotNo,SubstituteMaterialNo,mainItem,phantomItem,lockRequirement,operationSeqnum"; + // strSQLAddMTLValue = strSQLAddMTLValue + "," + + // dr["DecreaseRate"] + ",'" + dr["OPNo"].ToString().ToUpper() + "'," + dr["Specified"] + "," + dr["PutInPlaceType"] + ",'" + dr["MaterialMONo"] + + // "'" + ",'" + dr["MaterialType"].ToString().ToUpper() + "'," + dr["CountWay"] + "," + dr["CheckLotNo"] + ",'" + dr["SubstituteMaterialNo"].ToString().ToUpper() + + // "','" + dr["mainItem"] + "','" + dr["phantomItem"] + "','" + dr["lockRequirement"] + "','" + dr["operationSeqnum"] + "'"; + + // // RequireQty + // if (!dr.IsNull("RequireQty") && !string.IsNullOrEmpty(dr["RequireQty"].ToString())) + // { + // strSQLAddMTLField += ",RequireQty"; + // strSQLAddMTLValue = strSQLAddMTLValue + "," + dr["RequireQty"].ToString(); + // } + // // SubstituteStdQty + // if (!dr.IsNull("SubstituteStdQty") && !string.IsNullOrEmpty(dr["SubstituteStdQty"].ToString())) + // { + // strSQLAddMTLField += ",SubstituteStdQty"; + // strSQLAddMTLValue = strSQLAddMTLValue + "," + dr["SubstituteStdQty"].ToString(); + // } + // // MaterialVersion + // if (!dr.IsNull("MaterialVersion") && !string.IsNullOrEmpty(dr["MaterialVersion"].ToString())) + // { + // strSQLAddMTLField += ",MaterialVersion"; + // strSQLAddMTLValue = strSQLAddMTLValue + ",'" + dr["MaterialVersion"] + "'".ToString(); + // } + // // SubstituteMaterialLevel + // if (!dr.IsNull("SubstituteMaterialLevel") && !string.IsNullOrEmpty(dr["SubstituteMaterialLevel"].ToString())) + // { + // strSQLAddMTLField += ",SubstituteMaterialLevel"; + // strSQLAddMTLValue = strSQLAddMTLValue + "," + dr["SubstituteMaterialLevel"].ToString(); + // } + + // strSQL = strSQLAddMTLField + ")" + strSQLAddMTLValue + ")"; + + // CollectionSQL.Add(strSQL); + // } + + // // cmd.CommandText = _ + // // "insert into tbloemomateriallist(mono,materialno,materiallevel,stdqty,unitno,opno,putinplacetype," & _ + // // "decreaserate,specified,materialtype,countway,checklotno,materialversion,materialmono,substitutematerialno,SubstituteMaterialLevel,SubstituteStdQty,RequireQty) " & _ + // // "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" + // // cmd.Parameters.AddWithValue(":MONo", dr("MONo").ToString.ToUpper) + // // cmd.Parameters.AddWithValue(":MaterialNo", dr("MaterialNo").ToString.ToUpper) + // // cmd.Parameters.AddWithValue(":MaterialLevel", dr("MaterialLevel")) + // // cmd.Parameters.AddWithValue(":StdQty", dr("StdQty")) + // // cmd.Parameters.AddWithValue(":UnitNo", dr("UnitNo").ToString.ToLower) + // // cmd.Parameters.AddWithValue(":OPNo", dr("OPNo").ToString.ToUpper) + // // cmd.Parameters.AddWithValue(":PutInPlaceType", dr("PutInPlaceType")) + // // cmd.Parameters.AddWithValue(":DecreaseRate", dr("DecreaseRate")) + // // cmd.Parameters.AddWithValue(":Specified", dr("Specified")) + // // cmd.Parameters.AddWithValue(":MaterialType", dr("MaterialType").ToString.ToUpper) + // // cmd.Parameters.AddWithValue(":CountWay", dr("CountWay")) + // // cmd.Parameters.AddWithValue(":CheckLotNo", dr("CheckLotNo")) + // // cmd.Parameters.AddWithValue(":MaterialVersion", dr("MaterialVersion")) + // // cmd.Parameters.AddWithValue(":MaterialMONo", dr("MaterialMONo")) + // // cmd.Parameters.AddWithValue(":SubstituteMaterialNo", dr("SubstituteMaterialNo").ToString.ToUpper) + // // cmd.Parameters.AddWithValue(":SubstituteMaterialLevel", dr("SubstituteMaterialLevel")) '2012/12/26,Even,新增替代物料階 &數量 + // // cmd.Parameters.AddWithValue(":SubstituteStdQty", dr("SubstituteStdQty")) '2012/12/28,Even,新增替代物標準數 + // // cmd.Parameters.AddWithValue(":RequireQty", dr("RequireQty")) + // // cmd.ExecuteNonQuery() + // // cmd.Parameters.Clear() + // } + //} + + + // add MO Process + // 依產品、產品版本、工單類別找出工單流程 + // 參考kcOE.ShowProductProcess、kcOE.UpdMOProcessbyProduct、MEStc_WellDown.addMO + // 2012/07/26, Aaron, 修正取流程時無法取得多區段的流程 + + // 2018/11/19 OwenLiu, 透過共用Function 統一處理 MOProcess資料 + ExamineMOProcess(MONo, ProductNo, ProductVersion, MOTypeNo, ref CollectionSQL, ref aryException, CustomerLotNo); + + if (aryException.Count > 0) + goto exitfun; + + // add MO Property + if (dtMOProperty.Rows.Count > 0) + { + foreach (DataRow dr in dtMOProperty.Rows) + { + strSQL = "insert into tbloemoproperty(mono,propertyno,propertyvalue) values('" + dr["MONo"].ToString().ToUpper() + "','" + + dr["PropertyNo"] + "','" + dr["PropertyValue"] + "')"; + CollectionSQL.Add(strSQL); + // cmd.Parameters.AddWithValue(":MONo", dr("MONo").ToString.ToUpper) + // cmd.Parameters.AddWithValue(":PropertyNo", dr("PropertyNo")) + // cmd.Parameters.AddWithValue(":PropertyValue", dr("PropertyValue")) + // cmd.CommandText = "insert into tbloemoproperty(mono,propertyno,propertyvalue) values(?,?,?)" + // cmd.ExecuteNonQuery() + // cmd.Parameters.Clear() + strSQL = "insert into tbloemoproperty_recive(mono,propertyno,propertyvalue) values('" + dr["MONo"].ToString().ToUpper() + "','" + + dr["PropertyNo"] + "','" + dr["PropertyValue"] + "')"; + CollectionSQL.Add(strSQL); + // cmd.Parameters.AddWithValue(":MONo", dr("MONo").ToString.ToUpper) + // cmd.Parameters.AddWithValue(":PropertyNo", dr("PropertyNo")) + // cmd.Parameters.AddWithValue(":PropertyValue", dr("PropertyValue")) + // cmd.CommandText = "insert into tbloemoproperty_recive(mono,propertyno,propertyvalue) values(?,?,?)" + // cmd.ExecuteNonQuery() + // cmd.Parameters.Clear() + } + } + + + // add MO SEMI Out + // + + + // trans.Commit() + //string argstrDataBaseType = "Null"; + ExecuteSQLNoneQuery_UPD(objSetting.GetDataBaseType(), objSetting.GetConnectionString(), CollectionSQL); + r = true; + clsERP.combineMessage(ref aryMessage, mmsg: "[%AddMOSuccess%]"); + } + + catch (Exception ex) + { + // trans.Rollback() + clsERP.combineException(ref aryException, sysmsg: ex.Message, mesmsg: "[%AddMOFail%]", stack: iMESCore.Base.iMESComXML.CInput(ex.StackTrace)); + + } + // End Using + // End Using + // End Using + + exitfun: + ; + } + + + catch (Exception ex) + { + clsERP.combineException(ref aryException, sysmsg: ex.Message, mesmsg: "[%AddMOFail%]", stack: iMESCore.Base.iMESComXML.CInput(ex.StackTrace)); + } + finally + { + CloseConnection(cnnTemp1); + addMORet = r; + } + + return addMORet; + + } + public static string AddMOMaterialList(string MONo, string MaterialNo, int MaterialLevel, double StdQty, double DecreaseRate, string OPNo, int Specified, int PutInPlaceType, string UnitNo, int MOFlag, string MaterialMONo, string Description = defString, Collection colReturnSQL = null, string AdditionalXml = "", string MaterialVersion = defString, string SubstituteMaterialNo = defString, int SubstituteMaterialLevel = defInteger, decimal RequireQty = defInteger, decimal SubstituteStdQty = defInteger, string Creator = defString, DateTime CreateDate = default(DateTime),string AB=defString,string PositionCode=defString) + { + string AddMOMaterialListRet = default(string); + // 此 Function 將新增一筆資料 + // 傳入值: 各欄位新增值 + // 傳回值: success(成功), fail(失敗) + + DbDataReader drTemp = null; + string MaterialType = "N/A"; + int CountWay = -1; + int CheckLotNo = -1; + IDbConnection cnnTemp = null; + + string strSQL = ""; + string strSQLAddField = ""; + string strSQLAddValue = ""; + + + AppSettings objSetting = new AppSettings(); + + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + + try + { + cnnTemp = CreateConnection(strConnectionString); // //Create connection + + if (MaterialLevel == 0) // Material + { + strSQL = "Select MaterialType,CountWay,CheckLotNo From tblMTLMaterialBasis" + " Where MaterialNo ='" + MaterialNo + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + MaterialType = Conversions.ToString(drTemp["MaterialType"]); + CountWay = Conversions.ToInteger(drTemp["CountWay"]); + CheckLotNo = Conversions.ToInteger(drTemp["CheckLotNo"]); + } + else + { + throw new iMESException.MESException("0000-200003", "MaterialNo:" + MaterialNo + " is not exist!"); + } + drTemp.Close(); + } + // cmmTemp.Dispose() + + else if (MaterialLevel == 1) // Product + { + strSQL = "Select ProductType From tblPRDProductBasis Where ProductNo ='" + MaterialNo + "'"; + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + MaterialType = Conversions.ToString(drTemp["ProductType"]); + } + else + { + throw new iMESException.MESException("0000-200003", "ProductNo:" + MaterialNo + " is not exist!"); + } + drTemp.Close(); + + CheckLotNo = 1; // 一律要Check Lot + } + + // Combine SQL + strSQLAddField = "Insert into tblOEMOMaterialList (MONo, MaterialNo, OrgMaterialNo, MaterialLevel, StdQty, UnitNo," + "DecreaseRate, OPNo, Specified, PutInPlaceType, MOFlag, MaterialType, CountWay, CheckLotNo "; + strSQLAddValue = " Values ('" + MONo + "', '" + MaterialNo + "','" + MaterialNo + "'," + MaterialLevel + "," + StdQty + ",'" + UnitNo + "'," + DecreaseRate + ",'" + OPNo + "'," + Specified + "," + PutInPlaceType + "," + MOFlag + ",'" + MaterialType + "'," + CountWay + "," + CheckLotNo; + + + if (MOFlag == 0) // Create MO,紀錄半成品的工單編號 + { + strSQLAddField = strSQLAddField + ",MaterialMONo"; + strSQLAddValue = strSQLAddValue + ",'" + MaterialMONo + "'"; + } + else + { + strSQLAddField = strSQLAddField + ",MaterialMONo"; + strSQLAddValue = strSQLAddValue + ",'N/A'"; + } + if (Description != defString) + { + strSQLAddField = strSQLAddField + ",Description"; + strSQLAddValue = strSQLAddValue + ",'" + Description + "'"; + } + if (MaterialVersion != defString) + { + strSQLAddField = strSQLAddField + ",MaterialVersion"; + strSQLAddValue = strSQLAddValue + ",'" + MaterialVersion + "'"; + } + if (SubstituteMaterialNo != defString) + { + strSQLAddField = strSQLAddField + ",SubstituteMaterialNo"; + strSQLAddValue = strSQLAddValue + ",'" + SubstituteMaterialNo + "'"; + } + + // 2012/12/27,Even,新增替代料等級及需求數量 + if (SubstituteMaterialLevel != defInteger) + { + strSQLAddField = strSQLAddField + ",SubstituteMaterialLevel"; + strSQLAddValue = strSQLAddValue + ",'" + SubstituteMaterialLevel + "'"; + } + if (SubstituteStdQty != defInteger) + { + strSQLAddField = strSQLAddField + ",SubstituteStdQty"; + strSQLAddValue = strSQLAddValue + ",'" + SubstituteStdQty + "'"; + } + if (RequireQty != defInteger) + { + strSQLAddField = strSQLAddField + ",RequireQty"; + strSQLAddValue = strSQLAddValue + ",'" + RequireQty + "'"; + } + if (Creator != defString) + { + strSQLAddField = strSQLAddField + ",Creator"; + strSQLAddValue = strSQLAddValue + ",'" + Creator + "'"; + } + if (CreateDate != defDateTime) + { + strSQLAddField = strSQLAddField + ",CreateDate"; + strSQLAddValue = strSQLAddValue + ",To_Date('" + Strings.Format(CreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + } + + if (string.IsNullOrEmpty(AdditionalXml)) + { + // 當沒有額外的欄位時,直接給定strSQL + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + } + else + { + // 加上additional的field & value 後傳回 + strSQL = SeparateAddXML_Add(ref strSQLAddField, ref strSQLAddValue, AdditionalXml); + } + + // 呼叫執行SQL指令 + if (colReturnSQL == null) + { + ExecuteSQLNoneQuery(Conversions.ToString(strDataBaseType), strConnectionString, ref strSQL); + } + else + { + // 不執行指令,將指令傳出 + colReturnSQL.Add(strSQL); + } + + // Return success + AddMOMaterialListRet = "success"; + } + + catch (Exception e1) + { + AddMOMaterialListRet = "fail"; + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + } // New Exception("kcOE.AddMOMaterialList: " & e1.Message) + + finally + { + CloseConnection(cnnTemp); + + } + + return AddMOMaterialListRet; + + } + + /// + /// 編輯工單(工單變更) + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static bool editMO(string MONo, decimal MOQty, string RONo = null, string ItemNo = null, string CustomerNo = null, int MOTypeNo = defInteger, int Priority = defInteger, DateTime PlanFinishDate = default(DateTime), string Creator = null, DateTime CreateDate = default(DateTime), string Description = null, DataTable dtMTL = null, List aryMessage = null, List aryException = null, List aryAlert = null, DataTable dtMOProperty = null, string ERPMOLineNo = defString, bool PropertyFlag = false, string CustomerLotNo = null, DateTime PlanStartDate = default(DateTime), int wipEntityId = defInteger, string bomVersion = null, string lcPlantype = null, string faiFlag = null) // haoqian 221025 + { + bool editMORet = default(bool); + + bool r = false; + var CollectionSQL = new Collection(); + string strSQL = ""; + + try + { + + // ----- Default Value ----- + int MOSource = 0; // 0: RO, 1: RMA, 2: None + int MOState = 0; // 0: Unconfirm, 1: Pending, 2: Confirm, 3: Release(允許開立生產批), 6: 已在客託倉或退貨倉的工單(允許開立生產批), 99:Close + int IssueState = 0; + string BelongToMONo = "N/A"; + string ENGNo = "N/A"; + string ENGVersion = "N/A"; + //string CustomerLotNo = string.Empty; + string FactoryNo = "N/A"; + decimal AdjustQty = 0m; + string OPNo = "LOTCREATE"; + + // ---- Get Value ----- + string CustomerName = string.Empty; + string ProductVersion = string.Empty; + string ProcessNo = string.Empty; + string ProcessVersion = string.Empty; + + bool isROExist = false; + bool isRODetailExist = false; + + string ItemProperty = defString; // 2016-10-17, Joe, 新增料件屬性,P:採購件,M:自製件,S:外包件 + int OutSourcingFlag = defInteger; // 2016-10-17, Joe, 0:off,1:on + string ProductNo = defString; + + var ReleaseQty = default(decimal); + + // ----- 1. 檢查MO是否存在 ----- + MONo = MONo.ToUpper(); + + using (var objOE = new clsOEBasis()) + { + + var drOE = objOE.GetMOBasis(MONo.ToUpper()); + if (drOE["MONo"] is DBNull == true) + clsERP.combineException(ref aryException, mesmsg: "[%MONoNotExist%]"); + // If drOE.Item("IssueState") < 0 Or drOE.Item("IssueState") > 2) clsERP.combineException(aryException, , , "[%MONoIssueStateCanNotEdit%]") + + + if (!(drOE["MOState"] is DBNull)) + { + if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(drOE["MOState"], 99, false))) + clsERP.combineException(ref aryException, mesmsg: "[%MONoClosed%]"); + } + + // 2020/08/11 Grace Mantis 76332 依據規格書說明調整:若訂單號碼有傳入,此項目應一併傳入,若未傳入則預設為1 + if (string.IsNullOrEmpty(ItemNo) == true) + ItemNo = "1"; + + // ----- 2. 檢查訂單資料 ----- + if (string.IsNullOrEmpty(RONo) == false) + { + if (RONo.ToUpper() != drOE["RONo"].ToString()) + clsERP.combineException(ref aryException, mesmsg: "[%RONoCanNotChange%]"); + if (ItemNo != drOE["ItemNo"].ToString()) + clsERP.combineException(ref aryException, mesmsg: "[%ROItemNoCanNotChange%]"); + } + + // ----- 3. 檢查MO剩餘數量 ----- + // If MOQty < drOE.Item("UnReleaseLotQty")) clsERP.combineException(aryException, , , "[%MOQtyLassThenUnReleaseLotQty%]") + + // 要修改的MOQty不可小於已下線數量:MOQtyLessThenReleaseLotQty, 2009/05/05,by yumei + if (!(drOE["MOQty"] is DBNull)) + { + ReleaseQty = Convert.ToDecimal(Operators.SubtractObject(drOE["MOQty"], drOE["UnReleaseLotQty"])); + if (MOQty < ReleaseQty) + clsERP.combineException(ref aryException, mesmsg: "[%MOQtyLessThenReleaseLotQty%]"); + } + + if (!(drOE["IssueState"] is DBNull)) + { + //檢查工單數量的變更是否合理 + if (Conversions.ToInteger(drOE["IssueState"]) == 2) + { + var dsOEMOC = objOE.ShowMOComponent(MONo.ToUpper()); + if (dsOEMOC.Tables[0].Rows.Count > 0) + { + //tblOEMOComponent.InventoryNo多筆相同 + if (!(dsOEMOC.Tables[0].Rows[0]["InventoryNo"] is DBNull)) + { + clsERP.combineException(ref aryException, mesmsg: "[%EditMOQtyIsNotAllowed_InventoryNo%]"); + } + else + { + if (!(drOE["MOQty"] is DBNull)) + { + if (MOQty < Convert.ToDecimal(drOE["MOQty"])) + { + if (dsOEMOC.Tables[0].Rows.Count > MOQty) + { + clsERP.combineException(ref aryException, mesmsg: "[%EditMOQtyIsNotAllowed_WaferSouceType%]"); + } + } + } + } + } + } + } + + ProductNo = drOE["ProductNo"].ToString(); + + } + + if (aryException.Count > 0) + goto exitfun; + + // ----- 3. 檢查MOSource----- + if (string.IsNullOrEmpty(RONo)) + MOSource = 2; // MO來源為其他(暫不考慮RMA) + + // ----- 4. 檢查CustomerNo是否存在 ----- + if (MOSource == 0) + { + if (string.IsNullOrEmpty(CustomerNo)) + { + // 未傳入 + clsERP.combineException(ref aryException, mesmsg: "[%ROWithoutCustomerNo%]"); + } + else + { + // 有傳入=>檢查Customer主檔 + using (var objENT = new clsCustomerBasis()) + { + var dr = objENT.GetCustomerBasis(CustomerNo.ToUpper()); + if (dr["CustomerNo"] is DBNull == true) + { + // Customer主檔未建立 + // clsERP.combineException(aryException, , , "[%CustomerNoNotExist%]") + + // 5.3 若拋入訂單號碼,則必須拋入客戶編號,系統應檢查tblENTCustomerBasis之中是否存在此客戶,若無則自動新增 + objENT.AddCustomerBasis(CustomerNo.ToUpper(), CustomerNo, CustomerNo, "NULL", "NULL", "NULL", "NULL", "NULL", "NULL"); + objENT.SetCustomerBasisIssueState(CustomerNo.ToUpper(), 2); + } + else + { + CustomerName = dr["CustomerName"].ToString(); + } + } + } + } + + // ----- 5. 檢查Product ----- + // Using objPRD As New kcPRD.clsProduct + // Dim dr As DataRow = objPRD.GetProduct(ProductNo.ToUpper) + // If IsDBNull(dr("ProductNo")) = True) clsERP.combineException(aryException, , , "[%ProductNoNotExist%]") + // If IsDBNull(dr("ProductNo")) = False AndAlso dr("IssueState") <> 2) clsERP.combineException(aryException, , , "[%ProductNotApproved%]") + + // '----- 6. 檢查MOUnitNo ----- + // If IsDBNull(dr("ProductNo")) = False AndAlso dr("UnitNo").ToString.ToLower <> MOUnitNo.ToLower) clsERP.combineException(aryException, , , "[%ProductandMOwithdifferentUnitNo%]") + // dr.Delete() + + // Try + // ProductVersion = objPRD.GetProductCurVersion(ProductNo.ToUpper) + // Catch ex As Exception + // clsERP.combineException(aryException, , , "[%GetProductVersionFail%]") + // End Try + // End Using + + using (var objPRD = new clsProduct()) + { + try + { + ProductVersion = objPRD.GetProductCurVersion(ProductNo.ToUpper()); + } + catch (Exception ex) + { + clsERP.combineException(ref aryException, mesmsg: "[%GetProductVersionFail%]"); + } + // 2016-10-17, Joe, 取得ItemProperty + var drItemProperty = objPRD.GetProductProperty(ProductNo, ProductVersion, "ItemProperty"); + if (drItemProperty == null == false && drItemProperty["DefaultValue"] is DBNull == false) + { + ItemProperty = drItemProperty["DefaultValue"].ToString(); + } + } + // 2016-10-17, Joe, 取得外包控制 + using (var objSYS = new clsSYSParameter()) + { + OutSourcingFlag = Conversions.ToInteger(objSYS.GetParameterValue("OutSourcingFlag")); + } + // 2016-10-17, Joe, 若該產品品號屬性屬於S且外包控管參數為Off時,MES不做工單新增/修改,直接回應OK,但訊息應回傳『MES系統不支持外包工單』 + if (ItemProperty == "S" & OutSourcingFlag == 0) + { + clsERP.combineMessage(ref aryMessage, mmsg: "[%ProductNo%]:" + ProductNo + ",[%ProductVersion%]:" + ProductVersion + ",[%Is%] [%OutSourcing%] [%Product%], MES [%IsNotSupported%] !"); + if (aryMessage.Count > 0) + goto exitfun; + } + + // ----- 7. 檢查用料清單資料 ----- + if (dtMTL.Rows.Count > 0) + { + bool blnWF = false; + //2023/12/07,Ning,151196: [6.0.7] SDD231107_01-01_WF 工單整合接口調整 + //取得目前ERP是否為WF + using (var objSYSPar = new kcSYS.clsSYSParameter()) + { + var dsTemp = new DataSet(); + dsTemp = objSYSPar.ShowERPSetting(ActiveERP: 1); + if (dsTemp != null && dsTemp.Tables[0].Rows.Count > 0) + { + if (dsTemp.Tables[0].Rows[0]["ERP_Name"].ToString().ToUpper() == "WORKFLOW") + { + blnWF = true; + } + } + } + + if (!dtMTL.Columns.Contains("MaterialMONo")) + dtMTL.Columns.Add("MaterialMONo", Type.GetType("System.String")); + + // dtMTL: MONo, MaterialNo, MaterialLevel, StdQty, UnitNo, OPNo, PutInPlaceType, DecreaseRate, Specified, *MaterialType, CountWay, *CheckLotNo, *MaterialVersion, +MaterialMONo, +*SubstituteMaterialNo + + foreach (DataRow dr in dtMTL.Rows) + { + string strMaterialUnit = dr["UnitNo"].ToString(); + decimal decTemp = 0m; + try + { + if (string.IsNullOrEmpty(dr["MainItem"].ToString())) + { + // 未傳入 + clsERP.combineException(ref aryException, mesmsg: "[%MainItem%]"); + } + + //if (string.IsNullOrEmpty(dr["PhantomItem"].ToString())) + //{ + // // 未傳入 + // clsERP.combineException(ref aryException, mesmsg: "[%PhantomItem%]"); + //} + + if (string.IsNullOrEmpty(dr["LockRequirement"].ToString())) + { + // 未傳入 + clsERP.combineException(ref aryException, mesmsg: "[%LockRequirement%]"); + } + + if (string.IsNullOrEmpty(dr["OperationSeqnum"].ToString())) + { + // 未傳入 + clsERP.combineException(ref aryException, mesmsg: "[%OperationSeqnum%]"); + } + + if (blnWF == true) + { + if (Conversions.ToInteger(dr["StdQty"]) != Convert.ToDecimal(dr["StdQty"])) //若標準用量有小數, 需以ERP所傳入的該物料的需領用量(RequireQty)/預計產量(MOQty),並以無條件捨去取到小數六位數的值,做為該物料的標準用量 + { + decTemp = (Convert.ToDecimal(dr["RequireQty"]) / MOQty) * 1000000; + decTemp = Math.Floor(decTemp); + decTemp = decTemp / 1000000; + dr["StdQty"] = decTemp; + } + if (Conversions.ToInteger(dr["SubstituteStdQty"]) != Convert.ToDecimal(dr["SubstituteStdQty"])) //若替代料標準用量有小數同標準用量處理 + { + decTemp = (Convert.ToDecimal(dr["RequireQty"]) / MOQty) * 1000000; + decTemp = Math.Floor(decTemp); + decTemp = decTemp / 1000000; + dr["SubstituteStdQty"] = decTemp; + } + } + if (dr["MaterialLevel"].ToString() == "0") + { + // 用料清單為物料 + using (var objMTL = new clsMTLBasis()) + { + DataRow drMTL = null; + bool errorFlag = false; + dr["MONo"] = dr["MONo"].ToString().ToUpper(); + + drMTL = objMTL.GetMaterialBasis(dr["MaterialNo"].ToString().ToUpper()); + // (skip) MONo, MaterialLevel, STDQty, DecreaseRate, OPNo, Specified, PutinPlaceType, MOFlag, CountWay, Description, OrgMaterialNo, EX_MTLList1, EX_MTLList2, MaterialVersion + + // MaterialNo + if (drMTL["MaterialNo"] is DBNull == true) // 2013/02/19,Even,以物料編號在物料主檔中查詢,查不到表示該項為半成品,因為TIPTOP系統中,物料和產品在同一個table內,使用者可能挑選到產品卻以為是物料 + { + errorFlag = true; + clsERP.combineException(ref aryException, mesmsg: " [%MaterialNo%]:" + + dr["MaterialNo"] + " [%MaterialNoNotExist%][%InMESSystem%]! [%MaterialLevel%][%IsMaterial%]."); + goto SkipMaterialList; + } + else + { + dr["MaterialNo"] = dr["MaterialNo"].ToString().ToUpper(); + } + + // UnitNo + if (drMTL["UnitNo"].ToString().ToLower() != strMaterialUnit.ToLower()) + { + // 當用料清單和物料主檔的單位不同時 + // 單位轉換 + using (var objUnit = new udUnitTransferFunction.clsUnitTransferFunction()) + { + var colParameters = new Collection(); + colParameters.Add(dr["MaterialNo"].ToString().ToUpper(), "ProductNo"); + colParameters.Add("*", "ProductVersion"); + + try + { + dr["StdQty"] = Convert.ToDouble(objUnit.EXETransferQty(strMaterialUnit.ToLower(), drMTL["UnitNo"].ToString().ToLower(), Convert.ToDouble(dr["StdQty"]), colParameters)); + dr["SubstituteStdQty"] = Convert.ToDouble(objUnit.EXETransferQty(strMaterialUnit.ToLower(), drMTL["UnitNo"].ToString().ToLower(), Convert.ToDouble(dr["SubstituteStdQty"]), colParameters)); + dr["UnitNo"] = drMTL["UnitNo"].ToString().ToLower(); + } + catch (Exception ex) + { + errorFlag = true; + clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitNoDifferent%]" + " [%MaterialNo%]:" + + dr["MaterialNo"]); + clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitTransferFail%]" + " " + ex.Message); + } + } + } + else + { + dr["UnitNo"] = dr["UnitNo"].ToString().ToLower(); + } + + // MaterialMONo (Default) + dr["MaterialMONo"] = "N/A"; + + // MaterialType + if (dr["MaterialType"] is DBNull == true) + { + dr["MaterialType"] = drMTL["MaterialType"]; + } + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dr["MaterialType"].ToString().ToUpper(), drMTL["MaterialType"], false))) + { + dr["MaterialType"] = dr["MaterialType"].ToString().ToUpper(); + } + else + { + clsERP.combineException(ref aryException, mesmsg: "[%MaterialListMaterialTypeDifferent%]" + " [%MaterialNo%]:" + + dr["MaterialNo"]); + } + + // CheckLotNo + if (dr["CheckLotNo"] is DBNull == true) + { + dr["CheckLotNo"] = drMTL["CheckLotNo"]; + } + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectNotEqual(dr["CheckLotNo"], drMTL["CheckLotNo"], false))) + { + clsERP.combineException(ref aryException, mesmsg: "[%MaterialListCheckLotNoDifferent%]" + " [%MaterialNo%]:" + + dr["MaterialNo"]); + } + + // 2013/02/20,Even,修改替代料檢查 + if (dr["SubstituteMaterialNo"] is DBNull == true) + { + dr["SubstituteMaterialNo"] = dr["MaterialNo"]; + dr["SubstituteMaterialLevel"] = dr["MaterialLevel"]; + } + // 2013/02/25,Even,判斷替代料,替代料可為半成品或是物料 + else if (dr["SubstituteMaterialLevel"].ToString() == "0") // 為物料 + { + // 查詢替代料是否在物料主檔內,若無,則出現錯誤訊息 + drMTL = objMTL.GetMaterialBasis(dr["SubstituteMaterialNo"].ToString().ToUpper()); + if (drMTL["MaterialNo"] is DBNull == true) + { + errorFlag = true; + clsERP.combineException(ref aryException, mesmsg: " [%SubstituteMaterialNo%]:" + + dr["SubstituteMaterialNo"] + " [%MaterialNoNotExist%][%InMESSystem%]! [%SubstituteMaterialLevel%][%IsMaterial%]."); + goto SkipMaterialList; + } + else + { + dr["SubstituteMaterialNo"] = dr["SubstituteMaterialNo"].ToString().ToUpper(); + } + } + else // 為半成品 (SubstituteMaterialLevel = 1) + { + DataRow drPRD = null; + // 檢查物料是否存在於產品主檔 + using (var objPRD = new clsProduct()) + { + drPRD = objPRD.GetProduct(dr["SubstituteMaterialNo"].ToString().ToUpper()); + } + if (drPRD["ProductNo"] is DBNull == true) + { + errorFlag = true; + clsERP.combineException(ref aryException, mesmsg: " [%SubstituteMaterialNo%]:" + + dr["SubstituteMaterialNo"] + " [%ProductNoNotExist%][%InMESSystem%]! [%SubstituteMaterialLevel%][%IsProduct%]."); + goto SkipMaterialList; + } + else + { + dr["SubstituteMaterialNo"] = dr["SubstituteMaterialNo"].ToString().ToUpper(); + } + } + + if (dr["SubstituteStdQty"] is DBNull == true) + { + dr["SubstituteStdQty"] = dr["StdQty"]; + } + // 2019/12/16 OwenLiu, Mantis:0065576 , 工單整合(新增)時用料需求數支援單位轉換 + decimal decRequireQty = 0m; + if (dr["RequireQty"] is DBNull == true) + { + // ERP未傳入需求數(RequireQty) + // 2019/12/23 OwenLiu, Mantis:0065953 修正工單整合 用料清單單位轉換的問題 + dr["RequireQty"] = Operators.MultiplyObject(Operators.MultiplyObject(MOQty, dr["StdQty"]), Operators.AddObject(1, dr["DecreaseRate"])); + } + else + { + decRequireQty = Convert.ToDecimal(dr["RequireQty"]); + // 2019/12/23 OwenLiu, Mantis:0065953 修正工單整合 用料清單單位轉換的問題 + if (drMTL["UnitNo"].ToString().ToLower() != strMaterialUnit.ToLower()) + { + // 當用料清單和物料主檔的單位不同時 + using (var objUnit = new udUnitTransferFunction.clsUnitTransferFunction()) + { + var colParameters = new Collection(); + colParameters.Add(dr["MaterialNo"].ToString().ToUpper(), "ProductNo"); + colParameters.Add("*", "ProductVersion"); + try + { + dr["RequireQty"] = Convert.ToDouble(objUnit.EXETransferQty(strMaterialUnit.ToLower(), drMTL["UnitNo"].ToString().ToLower(), (double)decRequireQty, colParameters)); + } + catch (Exception ex) + { + errorFlag = true; + clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitNoDifferent%]" + " [%MaterialNo%]:" + + dr["MaterialNo"]); + clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitTransferFail%]" + " " + ex.Message); + } + } + } + else + { + dr["RequireQty"] = decRequireQty; + } + } + + // 檢查OPNo(用料作業站)是否存在 ----- + if (dr["OPNo"].ToString().ToUpper() != "LOTCREATE") + { + // 有傳入=>檢查OP主檔 + using (var objOP = new clsOpBasis()) + { + var drOP = objOP.GetOPBasis(dr["OPNo"].ToString().ToUpper()); + if (drOP["OPNo"] is DBNull == true) + { + // OP主檔未建立 + clsERP.combineException(ref aryException, mesmsg: "[%OPNoNotExist%]"); + } + } + } + } + } + else + { + // 用料清單為半成品 + using (var objPRD = new clsProduct()) + { + DataRow drPRD = null; + bool errorFlag = false; + dr["MONo"] = dr["MONo"].ToString().ToUpper(); + + drPRD = objPRD.GetProduct(dr["MaterialNo"].ToString().ToUpper()); + // (skip) MONo, MaterialLevel, STDQty, DecreaseRate, OPNo, Specified, PutinPlaceType, MOFlag, CountWay, Description, OrgMaterialNo, EX_MTLList1, EX_MTLList2, MaterialVersion + + // MaterialNo + if (drPRD["ProductNo"] is DBNull == true) + { + errorFlag = true; + clsERP.combineException(ref aryException, mesmsg: " [%MaterialNo%]:" + + dr["MaterialNo"] + " [%ProductNoNotExist%][%InMESSystem%]! [%MaterialLevel%][%IsProduct%]."); + goto SkipMaterialList; + } + else + { + dr["MaterialNo"] = dr["MaterialNo"].ToString().ToUpper(); + } + + // UnitNo + if (drPRD["UnitNo"].ToString().ToLower() != dr["UnitNo"].ToString().ToLower()) + { + // 當用料清單和物料主檔的單位不同時 + // 單位轉換 + using (var objUnit = new udUnitTransferFunction.clsUnitTransferFunction()) + { + var colParameters = new Collection(); + colParameters.Add(dr["MaterialNo"].ToString().ToUpper(), "ProductNo"); + colParameters.Add("*", "ProductVersion"); + + try + { + dr["StdQty"] = Convert.ToDouble(objUnit.EXETransferQty(strMaterialUnit.ToLower(), drPRD["UnitNo"].ToString().ToLower(), Convert.ToDouble(dr["StdQty"]), colParameters)); + + dr["SubstituteStdQty"] = Convert.ToDouble(objUnit.EXETransferQty(strMaterialUnit.ToLower(), drPRD["UnitNo"].ToString().ToLower(), Convert.ToDouble(dr["SubstituteStdQty"]), colParameters)); + + dr["UnitNo"] = drPRD["UnitNo"].ToString().ToLower(); + } + catch (Exception ex) + { + errorFlag = true; + clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitNoDifferent%]" + " [%MaterialNo%]:" + + dr["MaterialNo"]); + clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitTransferFail%]" + " " + ex.Message); + } + } + } + else + { + dr["UnitNo"] = dr["UnitNo"].ToString().ToLower(); + } + + // MaterialMONo (Default) + dr["MaterialMONo"] = "N/A"; + + // MaterialType + if (dr["MaterialType"] is DBNull == true) + { + dr["MaterialType"] = drPRD["ProductType"]; + } + else if (Convert.ToBoolean(Operators.ConditionalCompareObjectEqual(dr["MaterialType"].ToString().ToUpper(), drPRD["ProductType"], false))) + { + dr["MaterialType"] = dr["MaterialType"].ToString().ToUpper(); + } + else + { + clsERP.combineException(ref aryException, mesmsg: "[%MaterialListMaterialTypeDifferent%]" + " [%MaterialNo%]:" + + dr["MaterialNo"]); + } + + // CheckLotNo + dr["CheckLotNo"] = 1; // 半成品固定為1 + + // SubstituteMaterialNo + // ---2013/02/20,Even,替代料是否存在的檢查---- + if (dr["SubstituteMaterialNo"] is DBNull == true) + { + dr["SubstituteMaterialNo"] = dr["MaterialNo"]; + dr["SubstituteMaterialLevel"] = dr["MaterialLevel"]; + } + else + { + DataRow drMTL = null; + // 2013/02/25,Even,判斷替代料,替代料可為半成品或是物料 + if (dr["SubstituteMaterialLevel"].ToString() == "0") // 為物料 + { + // 查詢替代料是否在物料主檔內,若無,則出現錯誤訊息 + using (var objMTL = new clsMTLBasis()) + { + drMTL = objMTL.GetMaterialBasis(dr["SubstituteMaterialNo"].ToString().ToUpper()); + } + + if (drMTL["MaterialNo"] is DBNull == true) + { + errorFlag = true; + clsERP.combineException(ref aryException, mesmsg: " [%SubstituteMaterialNo%]:" + + dr["SubstituteMaterialNo"] + " [%MaterialNoNotExist%][%InMESSystem%]! [%SubstituteMaterialLevel%][%IsMaterial%]."); + goto SkipMaterialList; + } + else + { + dr["SubstituteMaterialNo"] = dr["SubstituteMaterialNo"].ToString().ToUpper(); + } + } + else // 為半成品 (SubstituteMaterialLevel = 1) + { + // 檢查物料是否存在於產品主檔 + drPRD = objPRD.GetProduct(dr["SubstituteMaterialNo"].ToString().ToUpper()); + if (drPRD["ProductNo"] is DBNull == true) + { + errorFlag = true; + clsERP.combineException(ref aryException, mesmsg: " [%SubstituteMaterialNo%]:" + + dr["SubstituteMaterialNo"] + " [%ProductNoNotExist%][%InMESSystem%]! [%SubstituteMaterialLevel%][%IsProduct%]."); + goto SkipMaterialList; + } + else + { + dr["SubstituteMaterialNo"] = dr["SubstituteMaterialNo"].ToString().ToUpper(); + } + } + } + + if (dr["SubstituteStdQty"] is DBNull == true) + { + dr["SubstituteStdQty"] = dr["StdQty"]; + } + + // 2019/12/16 OwenLiu, Mantis:0065576 , 工單整合(新增)時用料需求數支援單位轉換 + decimal decRequireQty = 0m; + if (dr["RequireQty"] is DBNull == true) + { + // ERP未傳入需求數(RequireQty) + // 2019/12/23 OwenLiu, Mantis:0065953 修正工單整合 用料清單單位轉換的問題 + dr["RequireQty"] = Operators.MultiplyObject(Operators.MultiplyObject(MOQty, dr["StdQty"]), Operators.AddObject(1, dr["DecreaseRate"])); + } + else + { + decRequireQty = Convert.ToDecimal(dr["RequireQty"]); + // 2019/12/23 OwenLiu, Mantis:0065953 修正工單整合 用料清單單位轉換的問題 + if (drPRD["UnitNo"].ToString().ToLower() != strMaterialUnit.ToLower()) + { + // 當用料清單和產品主檔的單位不同時 + using (var objUnit = new udUnitTransferFunction.clsUnitTransferFunction()) + { + var colParameters = new Collection(); + colParameters.Add(dr["MaterialNo"].ToString().ToUpper(), "ProductNo"); + colParameters.Add("*", "ProductVersion"); + try + { + dr["RequireQty"] = Convert.ToDouble(objUnit.EXETransferQty(strMaterialUnit.ToLower(), drPRD["UnitNo"].ToString().ToLower(), (double)decRequireQty, colParameters)); + } + catch (Exception ex) + { + errorFlag = true; + clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitNoDifferent%]" + " [%MaterialNo%]:" + + dr["MaterialNo"]); + clsERP.combineException(ref aryException, mesmsg: "[%MaterialListUnitTransferFail%]" + " " + ex.Message); + } + } + } + else + { + dr["RequireQty"] = decRequireQty; + } + } + + // 檢查OPNo(用料作業站)是否存在 ----- + if (dr["OPNo"].ToString().ToUpper() != "LOTCREATE") + { + // 有傳入=>檢查OP主檔 + using (var objOP = new clsOpBasis()) + { + var drOP = objOP.GetOPBasis(dr["OPNo"].ToString().ToUpper()); + if (drOP["OPNo"] is DBNull == true) + { + // OP主檔未建立 + clsERP.combineException(ref aryException, mesmsg: "[%OPNoNotExist%]"); + } + } + } + } + } + + SkipMaterialList: + ; + } + + catch (Exception ex) + { + clsERP.combineException(ref aryException, sysmsg: ex.Message, mesmsg: "[%doMaterialListFail%]", stack: iMESCore.Base.iMESComXML.CInput(ex.StackTrace)); + } + } + + } + + // ----- 8. 取得FactoryNo ----- + // FactoryNo = "N/A" + + // ----- 檢查MO Property --- + if (!(dtMOProperty == null) && dtMOProperty.Rows.Count > 0) + { + foreach (DataRow dr in dtMOProperty.Rows) + { + List argaryMessage = null; + List argaryException = null; + doSYSMOProperty(Convert.ToString(dr["PropertyNo"]), Convert.ToString(dr["DataType"]), aryMessage: argaryMessage, aryException: argaryException); + } + } + + // ----- 9. 檢查OPNo(用料作業站)是否存在 ----- + if (dtMTL.Rows.Count > 0) + { + + // dtMTL.Columns.Add("MaterialMONo", System.Type.GetType("System.String")) + + // dtMTL: MONo, MaterialNo, MaterialLevel, StdQty, UnitNo, OPNo, PutInPlaceType, DecreaseRate, Specified, *MaterialType, CountWay, *CheckLotNo, *MaterialVersion, +MaterialMONo + + foreach (DataRow dr in dtMTL.Rows) + { + try + { + // OPyNo <> "LOTCREATE" + if (dr["OPNo"].ToString() != OPNo.ToString()) + { + // 有傳入=>檢查OP主檔 + using (var objOP = new clsOpBasis()) + { + var drOP = objOP.GetOPBasis(dr["OPNo"].ToString()); + if (drOP["OPNo"] is DBNull == true) + { + // OP主檔未建立 + clsERP.combineException(ref aryException, mesmsg: "[%OPNoNotExist%]"); + } + } + } + } + catch (Exception ex) + { + clsERP.combineException(ref aryException, sysmsg: ex.Message, mesmsg: "[%doMaterialListFail%]", stack: iMESCore.Base.iMESComXML.CInput(ex.StackTrace)); + } + } + } + + + // ----- Exception => Fail ----- + if (aryException.Count > 0) + goto exitfun; + + // ----- Edit MO ----- + AppSettings objSetting = new AppSettings(); + // Using cn As New OleDbConnection(objSetting.GetConnectionString) + // Using cmd As New OleDbCommand("", cn) + // cn.Open() + // Using trans As OleDbTransaction = cn.BeginTransaction + // cmd.Transaction = trans + try + { + // ----- MO ----- + // edit MO Basis + strSQL = "update tbloemobasis set " + "moqty=" + MOQty + ", " + "unreleaselotqty=" + (MOQty - ReleaseQty) + ", " + "priority=" + Priority + ", " + "planfinishdate=To_Date('" + Strings.Format(PlanFinishDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), " + "description=N'" + Description + "' "; + + // 2018/3/19 Vick 新增欄位 ERPMOLineNo + if (ERPMOLineNo != defString) + { + strSQL += ",ERPMOLineNo ='" + ERPMOLineNo + "' "; + } + if (PlanStartDate != defDateTime) + { + strSQL += ",PlanStartDate = To_Date('" + Strings.Format(PlanStartDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; + } + strSQL += "where mono='" + MONo.ToUpper() + "'"; + + CollectionSQL.Add(strSQL); + // cmd.CommandText = _ + // "update tbloemobasis set " & _ + // "moqty=?, " & _ + // "unreleaselotqty=?, " & _ + // "priority=?, " & _ + // "planfinishdate=?, " & _ + // "description=? " & _ + // "where mono=?" + // cmd.Parameters.AddWithValue(":MOQty", MOQty) + // cmd.Parameters.AddWithValue(":UnReleaseLotQty", MOQty - ReleaseQty) 'UNRELEASELOTQTY + // cmd.Parameters.AddWithValue(":Priority", Priority) + // cmd.Parameters.AddWithValue(":PlanFinishDate", PlanFinishDate) + // cmd.Parameters.AddWithValue(":Description", Description) + // cmd.Parameters.AddWithValue(":MONo", MONo.ToUpper) + // cmd.ExecuteNonQuery() + // cmd.Parameters.Clear() + + // add MO Component + + + // add MO Material List + // dtMTL: MONo, MaterialNo, MaterialLevel, StdQty, UnitNo, OPNo, PutInPlaceType, DecreaseRate, Specified, *MaterialType, CountWay, *CheckLotNo, *MaterialVersion, +MaterialMONo, +*SubstituteMaterialNo + if (dtMTL.Rows.Count > 0) + { + + using (var objOE = new clsOEBasis()) + { + + var dtTemp = objOE.ShowMOMaterialList(MONo.ToUpper()).Tables["MOMaterialList"]; + + strSQL = "delete from tbloemomateriallist where mono='" + MONo.ToUpper() + "'"; + CollectionSQL.Add(strSQL); + // cmd.CommandText = _ + // "delete from tbloemomateriallist where mono=?" + // cmd.Parameters.AddWithValue(":MONo", MONo.ToUpper) + // cmd.ExecuteNonQuery() + // cmd.Parameters.Clear() + + foreach (DataRow dr in dtMTL.Rows) + { + + bool blnAddMaterial = true; // 是否將工單用料加入tblOEMOMaterialList, True:是 False:否 + + // 2019/09/25 Grace 增加檢查, 若有傳入DeliveryMethod且值=4, 這筆工單用料清單, 不加入至tblOEMOMaterialList;否或非4則不做任何處理 + // 材料型態tagname:DeliveryMethod (Optional參數,非必傳) + if (!(dr["DeliveryMethod"] is DBNull)) + { + if (dr["DeliveryMethod"].ToString() == "4") + { + blnAddMaterial = false; + } + } + + if (blnAddMaterial) + { + strSQL = "insert into tbloemomateriallist(mono,materialno,materiallevel,stdqty,unitno,opno,putinplacetype," + + "decreaserate,specified,materialtype,countway,checklotno,materialversion,materialmono,substitutematerialno,SubstituteMaterialLevel,SubstituteStdQty,RequireQty,mainItem,phantomItem,lockRequirement,operationSeqnum) " + + "values('" + dr["MONo"].ToString().ToUpper() + "','" + dr["MaterialNo"].ToString().ToUpper() + "'," + dr["MaterialLevel"] + "," + dr["StdQty"] + ",'" + dr["UnitNo"].ToString().ToLower() + + "','" + dr["OPNo"].ToString().ToUpper() + "'," + dr["PutInPlaceType"] + "," + dr["DecreaseRate"] + "," + dr["Specified"] + ",'" + dr["MaterialType"].ToString().ToUpper() + "'," + dr["CountWay"] + + "," + dr["CheckLotNo"] + ",'" + dr["MaterialVersion"] + "','" + dr["MaterialMONo"] + "','" + dr["SubstituteMaterialNo"].ToString().ToUpper() + "'," + dr["SubstituteMaterialLevel"] + "," + dr["SubstituteStdQty"] + "," + dr["RequireQty"] + ",'" + dr["mainItem"] + "','" + dr["phantomItem"] + "','" + dr["lockRequirement"] + "','" + dr["operationSeqnum"] + "')"; + CollectionSQL.Add(strSQL); + // cmd.CommandText = _ + // "insert into tbloemomateriallist(mono,materialno,materiallevel,stdqty,unitno,opno,putinplacetype," & _ + // "decreaserate,specified,materialtype,countway,checklotno,materialversion,materialmono,substitutematerialno,SubstituteMaterialLevel,SubstituteStdQty,RequireQty) " & _ + // "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" + // cmd.Parameters.AddWithValue(":MONo", dr["MONo").ToString.ToUpper) + // cmd.Parameters.AddWithValue(":MaterialNo", dr["MaterialNo").ToString.ToUpper) + // cmd.Parameters.AddWithValue(":MaterialLevel", dr["MaterialLevel")) + // cmd.Parameters.AddWithValue(":StdQty", dr["StdQty")) + // cmd.Parameters.AddWithValue(":UnitNo", dr["UnitNo").ToString.ToLower) + // cmd.Parameters.AddWithValue(":OPNo", dr["OPNo").ToString.ToUpper) + // cmd.Parameters.AddWithValue(":PutInPlaceType", dr["PutInPlaceType")) + // cmd.Parameters.AddWithValue(":DecreaseRate", dr["DecreaseRate")) + // cmd.Parameters.AddWithValue(":Specified", dr["Specified")) + // cmd.Parameters.AddWithValue(":MaterialType", dr["MaterialType").ToString.ToUpper) + // cmd.Parameters.AddWithValue(":CountWay", dr["CountWay")) + // cmd.Parameters.AddWithValue(":CheckLotNo", dr["CheckLotNo")) + // cmd.Parameters.AddWithValue(":MaterialVersion", dr["MaterialVersion")) + // cmd.Parameters.AddWithValue(":MaterialMONo", dr["MaterialMONo")) + // cmd.Parameters.AddWithValue(":SubstituteMaterialNo", dr["SubstituteMaterialNo").ToString.ToUpper) + // cmd.Parameters.AddWithValue(":SubstituteMaterialLevel", dr["SubstituteMaterialLevel")) '2012/12/26,Even,新增替代物料階 &數量 + // cmd.Parameters.AddWithValue(":SubstituteStdQty", dr["SubstituteStdQty")) '2012/12/28,Even,新增替代物標準數 + // cmd.Parameters.AddWithValue(":RequireQty", dr["RequireQty")) + // cmd.ExecuteNonQuery() + // cmd.Parameters.Clear() + + } + // 將舊的OrgMaterialQty資料更新到tbloemomateriallist + DataRow[] drTemp = dtTemp.Select("MONo='" + dr["MONo"].ToString().ToUpper() + "'" + " And MaterialNo='" + dr["MaterialNo"].ToString().ToUpper() + "'" + " And OPNo='" + + dr["OPNo"] + "'" + " And SubstituteMaterialNo='" + dr["SubstituteMaterialNo"].ToString().ToUpper() + "'"); + + foreach (DataRow drOrgMaterialQty in drTemp) + { + strSQL = "update tbloemomateriallist set orgmaterialqty=" + drOrgMaterialQty["OrgMaterialQty"] + + " where mono='" + dr["MONo"].ToString().ToUpper() + "' and materialno='" + dr["MaterialNo"].ToString().ToUpper() + + "' and opno='" + dr["OPNo"].ToString().ToUpper() + "' and substitutematerialno='" + dr["SubstituteMaterialNo"].ToString().ToUpper() + "'"; + CollectionSQL.Add(strSQL); + // cmd.CommandText = _ + // "update tbloemomateriallist set orgmaterialqty=?" & _ + // " where mono=? and materialno=? and opno=? and substitutematerialno=?" + // cmd.Parameters.AddWithValue(":OrgMaterialQty", drOrgMaterialQty("OrgMaterialQty")) + // cmd.Parameters.AddWithValue(":MONo", dr["MONo").ToString.ToUpper) + // cmd.Parameters.AddWithValue(":MaterialNo", dr["MaterialNo").ToString.ToUpper) + // cmd.Parameters.AddWithValue(":OPNo", dr["OPNo").ToString.ToUpper) + // cmd.Parameters.AddWithValue(":SubstituteMaterialNo", dr["SubstituteMaterialNo").ToString.ToUpper) + // cmd.ExecuteNonQuery() + // cmd.Parameters.Clear() + } + + } + } + } + + + // add MO Process + // 依目前規格書之「工單變更」: + // 「4.1 單頭只能修改數量(MOQty)與預定完工日(PlanFinishDate)兩個欄位」, + // 故工單流程暫不做修改 + + + // add MO Property + if (dtMOProperty.Rows.Count > 0) + { + if (PropertyFlag) // haoqian 221025 + { + strSQL = "delete from tbloemoproperty where mono='" + MONo.ToUpper() + "'"; + CollectionSQL.Add(strSQL); + // cmd.CommandText = "delete from tbloemoproperty where mono=?" + // cmd.Parameters.AddWithValue(":MONo", MONo.ToUpper) + // cmd.ExecuteNonQuery() + // cmd.Parameters.Clear() + + strSQL = "delete from tbloemoproperty_recive where mono='" + MONo.ToUpper() + "'"; + CollectionSQL.Add(strSQL); + // cmd.CommandText = "delete from tbloemoproperty_recive where mono=?" + // cmd.Parameters.AddWithValue(":MONo", MONo.ToUpper) + // cmd.ExecuteNonQuery() + // cmd.Parameters.Clear() + + foreach (DataRow dr in dtMOProperty.Rows) + { + strSQL = "insert into tbloemoproperty(mono,propertyno,propertyvalue) values('" + dr["MONo"].ToString().ToUpper() + "','" + dr["PropertyNo"] + "','" + dr["PropertyValue"] + "')"; + CollectionSQL.Add(strSQL); + // cmd.Parameters.AddWithValue(":MONo", dr["MONo").ToString.ToUpper) + // cmd.Parameters.AddWithValue(":PropertyNo", dr["PropertyNo")) + // cmd.Parameters.AddWithValue(":PropertyValue", dr["PropertyValue")) + // cmd.CommandText = "insert into tbloemoproperty(mono,propertyno,propertyvalue) values(?,?,?)" + // cmd.ExecuteNonQuery() + // cmd.Parameters.Clear() + strSQL = "insert into tbloemoproperty_recive(mono,propertyno,propertyvalue) values('" + dr["MONo"].ToString().ToUpper() + "','" + dr["PropertyNo"] + "','" + dr["PropertyValue"] + "')"; + CollectionSQL.Add(strSQL); + // cmd.Parameters.AddWithValue(":MONo", dr["MONo").ToString.ToUpper) + // cmd.Parameters.AddWithValue(":PropertyNo", dr["PropertyNo")) + // cmd.Parameters.AddWithValue(":PropertyValue", dr["PropertyValue")) + // cmd.CommandText = "insert into tbloemoproperty_recive(mono,propertyno,propertyvalue) values(?,?,?)" + // cmd.ExecuteNonQuery() + // cmd.Parameters.Clear() + } + } + else // haoqian 221025 + { + foreach (DataRow dr in dtMOProperty.Rows) + { + strSQL = "update tbloemoproperty set propertyvalue = '" + dr["PropertyValue"] + "' where mono = '" + dr["MONo"].ToString().ToUpper() + "' and propertyno = '" + dr["PropertyNo"] + "'"; + CollectionSQL.Add(strSQL); + + strSQL = "update tbloemoproperty_recive set propertyvalue = '" + dr["PropertyValue"] + "' where mono = '" + dr["MONo"].ToString().ToUpper() + "' and propertyno = '" + dr["PropertyNo"] + "'"; + CollectionSQL.Add(strSQL); + + } + + } + } + + // 78079 + // ----- MOComponent ----- + // edit MO Component + using (var objOE = new clsOEBasis()) + { + using (var objSYS = new clsSYSEng()) + { + // Dim drOE As DataRow = objOE.GetMOBasis(MONo.ToUpper) + var dsOEMOC = objOE.ShowMOComponent(MONo.ToUpper()); + if (dsOEMOC.Tables[0].Rows.Count > 0) + { + if (MOQty > dsOEMOC.Tables[0].Rows.Count) + { + var dsCreateComponentNo = new DataSet(); + dsCreateComponentNo = objSYS.InitComponentNo(true, (int)Math.Round(MOQty - dsOEMOC.Tables[0].Rows.Count), MONo.ToUpper(), FactoryNo, CustomerNo, ProductNo, ProductVersion); + if (!(dsCreateComponentNo.Tables == null) && dsCreateComponentNo.Tables[0].Rows.Count > 0) + { + for (int i = 1, loopTo = dsCreateComponentNo.Tables[0].Rows.Count; i <= loopTo; i++) // MOQty - dsOEMOC.Tables[0].Rows.Count + { + strSQL = "Insert into tblOEMOComponent (MoNo, ComponentNo, GoodQty, UnitNo, ReleaseState)" + + " Values ('" + MONo.ToUpper() + "', '" + dsCreateComponentNo.Tables[0].Rows[i - 1]["ComponentNo"].ToString() + "'," + + dsOEMOC.Tables[0].Rows[0]["GoodQty"] + ",'" + dsOEMOC.Tables[0].Rows[0]["UnitNo"] + "', 0)"; + CollectionSQL.Add(strSQL); + } + } + if (dsCreateComponentNo != null) + dsCreateComponentNo = null; + } + } + if (dsOEMOC != null) + dsOEMOC = null; + } + } + + // add MO SEMI Out + + // trans.Commit() + //string argstrDataBaseType = "Null"; + ExecuteSQLNoneQuery_UPD(objSetting.GetDataBaseType(), objSetting.GetConnectionString(), CollectionSQL); + r = true; + clsERP.combineMessage(ref aryMessage, mmsg: "[%EditMOSuccess%]"); + } + catch (Exception ex) + { + // trans.Rollback() + clsERP.combineException(ref aryException, sysmsg: ex.Message, mesmsg: "[%EditMOFail%]", stack: iMESCore.Base.iMESComXML.CInput(ex.StackTrace)); + + } + // End Using + // End Using + // End Using + + exitfun: + ; + } + + + catch (Exception ex) + { + clsERP.combineException(ref aryException, sysmsg: ex.Message, mesmsg: "[%EditMOFail%]", stack: iMESCore.Base.iMESComXML.CInput(ex.StackTrace)); + } + finally + { + editMORet = r; + } + + return editMORet; + + } + + /// + /// 檢查SYS模組裡的工單屬性 + /// + /// + /// + /// + /// + /// + /// + /// + public static object doSYSMOProperty(string PropertyNo, string DataType, int IssueState = 2, List aryMessage = null, List aryException = null) + { + object doSYSMOPropertyRet = default(object); + bool r = false; + try + { + + // ----- 檢查MOProperty是否存在 ----- + using (var objSYS = new clsSYSEng()) + { + + var dr = objSYS.GetMOProperty(PropertyNo); + + // ----- MOProperty已存在 ----- + if (dr["PropertyNo"] is DBNull == false) + { + r = true; + goto exitfun; + } + + // ----- MOProperty不存在=>新增MOProperty ----- + // DataType: 0:Numeric, 1:String, 2:Percent, 3:DateTime, 4:Boolean + int intType = 1; + switch (DataType.ToUpper()) + { + case "NUMERIC": + { + intType = 0; + break; + } + case "STRING": + { + intType = 1; + break; + } + case "PERCENT": + { + intType = 2; + break; + } + case "DATETIME": + { + intType = 3; + break; + } + case "BOOLEAN": + { + intType = 4; + break; + } + + default: + { + intType = 1; // 預設為String + break; + } + } + + try + { + objSYS.AddMOProperty(PropertyNo, PropertyNo, intType, 0); + objSYS.SetMOPropertyIssueState(PropertyNo, IssueState); + clsERP.combineMessage(ref aryMessage, mmsg: "[%AddSYSMOPropertySuccess%]"); + } + catch (Exception ex) + { + clsERP.combineException(ref aryException, sysmsg: ex.Message, mesmsg: "[%AddSYSMOPropertyFail%]"); + goto exitfun; + } + + r = true; + + } + + exitfun: + ; + } + + + catch (Exception ex) + { + clsERP.combineException(ref aryException, sysmsg: ex.Message, mesmsg: "[%doSYSMOPropertyFail%]", stack: iMESCore.Base.iMESComXML.CInput(ex.StackTrace)); + } + finally + { + doSYSMOPropertyRet = r; + } + + return doSYSMOPropertyRet; + } + /// + /// 檢查工廠編號是否存在;不存在=>新增 + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static object doFactoryNo(string FactoryNo, string Creator, DateTime CreateDate, int IssueState = 2, List strMessage = null, List strException = null) + { + object doFactoryNoRet = default(object); + bool r = false; + try + { + + // ----- 檢查工廠編號是否存在 ----- + using (var objSMD = new clsSMDBasis()) + { + + var dr = objSMD.GetFactoryBasis(FactoryNo.ToUpper()); + + // ----- 工廠編號已存在 ----- + if (dr["FactoryNo"] is DBNull == false) + goto exitfun; + + // ----- 工廠編號不存在=>新增工廠編號 ----- + try + { + objSMD.AddFactoryBasis(FactoryNo.ToUpper(), "(from ERP)", Creator: Creator, CreateDate: CreateDate); + objSMD.SetFactoryBasisIssueState(FactoryNo.ToUpper(), IssueState); + clsERP.combineMessage(ref strMessage, mmsg: "[%AddFactoryNoSuccess%]"); + } + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%AddFactoryNoFail%]", stack: iMESCore.Base.iMESComXML.CInput(ex.StackTrace)); + goto exitfun; + } + } + r = true; + exitfun: + ; + } + + + catch (Exception ex) + { + clsERP.combineException(ref strException, sysmsg: ex.Message, mesmsg: "[%doFactoryFail%]", stack: iMESCore.Base.iMESComXML.CInput(ex.StackTrace)); + } + finally + { + doFactoryNoRet = r; + } + + return doFactoryNoRet; + } + private static bool ExamineMOProcess(string MONo, string ProductNo, string ProductVersion, int MOTypeNo, ref Collection colSQL, ref List aryException, string CustomerLotNo = null) + { + + bool blnExecResult = false; + AppSettings objSetting = new AppSettings(); + IDbConnection cnnTemp = null; + string strSQL = "", strSQLAddField = "", strSQLAddValue = ""; + var CollectionSQL = new Collection(); + string CustomerNo = "", DeviceNo = ""; + + try + { + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + DbDataReader drTemp; + + // 1.依據工單類型(MOTypeNo)找出預設的流程編號 + // 先查詢指定的工單類型,找不到再用MOType=*的資料(MOTypeNo =-1) + var dtPRDPSNoList = new DataTable(); + var dtPorductProcess = new DataTable(); + strSQL = "select CustomerNo,DeviceNo from tblPRDProductBasis where ProductNo = '" + ProductNo + "' And ProductVersion = '" + ProductVersion + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + CustomerNo = drTemp["CustomerNo"].ToString(); + DeviceNo = drTemp["DeviceNo"].ToString(); + } + drTemp.Close(); + + strSQL = "SELECT PSNo FROM (" + " SELECT PSNo,Min(PSOrder) AS PSOrder FROM tblPRDProductProcess" + " WHERE ProductNo = '" + ProductNo + "' AND ProductVersion = '" + ProductVersion + "'" + " GROUP BY PSNo )A ORDER BY PSOrder"; + //using (var daTemp = new OleDbDataAdapter(strSQL, cnnTemp)) + //{ + // daTemp.Fill(dtPRDPSNoList); + //} + ExecuteSQLQuery_Adapter(strSQL, dtPRDPSNoList, cnnTemp); + + foreach (DataRow drData in dtPRDPSNoList.Rows) + { + var dtSinglePSNoProcess = new DataTable(); + strSQL = "SELECT * FROM tblPRDProductProcess" + " WHERE ProductNo = '" + ProductNo + "' AND ProductVersion = '" + ProductVersion + "'" + " AND MOTypeNo = " + MOTypeNo + " AND DefaultProcess = 1" + " AND PSNo = '" + + drData["PSNo"] + "' ORDER BY PSOrder"; + //using (var daTemp = new OleDbDataAdapter(strSQL, cnnTemp)) + //{ + // daTemp.Fill(dtSinglePSNoProcess); + //} + ExecuteSQLQuery_Adapter(strSQL, dtSinglePSNoProcess, cnnTemp); + + if (dtSinglePSNoProcess.Rows.Count.Equals(0)) + { + strSQL = "SELECT * FROM tblPRDProductProcess" + " WHERE ProductNo = '" + ProductNo + "' AND ProductVersion = '" + ProductVersion + "'" + " AND MOTypeNo = -1 AND DefaultProcess = 1" + " AND PSNo = '" + + drData["PSNo"] + "' ORDER BY PSOrder"; + //using (var daTemp = new OleDbDataAdapter(strSQL, cnnTemp)) + //{ + // daTemp.Fill(dtSinglePSNoProcess); + //} + ExecuteSQLQuery_Adapter(strSQL, dtSinglePSNoProcess, cnnTemp); + } + dtPorductProcess.Merge(dtSinglePSNoProcess); + } + + dtPRDPSNoList.Dispose(); + + + if (CustomerNo != "N/A" && DeviceNo != "N/A") + { + string strMOTypeNo = MOTypeNo.ToString(); + DataSet dsECN = new DataSet(); + var dtECN = new DataTable(); + var dtNewPorductProcess = new DataTable(); + DataRow drECN; + + dtECN.Columns.Add("MONo", Type.GetType("System.String")); + dtECN.Columns.Add("CustomerLotNo", Type.GetType("System.String")); + + drECN = dtECN.NewRow(); + drECN["MONo"] = MONo; + drECN["CustomerLotNo"] = CustomerLotNo; + dtECN.Rows.Add(drECN); + + dsECN = ShowECNProcessData(ProductNo, ProductVersion, strMOTypeNo, ref aryException, dtECN); + + if (aryException.Count <= 0) + { + short intProcessOrder = 1; + foreach (DataRow drProcess in dsECN.Tables["tblECNProcessData"].Rows) + { + string strProcessNo = drProcess["ProcessNo"].ToString(); + string strProcessVersion = drProcess["ProcessVersion"].ToString(); + + + strSQL = "SELECT * FROM tblPRDProductProcess" + " WHERE ProductNo = '" + ProductNo + "' AND ProductVersion = '" + ProductVersion + "'" + " And ProcessNo = '" + + strProcessNo + "'" + " AND ProcessVersion = '" + strProcessVersion + "' AND MOTypeNo = " + MOTypeNo + ""; + ExecuteSQLQuery_Adapter(strSQL, dtNewPorductProcess, cnnTemp); + } + foreach (DataRow drNewProcess in dtNewPorductProcess.Rows) + { + + // 以指定流程版本新增工單流程 + strSQL = "SELECT B.ProcessNo, B.ProcessVersion, B.NodeNo, B.NodeId" + " FROM tblPRSProcessBasis A join tblPRSNodeBasis B ON A.ProcessNo = B.ProcessNo AND A.ProcessVersion = B.ProcessVersion" + " WHERE A.ProcessNo = '" + + drNewProcess["ProcessNo"].ToString() + "'" + " AND A.ProcessVersion = '" + drNewProcess["ProcessVersion"].ToString() + "'" + " AND B.NodeId = (" + " SELECT Min(B.ToNodeId)" + + " FROM tblPRSProcessBasis A join tblPRSNodeRelation B ON A.ProcessNo = B.ProcessNo AND A.ProcessVersion = B.ProcessVersion" + " WHERE A.ProcessNo = '" + + drNewProcess["ProcessNo"].ToString() + "'" + " AND A.ProcessVersion = '" + drNewProcess["ProcessVersion"].ToString() + "'" + " And B.FromNodeNo = 'START' GROUP BY A.ProcessNo)"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // 應該只有一筆資料,每一個流程也只需要新增一筆資料 + // 2019/01/23 OwenLiu, 修正工單流程存入ProcessVersion 為 * 的問題 + strSQLAddField = "INSERT INTO tblOEMOProcess (MONo,PSNo,PSOrder,ProcessOrder,ProcessNo,ProcessVersion"; + strSQLAddValue = " VALUES ('" + MONo + "','" + + drNewProcess["PSNo"] + "'," + drNewProcess["PSOrder"] + "," + intProcessOrder.ToString() + ",'" + drNewProcess["ProcessNo"].ToString() + "'" + ",'" + drTemp["ProcessVersion"].ToString() + + "'"; + + strSQLAddField += ",OPNo,NodeId,HaveComponent,HaveLevel"; + strSQLAddValue = strSQLAddValue + ",'" + + drTemp["NodeNo"] + "','" + drTemp["NodeId"] + "'" + "," + drNewProcess["HaveComponent"] + "," + drNewProcess["HaveLevel"]; + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + intProcessOrder = (short)(intProcessOrder + 1); + } + drTemp.Close(); + } + } + } + else + { + short intProcessOrder = 1; + foreach (DataRow drProcess in dtPorductProcess.Rows) + { + string strProcessNo = drProcess["ProcessNo"].ToString(); + string strProcessVersion = drProcess["ProcessVersion"].ToString(); + if (strProcessVersion == "*") + { + // 以目前最新流程新增工單流程 + strSQL = "SELECT B.ProcessNo, B.ProcessVersion, B.NodeNo, B.NodeId" + " FROM tblPRSProcessBasis A join tblPRSNodeBasis B ON A.ProcessNo = B.ProcessNo AND A.ProcessVersion = B.ProcessVersion" + " WHERE A.ProcessNo = '" + + drProcess["ProcessNo"] + "' AND A.CurVersion = 1" + " AND B.NodeId = (" + " SELECT Min(B.ToNodeId)" + " FROM tblPRSProcessBasis A join tblPRSNodeRelation B ON A.ProcessNo = B.ProcessNo AND A.ProcessVersion = B.ProcessVersion" + + " WHERE A.ProcessNo = '" + drProcess["ProcessNo"] + "' AND A.CurVersion = 1" + " AND B.FromNodeNo = 'START' GROUP BY A.ProcessNo)"; + } + else + { + // 以指定流程版本新增工單流程 + strSQL = "SELECT B.ProcessNo, B.ProcessVersion, B.NodeNo, B.NodeId" + " FROM tblPRSProcessBasis A join tblPRSNodeBasis B ON A.ProcessNo = B.ProcessNo AND A.ProcessVersion = B.ProcessVersion" + " WHERE A.ProcessNo = '" + + drProcess["ProcessNo"] + "'" + " AND A.ProcessVersion = '" + strProcessVersion + "'" + " AND B.NodeId = (" + " SELECT Min(B.ToNodeId)" + + " FROM tblPRSProcessBasis A join tblPRSNodeRelation B ON A.ProcessNo = B.ProcessNo AND A.ProcessVersion = B.ProcessVersion" + " WHERE A.ProcessNo = '" + + drProcess["ProcessNo"] + "'" + " AND A.ProcessVersion = '" + strProcessVersion + "'" + " And B.FromNodeNo = 'START' GROUP BY A.ProcessNo)"; + } + + //using (var cmdProcess = new OleDbCommand(strSQL, cnnTemp)) + //{ + //var drTemp = cmdProcess.ExecuteReader(); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // 應該只有一筆資料,每一個流程也只需要新增一筆資料 + // 2019/01/23 OwenLiu, 修正工單流程存入ProcessVersion 為 * 的問題 + strSQLAddField = "INSERT INTO tblOEMOProcess (MONo,PSNo,PSOrder,ProcessOrder,ProcessNo,ProcessVersion"; + strSQLAddValue = " VALUES ('" + MONo + "','" + + drProcess["PSNo"] + "'," + drProcess["PSOrder"] + "," + intProcessOrder.ToString() + ",'" + strProcessNo + "'" + ",'" + drTemp["ProcessVersion"].ToString() + + "'"; + + strSQLAddField += ",OPNo,NodeId,HaveComponent,HaveLevel"; + strSQLAddValue = strSQLAddValue + ",'" + + drTemp["NodeNo"] + "','" + drTemp["NodeId"] + "'" + "," + drProcess["HaveComponent"] + "," + drProcess["HaveLevel"]; + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + intProcessOrder = (short)(intProcessOrder + 1); + } + drTemp.Close(); + //} + } + } + + + + + // 將收集到的SQL語句加以回傳,由呼叫端統一執行 + if (colSQL != null) + { + for (int i = 1, loopTo = CollectionSQL.Count; i <= loopTo; i++) + colSQL.Add(CollectionSQL[i]); + } + + blnExecResult = true; + } + catch (Exception ex) + { + clsERP.combineException(ref aryException, sysmsg: ex.Message, mesmsg: "[%ExamineMOProcess%]", stack: iMESCore.Base.iMESComXML.CInput(ex.StackTrace)); + } + finally + { + CloseConnection(cnnTemp); + } + + return default(bool); + + } + private static DataSet ShowECNProcessData(string ProductNo, string ProductVersion, string MOTypeNo, ref List aryException, DataTable dtECN) + { + DataSet ShowECNProcessDataRet = default(DataSet); + + // dtECN 傳入LotNo,OrgLotNo,CustomerLotNo,MONo 的資料只會有一筆 + + var CollectionSQL = new Collection(); + var CreateDate = DateTime.Now; + string strSQLAddField, strSQLAddValue; + string strSQL = ""; + var drTemp = default(DbDataReader); + DbDataReader drSEN; + DbDataReader drTECN; + DbDataReader drECN; + var dtProcess = new DataTable(); + string tblECNProcessData; + tblECNProcessData = "tblECNProcessData"; + dtProcess.TableName = tblECNProcessData; + dtProcess.Columns.Add("ECNNO", Type.GetType("System.String")); + dtProcess.Columns.Add("PROCESSNO", Type.GetType("System.String")); + dtProcess.Columns.Add("PROCESSVERSION", Type.GetType("System.String")); + dtProcess.Columns.Add("ECNTYPE", Type.GetType("System.String")); + + AppSettings objSetting = new AppSettings(); + bool blnAllProcess = false; // 用於判斷ECN是否有多條流程 + var cnnTemp = default(IDbConnection); + + try + { + string strDataBaseType = objSetting.GetDataBaseType(); + string strConnectionString = objSetting.GetConnectionString(strDataBaseType); + cnnTemp = CreateConnection(strConnectionString); + + DataSet dsTemp; + DataRow[] drSel; + + cnnTemp = CreateConnection(strConnectionString); + + // 檢查SEN + strSQL = "Select * from TBLPRDECNPROCESS where ProductNo='" + ProductNo + "' and productversion='" + ProductVersion + "' and ECNType='SEN' and ECNState=2 ORDER BY SENType Desc "; + dsTemp = new DataSet(); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TBLPRDECNPROCESS", cnnTemp); + + drSel = dsTemp.Tables["TBLPRDECNPROCESS"].Select(); + if (drSel.Length > 0) + { + foreach (DataRow r in drSel) + { + strSQL = "Select * from TBLPRDSENLOTDETAIL where ProductNo='" + ProductNo + "' and productversion='" + ProductVersion + "' and ECNNO='" + r["ECNNO"].ToString() + "'"; + ////cmmTemp = new IDbCommand(strSQL, cnnTemp); // Select data + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drTemp.Read()) // 比對有無相符的資料 + { + switch (drTemp["SENTYPE"].ToString()) + { + case "1": //客戶批號 + { + dtECN.DefaultView.RowFilter = "CustomerLotNo like '" + drTemp["LOTNO"].ToString() + "'"; + if (dtECN.DefaultView.Count == 1) + { + // 以ECNNO跟工單類型尋找 + strSQL = "Select * from TBLPRDMOPROCESS where ProductNo='" + ProductNo + "' and productversion='" + ProductVersion + "' and ECNNO='" + r["ECNNO"].ToString() + "' and MOTypeNo='" + MOTypeNo + "' "; + ////cmmTemp = new IDbCommand(strSQL, cnnTemp); // Select data + drSEN = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drSEN.Read()) + { + dtProcess.Rows.Add(r["ECNNO"].ToString(), drSEN["PROCESSNO"].ToString(), drSEN["PROCESSVERSION"], "SEN"); + blnAllProcess = true; + } + + // 若目前工單類型找不到資料以*尋找 + strSQL = "Select * from TBLPRDMOPROCESS where ProductNo='" + ProductNo + "' and productversion='" + ProductVersion + "' and ECNNO='" + r["ECNNO"].ToString() + "' and MOTypeNo='-1' "; + ////cmmTemp = new IDbCommand(strSQL, cnnTemp); // Select data + drSEN = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drSEN.Read()) + { + dtProcess.Rows.Add(r["ECNNO"].ToString(), drSEN["PROCESSNO"].ToString(), drSEN["PROCESSVERSION"], "SEN"); + blnAllProcess = true; + } + + + goto GoTonext; + } + + break; + } + case "0": //工單編號 + { + dtECN.DefaultView.RowFilter = "MONo like '" + drTemp["LOTNO"].ToString() + "'"; + if (dtECN.DefaultView.Count == 1) + { + // 以ECNNO跟工單類型尋找 + strSQL = "Select * from TBLPRDMOPROCESS where ProductNo='" + ProductNo + "' and productversion='" + ProductVersion + "' and ECNNO='" + r["ECNNO"].ToString() + "' and MOTypeNo='" + MOTypeNo + "' "; + ////cmmTemp = new IDbCommand(strSQL, cnnTemp); // Select data + drSEN = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drSEN.Read()) + { + dtProcess.Rows.Add(r["ECNNO"].ToString(), drSEN["PROCESSNO"].ToString(), drSEN["PROCESSVERSION"], "SEN"); + blnAllProcess = true; + } + + // 若目前工單類型找不到資料以*尋找 + strSQL = "Select * from TBLPRDMOPROCESS where ProductNo='" + ProductNo + "' and productversion='" + ProductVersion + "' and ECNNO='" + r["ECNNO"].ToString() + "' and MOTypeNo='-1' "; + ////cmmTemp = new IDbCommand(strSQL, cnnTemp); // Select data + drSEN = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drSEN.Read()) + { + dtProcess.Rows.Add(r["ECNNO"].ToString(), drSEN["PROCESSNO"].ToString(), drSEN["PROCESSVERSION"], "SEN"); + blnAllProcess = true; + } + + goto GoTonext; + } + + break; + } + + } + } + drTemp.Close(); + ////cmmTemp.Dispose(); + } + } + + if (dsTemp != null) + { + dsTemp.Dispose(); + } + + // 2020/03/17 Eric + if (blnAllProcess == true) + { + goto GoTonext; + } + + // 檢查TECN + strSQL = "Select * from TBLPRDECNPROCESS where ProductNo='" + ProductNo + "' and productversion='" + ProductVersion + "' and ECNType='TECN' and ECNState=2 " + "And StartTime <= To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') And EndTime > To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + // 2020/02/04 OwenLiu, 修正SQLServer 查詢問題 + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // 以ECNNO跟工單類型尋找 + strSQL = "Select * from TBLPRDMOPROCESS where ProductNo='" + ProductNo + "' and productversion='" + ProductVersion + "' and ECNNO='" + drTemp["ECNNO"].ToString() + "' and MOTypeNo='" + MOTypeNo + "' "; + drTECN = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drTECN.Read()) + { + dtProcess.Rows.Add(drTemp["ECNNO"].ToString(), drTECN["PROCESSNO"].ToString(), drTECN["PROCESSVERSION"], "TECN"); + blnAllProcess = true; + } + + // 若目前工單類型找不到資料以*尋找 + strSQL = "Select * from TBLPRDMOPROCESS where ProductNo='" + ProductNo + "' and productversion='" + ProductVersion + "' and ECNNO='" + drTemp["ECNNO"].ToString() + "' and MOTypeNo='-1' "; + ////cmmTemp = new IDbCommand(strSQL, cnnTemp); // Select data + drTECN = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drTECN.Read()) + { + dtProcess.Rows.Add(drTemp["ECNNO"].ToString(), drTECN["PROCESSNO"].ToString(), drTECN["PROCESSVERSION"], "TECN"); + blnAllProcess = true; + } + + // 若有ECNNO卻無流程編號及版本回拋錯誤 + goto GoTonext; + } + drTemp.Close(); + + // 2020/03/17 Eric + if (blnAllProcess == true) + { + goto GoTonext; + } + + // 檢查ECN + strSQL = "Select * from TBLPRDECNPROCESS where ProductNo='" + ProductNo + "' and productversion='" + ProductVersion + "' and ECNType='ECN' and ECNState=2 "; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // 以ECNNO跟工單類型尋找 + strSQL = "Select * from TBLPRDMOPROCESS where ProductNo='" + ProductNo + "' and productversion='" + ProductVersion + "' and ECNNO='" + drTemp["ECNNO"].ToString() + "' and MOTypeNo='" + MOTypeNo + "' "; + drECN = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drECN.Read()) + dtProcess.Rows.Add(drTemp["ECNNO"].ToString(), drECN["PROCESSNO"].ToString(), drECN["PROCESSVERSION"], "ECN"); + + // 若目前工單類型找不到資料以*尋找 + strSQL = "Select * from TBLPRDMOPROCESS where ProductNo='" + ProductNo + "' and productversion='" + ProductVersion + "' and ECNNO='" + drTemp["ECNNO"].ToString() + "' and MOTypeNo='-1' "; + drECN = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drECN.Read()) + dtProcess.Rows.Add(drTemp["ECNNO"].ToString(), drECN["PROCESSNO"].ToString(), drECN["PROCESSVERSION"], "ECN"); + + // 若有ECNNO卻無流程編號及版本回拋錯誤 + goto GoTonext; + } + + GoTonext: + ; + + drTemp.Close(); + + if (dtProcess.Rows.Count <= 0) { clsERP.combineException(ref aryException, mesmsg: "[%ProductNo%]:" + ProductNo + "[%CouldNotFindTheCorrespondingProcessData%]"); } //拋出找不到對應流程資料的錯誤,不允許新增工單 + + if (dsTemp != null) + { + dsTemp.Dispose(); + } + dsTemp.Tables.Add(dtProcess); + ShowECNProcessDataRet = dsTemp; + //LoadECNProcessDataRet = iMESCore.Base.iMESComXML.CombineXMLReturnValue("loadecnprocessdata", tblECNProcessData, "DataSet", iMESCore.Base.iMESComXML.FormatXMLSchema(dsTemp.GetXmlSchema()), dsTemp.GetXml(), ""); + } + + catch (Exception e1) + { + + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + throw; + + } + finally + { + if (cnnTemp != null) + { + CloseConnection(cnnTemp); + } + } + return ShowECNProcessDataRet; + + } + #endregion + } +} diff --git a/MESEAI/EAItc/clsSPC.cs b/MESEAI/EAItc/clsSPC.cs new file mode 100644 index 0000000..b79d1ff --- /dev/null +++ b/MESEAI/EAItc/clsSPC.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using Microsoft.VisualBasic; + +namespace tcEAI_C +{ + + public class clsSPC + { + public static string strDataBaseType; + public static string strConnectionString; + + private string Filepath_E = @"D:\Log\EAI_TC\"; // 指定Log + + public void SaveLog(string msg) + { + if (!Directory.Exists(Filepath_E)) + { + Directory.CreateDirectory(Filepath_E); + } + //{ + // var withBlock = My.MyProject.Application.Log.DefaultFileLogWriter; + // // If CInt(Format(Now, "mm")) >= 20 And CInt(Format(Now, "mm")) < 40 Then + // // .BaseFileName = "Log" & "_20" 'Log檔的檔名 + // // ElseIf CInt(Format(Now, "mm")) >= 40 Then + // // .BaseFileName = "Log" & "_40" 'Log檔的檔名 + // // Else + // withBlock.BaseFileName = "Log"; // & Format(Now, "mm") 'Log檔的檔名 + // // End If + // withBlock.CustomLocation = Filepath_E; // 自訂Log檔的存放路徑 + // withBlock.AutoFlush = true; // Log檔寫完後自動清除緩衝 + // withBlock.LogFileCreationSchedule = Microsoft.VisualBasic.Logging.LogFileCreationScheduleOption.Daily; // 設定一天產生一個Log檔 + // withBlock.MaxFileSize = long.MaxValue; // 預設容量5M 改為 最大容量 + //} + + //My.MyProject.Application.Log.WriteEntry(string.Format("{0} {1}", Strings.Format(DateTime.Now, "yy/MM/dd HH:mm:ss ffff,"), msg)); + } + + public void combineException(ref List strException, 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); + strException.Add(al); + result = true; + } + catch (Exception ex) + { + result = false; + } + } + + + } +} \ No newline at end of file diff --git a/MESEAI/EAItc/obj/Debug/.NETFramework,Version=v4.6.2.AssemblyAttributes.cs b/MESEAI/EAItc/obj/Debug/.NETFramework,Version=v4.6.2.AssemblyAttributes.cs new file mode 100644 index 0000000..edc4647 --- /dev/null +++ b/MESEAI/EAItc/obj/Debug/.NETFramework,Version=v4.6.2.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] diff --git a/MESEAI/EAItc/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/MESEAI/EAItc/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000000000000000000000000000000000000..6575b1b93e5d4d399f6f5e3096e970de31cecc75 GIT binary patch literal 6879 zcmeHMSyLNF5SBoU5f}#%f-%^RoH&OaWg{WLKot*IN304EN>U(ItV$m3j>MQfl$lvT zq4+KN1*!bRq^L+$#i|C{-&NvnJY<}reg@X_7SAF9=A-yD>#Y?w|O9Fv&n>3q@v(7Jtd#O;wRLy z+*4+5Ny+S*)ykbI=Acz_3T9_qr_LLBZm~IoIwm)%V%?e8D;MjYW#t96*{LgzyF+DK zgR$8wV|mvyVZYC@vrI*Usot`ZSCdTbf)e?XHyl^6EUQy+MZu8@?CV?CR{Z+zNo{rQ zsgL>XDxTfwzq~4L!9JzBW@eTPW++#1Ca0UGqN2p8Fpl=9I+D|kYaNqK;nu-JxT_h# z8eA&T>Mw}G#uP&rE`XxT&bWj!cWr3Lb@(w8FK+M7a@n+K3jwb$>;&3kd*PmN4JM^4 zw!nI>U{4Tooh8gHdXC~Y>nyphsqG~>?@3lyaq@K)Upipr^uvho%FbFpX+D_HI7*H zGc<7;#M7%*bSZt?8WMvUvp6H(Gc@koNoG(%XV&M?j@Xi0WENTz(3{lK$#iNx`UU(Q znuwtb@k{1VXs6t9ei$lD^Z5 zcc_}a)oem;L6LiDb_>`(S@?uiC8iW`EU5uy_ZwspRylwLdK-`l#Qnq|{{7k7>MOnH zxOnGafIMG1!k$;I9;V)QOn+i0g?dXR&_mqvQ^2HwV0Nja5AzIQ>_A|8+!hloPqa?~ zclI10&0rw~^EdY;Ae{t>l%@uaj zQ>y7Z?`uFaf<*h>wtS$ML2nCzwz=~MqDAoSFyu5tPBYN#eb6a^{~E4B)x?%#RmuNk z(=Mk_8qpKU!T0BJKx$_ybPh4lCp1(Qn|X*S%uMjj^Olz6J4H zAdmPMQg0vQJ7`4mP>u~F4fnbEWn;p~%Ww3?kf`GoL$Z$cl2;(+&oj5yhcC!$7@awP z#~pWNKCOjdO2Fa*wGC`3XcYr$CaRx)R6%=cz$WVA(N0c>tIP{;A@T<2CyC@FDeo|796Iq92Nvv6*i9~_v_Wi>yNgLRr@gId!G*H7H+LDjJA0X# zOPbKoiZ51tNU4ILh2ldIOC=4WVzp3;2!btAq=JGz2^K{V|2+6mXZCh;cYD{ua=UQ2 z4|hAa%eUX}`_1q7eS6d6IW+}9uOvx8PmO9X5W7TlD?WitNaH(>@7bNual7I+Fg+wH2|&z)4Y~y676&-#{^*oJ0x`b)cuAWX-1XCG=L(OqNnNB2 zT5ZL6v>HP`jBvqTpz;K-E^RAfzZ)?P%ci|(LCgY$Titi`WdFC_qaH{v+_aAM5^OtM zkDFb}CNNN5{^Iw!fsR!vPysHKR$WF?3r55uOvU*^7YLfSUs`vneG4FJwK4j z{Jrz(LOgN%z255w&zycS`TBt$Uh8`GiQiXNZ|=FXym~wF)gK>?T>tcHY;_pCbuBjd z=Czf?XQhK@S@z;Nn)&1cIr8haZ?@j}{L0$9FHbJtxbyG1SKdF{m)x@N>f?$2@t3|} z`!{^)IML9h=YL+i@WF39z3Kt>`)yU5no?_RAbuF;<5fq9&y3ugy?5Te{M0Ys-Iu-f zNAi%8NQ6^m?%FO}Dl{qtvBf}?`FmkV-CkHu zegBg{AxiGkI@4QF-f^>ISd>5FQhtc&nCgZQe0w9Pw}-M73lcsp1lmK5vIii1LmF`L zdJ|eoH)ewlXc6sn00!OUGMGV9CWt~6l6hpnU{!3)uUSAwlmZend2^c*uUZ{tnOogb zJ9<~=OrCZ}?bK%0W}{|Jyh*j7F4S%pmTf)elQGu`(oM7!d}8riP8j_-veq{ru3H!OP%b%^tVh45C<)D`~&jJ~cb literal 0 HcmV?d00001 diff --git a/MESEAI/MESEAI.sln b/MESEAI/MESEAI.sln new file mode 100644 index 0000000..6b35361 --- /dev/null +++ b/MESEAI/MESEAI.sln @@ -0,0 +1,194 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.35325.158 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EAIws_C", "EAICws\EAICws\EAIws_C.csproj", "{74B7676A-6420-0784-301F-696024D2A8D7}" + ProjectSection(ProjectDependencies) = postProject + {443394E0-F618-0D60-04C0-E207199604A2} = {443394E0-F618-0D60-04C0-E207199604A2} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EAItc_C", "EAItc\EAItc_C.csproj", "{443394E0-F618-0D60-04C0-E207199604A2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iMESCIOC", "..\iMESCIOC\iMESCIOC.csproj", "{3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + C++Buile|Any CPU = C++Buile|Any CPU + C++Buile|Mixed Platforms = C++Buile|Mixed Platforms + C++Buile|x64 = C++Buile|x64 + C++Buile|x86 = C++Buile|x86 + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Quick|Any CPU = Quick|Any CPU + Quick|Mixed Platforms = Quick|Mixed Platforms + Quick|x64 = Quick|x64 + Quick|x86 = Quick|x86 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|x64 = Release|x64 + Release|x86 = Release|x86 + StorageBuild|Any CPU = StorageBuild|Any CPU + StorageBuild|Mixed Platforms = StorageBuild|Mixed Platforms + StorageBuild|x64 = StorageBuild|x64 + StorageBuild|x86 = StorageBuild|x86 + UnitTest|Any CPU = UnitTest|Any CPU + UnitTest|Mixed Platforms = UnitTest|Mixed Platforms + UnitTest|x64 = UnitTest|x64 + UnitTest|x86 = UnitTest|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {74B7676A-6420-0784-301F-696024D2A8D7}.C++Buile|Any CPU.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.C++Buile|Any CPU.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.C++Buile|Mixed Platforms.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.C++Buile|Mixed Platforms.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.C++Buile|x64.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.C++Buile|x64.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.C++Buile|x86.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.C++Buile|x86.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Debug|x64.ActiveCfg = Debug|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Debug|x64.Build.0 = Debug|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Debug|x86.ActiveCfg = Debug|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Debug|x86.Build.0 = Debug|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Quick|Any CPU.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Quick|Any CPU.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Quick|Mixed Platforms.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Quick|Mixed Platforms.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Quick|x64.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Quick|x64.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Quick|x86.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Quick|x86.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Release|Any CPU.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Release|x64.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Release|x64.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Release|x86.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.Release|x86.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.StorageBuild|Any CPU.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.StorageBuild|Any CPU.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.StorageBuild|Mixed Platforms.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.StorageBuild|Mixed Platforms.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.StorageBuild|x64.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.StorageBuild|x64.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.StorageBuild|x86.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.StorageBuild|x86.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.UnitTest|Any CPU.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.UnitTest|Any CPU.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.UnitTest|Mixed Platforms.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.UnitTest|Mixed Platforms.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.UnitTest|x64.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.UnitTest|x64.Build.0 = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.UnitTest|x86.ActiveCfg = Release|Any CPU + {74B7676A-6420-0784-301F-696024D2A8D7}.UnitTest|x86.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.C++Buile|Any CPU.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.C++Buile|Any CPU.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.C++Buile|Mixed Platforms.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.C++Buile|Mixed Platforms.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.C++Buile|x64.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.C++Buile|x64.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.C++Buile|x86.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.C++Buile|x86.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Debug|x64.ActiveCfg = Debug|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Debug|x64.Build.0 = Debug|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Debug|x86.ActiveCfg = Debug|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Debug|x86.Build.0 = Debug|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Quick|Any CPU.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Quick|Any CPU.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Quick|Mixed Platforms.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Quick|Mixed Platforms.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Quick|x64.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Quick|x64.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Quick|x86.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Quick|x86.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Release|Any CPU.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Release|x64.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Release|x64.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Release|x86.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.Release|x86.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.StorageBuild|Any CPU.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.StorageBuild|Any CPU.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.StorageBuild|Mixed Platforms.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.StorageBuild|Mixed Platforms.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.StorageBuild|x64.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.StorageBuild|x64.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.StorageBuild|x86.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.StorageBuild|x86.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.UnitTest|Any CPU.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.UnitTest|Any CPU.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.UnitTest|Mixed Platforms.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.UnitTest|Mixed Platforms.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.UnitTest|x64.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.UnitTest|x64.Build.0 = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.UnitTest|x86.ActiveCfg = Release|Any CPU + {443394E0-F618-0D60-04C0-E207199604A2}.UnitTest|x86.Build.0 = Release|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.C++Buile|Any CPU.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.C++Buile|Any CPU.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.C++Buile|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.C++Buile|Mixed Platforms.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.C++Buile|x64.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.C++Buile|x64.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.C++Buile|x86.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.C++Buile|x86.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Debug|x64.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Debug|x64.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Debug|x86.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Debug|x86.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Quick|Any CPU.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Quick|Any CPU.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Quick|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Quick|Mixed Platforms.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Quick|x64.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Quick|x64.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Quick|x86.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Quick|x86.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Release|Any CPU.Build.0 = Release|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Release|x64.ActiveCfg = Release|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Release|x64.Build.0 = Release|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Release|x86.ActiveCfg = Release|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.Release|x86.Build.0 = Release|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.StorageBuild|Any CPU.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.StorageBuild|Any CPU.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.StorageBuild|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.StorageBuild|Mixed Platforms.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.StorageBuild|x64.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.StorageBuild|x64.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.StorageBuild|x86.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.StorageBuild|x86.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.UnitTest|Any CPU.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.UnitTest|Any CPU.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.UnitTest|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.UnitTest|Mixed Platforms.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.UnitTest|x64.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.UnitTest|x64.Build.0 = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.UnitTest|x86.ActiveCfg = Debug|Any CPU + {3A1F68B3-EBE4-4A86-9334-F66EC3DCE0AD}.UnitTest|x86.Build.0 = Debug|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8C4647D6-0300-48B8-9394-09E4BF0D878A} + EndGlobalSection +EndGlobal diff --git a/MESEAI/packages/BouncyCastle.1.8.9/.signature.p7s b/MESEAI/packages/BouncyCastle.1.8.9/.signature.p7s new file mode 100644 index 0000000000000000000000000000000000000000..611fac3cc60a46654b77bb04e370aa1d5706d2e7 GIT binary patch literal 9494 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 cvGG9Me;@!-8j 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®)RP!1_fIE$M-W!n~t8)M4lKKsVC1E`& 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

b8|0lHwB{^rK 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 z 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 IXuSje7xuR5xc~qF literal 0 HcmV?d00001 diff --git a/MESEAI/packages/BouncyCastle.1.8.9/README.md b/MESEAI/packages/BouncyCastle.1.8.9/README.md new file mode 100644 index 0000000..270d9cc --- /dev/null +++ b/MESEAI/packages/BouncyCastle.1.8.9/README.md @@ -0,0 +1,30 @@ +# The Bouncy Castle Crypto Package For C Sharp + +The Bouncy Castle Crypto package is a C\# implementation of cryptographic algorithms and protocols, it was developed by the Legion of the Bouncy Castle, a registered Australian Charity, with a little help! The Legion, and the latest goings on with this package, can be found at [http://www.bouncycastle.org](http://www.bouncycastle.org). In addition to providing basic cryptography algorithms, the package also provides support for CMS, TSP, X.509 certificate generation and a variety of other standards such as OpenPGP. + +The Legion also gratefully acknowledges the contributions made to this package by others (see [here](http://www.bouncycastle.org/csharp/contributors.html) for the current list). If you would like to contribute to our efforts please feel free to get in touch with us or visit our [donations page](https://www.bouncycastle.org/donate), sponsor some specific work, or purchase a support contract through [Crypto Workshop](http://www.cryptoworkshop.com). + +Except where otherwise stated, this software is distributed under a license based on the MIT X Consortium license. To view the license, [see here](http://www.bouncycastle.org/licence.html). The OpenPGP library also includes a modified BZIP2 library which is licensed under the [Apache Software License, Version 2.0](http://www.apache.org/licenses/). + +**Note**: this source tree is not the FIPS version of the APIs - if you are interested in our FIPS version please contact us directly at [office@bouncycastle.org](mailto:office@bouncycastle.org). + +## Mailing Lists + +For those who are interested, there are 2 mailing lists for participation in this project. To subscribe use the links below and include the word subscribe in the message body. (To unsubscribe, replace **subscribe** with **unsubscribe** in the message body) + +* [announce-crypto-csharp-request@bouncycastle.org](mailto:announce-crypto-csharp-request@bouncycastle.org) + This mailing list is for new release announcements only, general subscribers cannot post to it. +* [dev-crypto-csharp-request@bouncycastle.org](mailto:dev-crypto-csharp-request@bouncycastle.org) + This mailing list is for discussion of development of the package. This includes bugs, comments, requests for enhancements, questions about use or operation. + +**NOTE:**You need to be subscribed to send mail to the above mailing list. + +## Feedback + +If you want to provide feedback directly to the members of **The Legion** then please use [feedback-crypto@bouncycastle.org](mailto:feedback-crypto@bouncycastle.org), if you want to help this project survive please consider [donating](https://www.bouncycastle.org/donate). + +For bug reporting/requests you can report issues here on github, via feedback-crypto if required, and we also have a [Jira issue tracker](http://www.bouncycastle.org/jira). We will accept pull requests based on this repository as well. + +## Finally + +Enjoy!

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%0AhKXjsYh`a;Zve; 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%0ALL^>tm|6oNM6|=j8^vL^m5rNMt8VtwXuGj@t(6j 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 z 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