From e9f9b0c63efebfa75c3745c37b7a23146cc23ce5 Mon Sep 17 00:00:00 2001 From: 14278/caihao <572156462@qq.com> Date: Thu, 18 Jan 2024 17:47:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SRC/MEStc_ABC/MEStc_ABC.csproj | 35 ++- SRC/MEStc_ABC/tcWIP/clsLot.cs | 521 +++++++++++++++++++++++++++++++-- SRC/wsABC/wsABC.csproj | 8 + SRC/wsABC/wsWIP/wsWIP.cs | 481 +++++++++++++++++++++++++----- 4 files changed, 945 insertions(+), 100 deletions(-) diff --git a/SRC/MEStc_ABC/MEStc_ABC.csproj b/SRC/MEStc_ABC/MEStc_ABC.csproj index 49ee504..ee37332 100644 --- a/SRC/MEStc_ABC/MEStc_ABC.csproj +++ b/SRC/MEStc_ABC/MEStc_ABC.csproj @@ -57,6 +57,31 @@ On + + False + ..\MES_S_DLL\iMESWIPReleaseLogHandler.dll + False + + + False + ..\MES_S_DLL\kcOE.dll + False + + + False + ..\MES_S_DLL\kcSPC.dll + False + + + False + ..\MES_S_DLL\kcSYS.dll + False + + + False + ..\MES_S_DLL\kcWIP.dll + False + False @@ -84,7 +109,7 @@ False - ..\..\MESSeries_2016\MES_S_DLL\iMESException.dll + ..\MES_S_DLL\iMESException.dll False @@ -99,6 +124,14 @@ + + False + ..\MES_S_DLL\udReverse.dll + + + False + ..\MES_S_DLL\udWIP.dll + diff --git a/SRC/MEStc_ABC/tcWIP/clsLot.cs b/SRC/MEStc_ABC/tcWIP/clsLot.cs index 22d0c0a..001a110 100644 --- a/SRC/MEStc_ABC/tcWIP/clsLot.cs +++ b/SRC/MEStc_ABC/tcWIP/clsLot.cs @@ -7,6 +7,8 @@ using static iMESCore.Base.iMESComXML; using static iMESCore.Base.iMESConst; using static iMESCore.DataBase.iMESSql; using iMESCore.Settings; +using Microsoft.VisualBasic.CompilerServices; +using System.Linq; namespace MEStc_ABC { @@ -21,15 +23,40 @@ namespace MEStc_ABC * 常數相關,使用iMESConst.dll * 簡易副程式,使用iMESComSubroutine.dll */ - - + private udReverse.clsReverse objReverse = new udReverse.clsReverse(); + // 2006/05/10,sammi private AppSettings objSetting = new AppSettings(); + private clsDBCom objDBCom = new clsDBCom(); + private kcSYS.clsSYSUserLog objSYS = new kcSYS.clsSYSUserLog(); // 宣告Sys的物件 + private kcWIP.clsLot objLot = new kcWIP.clsLot(); + public iMESWIPReleaseLogHandler.clsLotReleaseLogHandle objLotLog; private string strConnectionString; // Connection string private string strDataBaseType; // DataBase Type:oracle, mysql, access private string strMQType; // MessageQueue Type:TIBCO, MQSeries, MSMQ private bool disposed = false; // To detect redundant calls private string strSQL = ""; + private const int ActiveId_CI = 1; + private const int ActiveId_CO = 2; + private string strReportConnectionString; + private string strReportDataBaseType; + + private string strSQLAddField; + private string strSQLAddValue; + private string strUploadPath; // WebServer放置上傳檔案的實體路徑 + private string cModuleNodeId = "N/A"; + private string cModuleNo = "N/A"; + private string cModuleVersion = "N/A"; + private string cStageNo = "N/A"; + private int cOPReference = 0; + public string MaxWaitNo = defString; + private string MNewLotSerial; + + private string strConnectionString_ERP; // 2016-03-14, Joe, Add + private string strDataBaseType_ERP; // 2016-03-14, Joe, Add + + private string strConnectionString_eSOP; // 2016-03-14, Joe, Add + private string strDataBaseType_eSOP; // 2016-03-14, Joe, Add #region --- Initial Object --- public clsLot() @@ -262,9 +289,7 @@ namespace MEStc_ABC } - public string BR_CheckIn(long LotStamp, string LotNo, string LinkName, DataTable dtAttrib, DataTable dtEquipment, string UserNo, string ShiftNo, - string LotRecord = defString, DateTime CheckInTime = default(DateTime), string RuleNo = "", DataTable dtLoginState = null, DataTable dtAccessory = null, - DataTable dtMTLLot = null, string LanguageMode = defString) + public string BR_CheckIn(long LotStamp, string LotNo, string LinkName, DataTable dtAttrib, DataTable dtEquipment, string UserNo, string ShiftNo, string LotRecord = defString, DateTime CheckInTime = default(DateTime), string RuleNo = "", DataTable dtLoginState = null, DataTable dtAccessory = null, DataTable dtMTLLot = null, string LanguageMode = defString, DataTable dtEquipmentChamber = null) { string BR_CheckInRet = default(string); // 此 Function 將更新CheckIn Data @@ -277,7 +302,7 @@ namespace MEStc_ABC var CollectionSQL_Rows = new Collection(); string strSQL = ""; - string LotSerial, OPNo, BRNo, SerialNo, LogGroupSerial, BaseLotNo, CurQTY; + string LotSerial, OPNo, BRNo, SerialNo, LogGroupSerial, BaseLotNo, CurQTY, NodeId; int PhaseNo; DateTime datEventTime; long lngLotStamp; @@ -288,21 +313,21 @@ namespace MEStc_ABC cnnTemp = CreateConnection(strConnectionString); // 1.取出Temp LotState的資料 - strSQL = "Select A.LotSerial,A.OPNo,A.SerialNo,B.BRNo,B.LogGroupSerial,B.LotStamp,B.BaseLotNo,B.CurQTY,B.PhaseNo " + - " From tblWIPTemp_LotState A, tblWIPLotState B " + " Where A.LotNo ='" + LotNo + "'" + " And A.LotNo = B.LotNo "; + strSQL = "Select A.LotSerial,A.OPNo,A.SerialNo,B.BRNo,B.LogGroupSerial,B.LotStamp,B.BaseLotNo,B.CurQTY,B.PhaseNo,B.NodeId " + " From tblWIPTemp_LotState A, tblWIPLotState B " + " Where A.LotNo ='" + LotNo + "'" + " And A.LotNo = B.LotNo "; // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { - LotSerial = drTemp["LotSerial"].ToString(); - OPNo = drTemp["OPNo"].ToString(); - SerialNo = drTemp["SerialNo"].ToString(); - BRNo = drTemp["BRNo"].ToString(); - LogGroupSerial = drTemp["LogGroupSerial"].ToString(); - lngLotStamp = Convert.ToInt64(drTemp["LotStamp"]); - BaseLotNo = drTemp["BaseLotNo"].ToString(); - CurQTY = drTemp["CurQTY"].ToString(); - PhaseNo = Convert.ToInt32(drTemp["PhaseNo"]); // 2020/11/20 Steven Mantis: 0082084: [PAD]eRunCard_調整 BR 生產記錄 + LotSerial = Conversions.ToString(drTemp["LotSerial"]); + OPNo = Conversions.ToString(drTemp["OPNo"]); + SerialNo = Conversions.ToString(drTemp["SerialNo"]); + BRNo = Conversions.ToString(drTemp["BRNo"]); + LogGroupSerial = Conversions.ToString(drTemp["LogGroupSerial"]); + lngLotStamp = Conversions.ToLong(drTemp["LotStamp"]); + BaseLotNo = Conversions.ToString(drTemp["BaseLotNo"]); + CurQTY = Conversions.ToString(drTemp["CurQTY"]); + PhaseNo = Conversions.ToInteger(drTemp["PhaseNo"]); // 2020/11/20 Steven Mantis: 0082084: [PAD]eRunCard_調整 BR 生產記錄 + NodeId = drTemp["NodeId"].ToString(); // 2023/06/05, 0135702: [6.0.7] SDD220425_01-03_進站設備派工查核調整, 19245 } else { @@ -311,13 +336,471 @@ namespace MEStc_ABC drTemp.Close(); + datEventTime = DateTime.Now; + + // 若無指定CheckInTime,則同datEventTime.因機時、工時使用CheckInTime,必須一定要有資料. + if (CheckInTime == defDateTime) + { + CheckInTime = datEventTime; + } + + // 20210909 13871,生產批下線歷程,add parameter + if (objLotLog == null) + objLotLog = new iMESWIPReleaseLogHandler.clsLotReleaseLogHandle(ActiveId_CI, UserNo, CheckInTime); + if (objLotLog.ColSQL == null) + objLotLog.ColSQL = CollectionSQL; + if (objLotLog.ColSQL_Rows == null) + objLotLog.ColSQL_Rows = CollectionSQL_Rows; + + // 寫入管制時間 + udWIP.clsWIP objUdWIP; + objUdWIP = new udWIP.clsWIP(); + objUdWIP.SHR_LimitedTimeControl_ByBR(ref objReverse, LotNo, LogGroupSerial, LotSerial, UserNo, CheckInTime, ref cnnTemp, ref CollectionSQL); + + + // 2.Update Temp/Content LotAttrib + objLot.SHR_UpdAttrib(LotNo, LogGroupSerial, ref dtAttrib, ref CollectionSQL, datEventTime); + + // 3.Equipment CheckIn + objLot. SHR_CIEquipment(LotNo, LogGroupSerial, LotSerial, LotSerial, UserNo, datEventTime, ref cnnTemp, ref CollectionSQL, ref dtEquipment, SerialNo, dtAccessory: dtAccessory, dtAttrib: dtAttrib, CheckInTime: CheckInTime, EquipmentChamber: dtEquipmentChamber); + + // 4.Lot Record + if (!string.IsNullOrEmpty(LotRecord) && (LotRecord ?? "") != defString) + { + strSQL = "Insert into tblWIPCont_LotRecord(LogGroupSerial,BaseLotNo,LotNo,LotSerial,OPNo,LotRecord,UserNo,EventTime)" + " Values('" + LogGroupSerial + "','" + BaseLotNo + "','" + LotNo + "','" + LotSerial + "','" + OPNo + "','" + LotRecord + "','" + UserNo + "'," + "To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; + CollectionSQL.Add(strSQL); + // Reverse + strSQL = "Delete From tblWIPCont_LotRecord Where LotSerial='" + LotSerial + "'"; + Collection argcolSQL_Rows = null; + objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows); + } + + // 2019/09/06 Eric 存入tblWIPTemp_MaterialLot + if (dtMTLLot != null && dtMTLLot.Rows.Count > 0) + { + foreach (DataRow r in dtMTLLot.Rows) + { + strSQL = "Insert into tblWIPTemp_MaterialLot(LotNo,MaterialNo,MaterialLotNo)" + " Values('" + LotNo + "','" + r["MaterialNo"].ToString() + "','" + r["MaterialLotNo"].ToString() + "')"; + CollectionSQL.Add(strSQL); + // Reverse + strSQL = "Delete From tblWIPTemp_MaterialLot Where LotNo='" + LotNo + "' and MaterialNo='" + r["MaterialNo"].ToString() + "' and MaterialLotNo='" + r["MaterialLotNo"].ToString() + "'"; + Collection argcolSQL_Rows1 = null; + objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows1); + } + } + + // 4.5 UPDate tblWIPEQPConsumeState.CurQTY & tblWIPEQPConsumeState.CurPeriod (Undo必須為同一料批才可Undo) + if (dtEquipment != null && dtEquipment.Rows.Count > 0) + { + objLot. SHR_UpdWIPEQPConsumeState(LotSerial, Conversions.ToDecimal(CurQTY), dtEquipment, ref CollectionSQL); + } + + // 2020/02/26 Grace Mantis 67753, 取得生產批於作業站中, check in 日期的設備派工資料 + if (dtEquipment != null && dtEquipment.Rows.Count > 0) + { + + foreach (DataRow dr in dtEquipment.Rows) + { + DataSet dsEQPTemp; + + using (var objWIP = new kcWIP.clsWIP()) + { + dsEQPTemp = objWIP.ShowWIPEQPDispatchState(dr["EquipmentNo"].ToString(), LotNo, OPNo, CheckInTime); + } + + if (!(dsEQPTemp == null)) + { + + foreach (DataRow drEQP in dsEQPTemp.Tables[0].Rows) + { + + using (var objWIP = new kcWIP.clsWIP()) + { + // 寫Log + objWIP.AddWIPEQPDispatchLog(dr["EquipmentNo"].ToString(), LotNo, OPNo, CheckInTime, Convert.ToInt32(drEQP["DispatchOrder"]), CollectionSQL); + // Reverse + strSQL = "Delete From tblWIPEQPDispatchLog " + " Where EquipmentNo='" + dr["EquipmentNo"].ToString() + "' " + " And OPNO='" + OPNo + "' " + " And LotNo='" + LotNo + "' " + " And DispatchDate=To_Date('" + Strings.Format(CheckInTime, "yyyy/MM/dd") + "','YYYY/MM/DD') "; + // 2020/04/08 Grace 增加SQL置換, 避免使用MSSQL執行Reverse時報錯 + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + Collection argcolSQL_Rows2 = null; + objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows2); + + // 刪除派工 & 調整排序 + objWIP.DelWIPEQPDispatchState(dr["EquipmentNo"].ToString(), LotNo, OPNo, CheckInTime, CollectionSQL); + + // 取得刪除前的資料 + strSQL = "Select * " + " From tblWIPEQPDispatchState Where EquipmentNo='" + dr["EquipmentNo"].ToString() + "' " + " And OPNO='" + OPNo + "' " + " And LotNo='" + LotNo + "' " + " And DispatchDate=To_Date('" + Strings.Format(CheckInTime, "yyyy/MM/dd") + "','YYYY/MM/DD') "; + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + + // Reverse + strSQL = Conversions.ToString(" Insert into tblWIPEQPDispatchState(EquipmentNo,LotNo,OPNO,DispatchDate,DispatchOrder,EventUser,EventDate) " + " Values('" + drTemp["EquipmentNo"].ToString() + "','" + LotNo + "','" + OPNo + "',To_Date('" + Strings.Format(drTemp["DispatchDate"], "yyyy/MM/dd") + "','YYYY/MM/DD')," + + drTemp["DispatchOrder"] + "," + " '" + drTemp["EventUser"] + "',To_Date('" + Strings.Format(drTemp["EventDate"], "yyyy/MM/dd H:mm:ss") + + "','YYYY/MM/DD HH24:MI:SS')) "); + // 2020/04/08 Grace 增加SQL置換, 避免使用MSSQL執行Reverse時報錯 + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + Collection argcolSQL_Rows3 = null; + objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows3); + + // Reverse + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["DispatchOrder"], 1, false))) + { + // <1 找不到資料 + strSQL = Conversions.ToString("Update tblWIPEQPDispatchState set DispatchOrder = DispatchOrder + 1 " + " Where EquipmentNo='" + dr["EquipmentNo"].ToString() + "' " + " And OPNo='" + OPNo + "' " + " And DispatchDate=To_Date('" + Strings.Format(CheckInTime, "yyyy/MM/dd") + "','YYYY/MM/DD') " + " And DispatchOrder = " + + drTemp["DispatchOrder"] + ""); + // 2020/04/08 Grace 增加SQL置換, 避免使用MSSQL執行Reverse時報錯 + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + Collection argcolSQL_Rows4 = null; + objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows4); + } + else + { + strSQL = Conversions.ToString("Update tblWIPEQPDispatchState set DispatchOrder = DispatchOrder + 1 " + " Where EquipmentNo='" + dr["EquipmentNo"].ToString() + "' " + " And OPNo='" + OPNo + "' " + " And DispatchDate=To_Date('" + Strings.Format(CheckInTime, "yyyy/MM/dd") + "','YYYY/MM/DD') " + " And DispatchOrder < " + + drTemp["DispatchOrder"] + ""); + // 2020/04/08 Grace 增加SQL置換, 避免使用MSSQL執行Reverse時報錯 + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + Collection argcolSQL_Rows5 = null; + objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL, colSQL_Rows: argcolSQL_Rows5); + } + } + drTemp.Close(); + + } + } + } + } + } + + //2023/07/24, 0141393: [SA QA]RTD生产批进站成功后删除派工现况表方式调整 ,19245 + ////2023/06/05, 0135702: [6.0.7] SDD220425_01-03_進站設備派工查核調整, 19245 + //if (dtEquipment != null && dtEquipment.Rows.Count > 0) + //{ + // foreach (DataRow dr in dtEquipment.Rows) + // { + // DataSet dsEQPTemp; + + // using (var objWIP = new kcWIP.clsWIP()) + // { + // dsEQPTemp = objWIP.ShowWIPEQPLOTDISPATCH(dr["EquipmentNo"].ToString(), LotNo, OPNo, NodeId, CheckInTime); + // } + + // if (dsEQPTemp != null && dsEQPTemp.Tables[0].Rows.Count > 0) + // { + // foreach (DataRow drEQP in dsEQPTemp.Tables[0].Rows) + // { + // using (var objWIP = new kcWIP.clsWIP()) + // { + // // 寫Log + // objWIP.AddWIPEQPLOTDISPATCHLOG(dr["EquipmentNo"].ToString(), LotNo, OPNo, NodeId, CheckInTime, CollectionSQL); + // // Reverse + // strSQL = "Delete From tblWIPEQPLotDispatchLog " + + // " Where EquipmentNo='" + dr["EquipmentNo"].ToString() + "' " + + // " And OPNO='" + OPNo + "' " + + // " And LotNo='" + LotNo + "' " + + // " And NodeId='" + NodeId + "' " + + // " And DispatchDate=To_Date('" + Strings.Format(CheckInTime, "yyyy/MM/dd") + "','YYYY/MM/DD') "; + + // strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL); + + // // 刪除派工 + // objWIP.DelWIPEQPLOTDISPATCHSTATE(dr["EquipmentNo"].ToString(), LotNo, OPNo, NodeId, CheckInTime, CollectionSQL); + + // // 取得刪除前的資料 + // strSQL = "Select * " + + // " From tblWIPEQPLotDispatchState Where EquipmentNo='" + dr["EquipmentNo"].ToString() + "' " + + // " And OPNO='" + OPNo + "' " + + // " And LotNo='" + LotNo + "' " + + // " And NodeId='" + NodeId + "' " + + // " And DispatchDate=To_Date('" + Strings.Format(CheckInTime, "yyyy/MM/dd") + "','YYYY/MM/DD') "; + // strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // // Reverse + // strSQL = " Insert into tblWIPEQPLotDispatchState(EquipmentNo,LotNo,OPNO,NodeId,DispatchDate,DispatchOrder,DispatchType,DispatchShift,EventUser,EventDate) " + + // " Values('" + drTemp["EquipmentNo"].ToString() + "','" + LotNo + "','" + OPNo + "','" + NodeId + + // "',To_Date('" + Strings.Format(drTemp["DispatchDate"], "yyyy/MM/dd") + "','YYYY/MM/DD'),'" + + // drTemp["DispatchOrder"] + "','" + drTemp["DispatchType"] + "','" + drTemp["DispatchShift"] + + // "','" + drTemp["EventUser"] + "',To_Date('" + + // Strings.Format(drTemp["EventDate"], "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')) "; + + + // strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL); + + // } + // drTemp.Close(); + // } + // } + // } + // else // 與現況的設備不符合 仍進站 + // { + // using (var objWIP = new kcWIP.clsWIP()) + // { + // // 寫Log + // objWIP.AddWIPEQPLOTDISPATCHLOG(dr["EquipmentNo"].ToString(), LotNo, OPNo, NodeId, CheckInTime, CollectionSQL, true); + // // Reverse + // strSQL = "Delete From tblWIPEQPLotDispatchLog " + + // " Where EquipmentNo='" + dr["EquipmentNo"].ToString() + "' " + + // " And OPNO='" + OPNo + "' " + + // " And LotNo='" + LotNo + "' " + + // " And NodeId='" + NodeId + "' "; + + // strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL); + + // // 刪除派工,,不須傳入設備 + // objWIP.DelWIPEQPLOTDISPATCHSTATE(defString, LotNo, OPNo, NodeId, CheckInTime, CollectionSQL, true); + + // // 取得刪除前的資料 + // strSQL = "Select * " + + // " From tblWIPEQPLotDispatchState Where OPNO='" + OPNo + "' " + + // " And LotNo='" + LotNo + "' " + + // " And NodeId='" + NodeId + "' "; + // strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // DataTable dtTemp = new DataTable(); + // dtTemp.Load(drTemp); + // drTemp.Close(); + + // if (dtTemp.Rows.Count > 0) + // { + // foreach (DataRow drData in dtTemp.Rows) + // { + // // Reverse + // strSQL = " Insert into tblWIPEQPLotDispatchState(EquipmentNo,LotNo,OPNO,NodeId,DispatchDate,DispatchOrder,DispatchType,DispatchShift,EventUser,EventDate) " + + // " Values('" + drData["EquipmentNo"].ToString() + "','" + LotNo + "','" + OPNo + "','" + NodeId + + // "',To_Date('" + Strings.Format(drData["DispatchDate"], "yyyy/MM/dd") + "','YYYY/MM/DD'),'" + + // drData["DispatchOrder"] + "','" + drData["DispatchType"] + "','" + drData["DispatchShift"] + + // "','" + drData["EventUser"] + "',To_Date('" + + // Strings.Format(drData["EventDate"], "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')) "; + + // strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // objReverse.AddReverseUpdateContent(ref LotSerial, ref strSQL, CollectionSQL); + // } + // } + // } + // } + // } + //} + + // 5.變更LotState-------------------------------------------------------------------------------------------------- + if (LinkName == "HOLD") + { + // 因BR已執行完成,故Hold解除的續Go狀態為Complete(4) + int argGoStatus = 4; + objLot.funSetLotStateToERFCreate(ref LotNo, ref argGoStatus, ref datEventTime, ref CollectionSQL, EventUserNo: UserNo); + } + else if (LinkName == "WAIT") + { + // 因BR已執行完成,故Wait解除的續Go狀態為Complete(4) + // RuleNo Added by Jialing 2011/02/18 將RuleNo填入WAIT說明 + // 已登錄之多人加工必須登出. + int argGoStatus1 = 4; + objLot.funSetLotStateToWait(ref LotNo, ref argGoStatus1, ref datEventTime, ref CollectionSQL, EventUserNo: UserNo, LotStamp: lngLotStamp, WaitDescription: RuleNo, COMultiUser: true); + } + else + { + // 4代表成功完成BR,紀錄LinkName若TransferLot失敗可以重新再執行TransferLot + int argStatus = 4; + objLot.funSetLotStateToOther(ref LotNo, ref argStatus, ref datEventTime, ref CollectionSQL, LinkName, EventUserNo: UserNo); + } + + // 6.變更LotLog & Add Cont_Employee-------------------------------------------------------------------------------- + objLot.SHR_UpdLog(LotNo, LotSerial, LogGroupSerial, OPNo, BRNo, "BR_CheckIn", ShiftNo, UserNo, datEventTime, LinkName, ref CollectionSQL, Check_In_Out_Time: CheckInTime, PhaseNo: PhaseNo); + + // 7.變更LotLog_Report + objLot.SHR_UpdLogReport(ref cnnTemp, ref CollectionSQL, LogGroupSerial, LotSerial, CheckInTime); + + // 2015-12-11, Joe, SPC + using (var objSPC = new kcSPC.clsSPC()) + { + objSPC.UpdSPCContorl_Var(LotNo, UserNo, ref dtAttrib, ref CollectionSQL); + } + + // 2017/10/28,Sammi.取消舊的多人加工機制,改用新的上工下工. + // 2017/12/01,Sammi.人時AutoRun平攤需求,將上工下工資料,整合入舊的多人加工機制. + using (var obj = new kcWIP.clsOperatorState()) + { + obj.SHR_CI_EMP(ref cnnTemp, ref CollectionSQL, ref objReverse, 1, 1, UserNo, datEventTime, CheckInTime, LotNo, OPNo, LogGroupSerial, LotSerial, dtEquipment); + } + + // If LinkName = "WAIT" Then + // Call SHR_CIMultiUser_CO(CollectionSQL, 1, 1, LotNo, BaseLotNo, OPNo, LogGroupSerial, LotSerial, UserNo, datEventTime, dtLoginState) + // Else + // Call SHR_CIMultiUser(CollectionSQL, 1, 1, LotNo, BaseLotNo, OPNo, LogGroupSerial, LotSerial, UserNo, datEventTime, dtLoginState) + // End If + + // 2017/09/25 YF, 叫用工單達交率處理者,判斷是否回寫實際開工日 + // 2020/03/17 OwenLiu, Mantis:0068929 工單實際開工日/工單實際完工日 調整還原機制的共用處理 + new kcOE.WorkOrderRateHandler().ActualStartDateProcess(pLotNo: LotNo, pLotSerial: LotSerial, pEventTime: CheckInTime, pCollectionSQL: CollectionSQL, objReverse: objReverse); + + // 20200424 Edison 70441: [605標準版]L_CI_GEN 品檢卡控 + // ======================================= 70441 Start ======================================= + // 81459 新增品檢結果資料表 + string strQCFormNo = ""; // 檢驗單號 + var ErrorMsg = new Collection(); + string strExpMsg = ""; + string MailErrorMsg = ""; + var dtInspResult = new DataTable("InspResult"); + dtInspResult.Columns.Add("EquipmentNo", Type.GetType("System.String")); + dtInspResult.Columns.Add("EquipmentName", Type.GetType("System.String")); + dtInspResult.Columns.Add("QCItemNo", Type.GetType("System.String")); + dtInspResult.Columns.Add("QCItemName", Type.GetType("System.String")); + dtInspResult.Columns.Add("QCItemType", Type.GetType("System.String")); + dtInspResult.Columns.Add("InspType", Type.GetType("System.String")); + dtInspResult.Columns.Add("InspTypeName", Type.GetType("System.String")); + dtInspResult.Columns.Add("MailGroupNo", Type.GetType("System.String")); + dtInspResult.Columns.Add("CCMailGroupNo", Type.GetType("System.String")); + + foreach (DataRow rEQP in dtEquipment.Rows) + { + objLot.ChkQCInspection(ref MailErrorMsg, LotNo, OPNo, Conversions.ToString(rEQP["EquipmentNo"]), ref CollectionSQL, UserNo: UserNo, EventTime: datEventTime, ErrorMsg: ErrorMsg, dtInspResult: dtInspResult, LanguageMode: LanguageMode); + if (ErrorMsg.Count > 0) + { + strExpMsg = Conversions.ToString("[%EquipmentNo%]: " + rEQP["EquipmentNo"] + " " + Constants.vbCrLf + " "); + break; + } + } + + if (ErrorMsg.Count > 0) + { + + // ===== 自動開立PQC檢驗單 + string QCFormNo; + var ds = new DataSet(); + DataTable dt; + DataTable chkdt; + ds = objLot.ShowLotBasisJoinState(LotNo: LotNo); + DataRow[] drSel; + drSel = ds.Tables[0].Select("LotNo = '" + LotNo + "'"); + if (drSel.Length > 0) + { + string ProductNo = drSel[0]["ProductNo"].ToString(); + string ProductVersion = drSel[0]["ProductVersion"].ToString(); + string CustomerNo = drSel[0]["CustomerNo"].ToString(); + string Qty = drSel[0]["CurQty"].ToString(); + string strIsValid = "1"; + using (var objSPC = new kcSPC.clsSPC()) + { + dt = dtInspResult.DefaultView.ToTable(true, "QCItemNo", "QCItemName", "QCItemType", "InspType"); + chkdt = dtInspResult.DefaultView.ToTable(true, "QCItemNo", "QCItemName"); + + + string strQCItemNo_Exis; + var dtChkQCFormNo = new DataTable("ChkQCFormNo"); + dtChkQCFormNo.Columns.Add("QCFormNo", Type.GetType("System.String")); + for (int k = 0, loopTo = chkdt.Rows.Count - 1; k <= loopTo; k++) + { + strSQL = " Select Distinct A.*,B.STATUS From tblSPCIPQCFormQCItemMap A "; + strSQL = strSQL + " Left Join TBLSPCIPQCFORM B on A.QCFORMNO=B.QCFORMNO "; + strSQL = strSQL + " where A.QCItemNo = '" + chkdt.Rows[k]["QCItemNo"].ToString() + "' AND B.STATUS IN (0,1,2) AND B.LOTNO = '" + LotNo + "'"; + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.HasRows) + { + string chkStr = string.Empty; + while (drTemp.Read()) // 找出未確認,待驗,已驗中項目所屬單號 + { + var dr = dtChkQCFormNo.NewRow(); + dr["QCFormNo"] = drTemp["QCFormNo"].ToString(); + dtChkQCFormNo.Rows.Add(dr); + } + DataRow[] delRow; + delRow = dt.Select("QCItemNo = '" + chkdt.Rows[k]["QCItemNo"].ToString() + "'"); // 已存在項目不需重複開單,移除 + if (delRow.Count() > 0) + { + for (int CntRow = 0, loopTo1 = delRow.Count() - 1; CntRow <= loopTo1; CntRow++) + dt.Rows.Remove(delRow[CntRow]); + } + strQCItemNo_Exis = chkdt.Rows[k]["QCItemNo"].ToString() + ","; + } + drTemp.Close(); + + } + dtChkQCFormNo = dtChkQCFormNo.DefaultView.ToTable(true); // 過濾重複單號,供前端顯示 + foreach (DataRow drRow in dtChkQCFormNo.Rows) + { + QCFormNo = Conversions.ToString(drRow["QCFormNo"]); + strQCFormNo += QCFormNo + ","; + } + + if (dt.Rows.Count > 0) + { + for (int j = 0; j <= 8; j++) + { + DataRow[] drSel_A; + drSel_A = dt.Select("InspType = " + j + ""); // 找出檢驗頻率,一種頻率開出一張單 + if (drSel_A.Count() > 0) + { + using (var objSYSEng = new kcSYS.clsSYSEng()) + { + QCFormNo = objSYSEng.GetIPQCFormNo(true); + strQCFormNo += QCFormNo + ","; + } + objSPC.AddIPQCForm(QCFormNo, ProductNo, Conversions.ToDecimal(Qty), CustomerNo, LotNo, UserNo, OPNo: OPNo, ProductVersion: ProductVersion, S_OffLineHold: Conversions.ToInteger(false)); + for (int i = 0, loopTo2 = drSel_A.Count() - 1; i <= loopTo2; i++) + { + objSPC.AddIPQCFormQCItemMap(QCFormNo, drSel_A[i]["QCItemNo"].ToString(), drSel_A[i]["QCItemName"].ToString(), drSel_A[i]["QCItemType"].ToString()); + DataRow[] delRow; + delRow = dt.Select("QCItemNo = '" + drSel_A[i]["QCItemNo"].ToString() + "'"); + if (delRow.Count() > 0) + { + for (int CntRow = 0, loopTo3 = delRow.Count() - 1; CntRow <= loopTo3; CntRow++) + dt.Rows.Remove(delRow[CntRow]); + } + } + } + } + } + + } + } + strQCFormNo = strQCFormNo.TrimEnd(','); + // ===== + + if (!string.IsNullOrEmpty(MailErrorMsg)) + { + strExpMsg += MailErrorMsg + Constants.vbCrLf; + } + strExpMsg = "[%QC Inspection Items Has Not been Completed%],[%Please Execute PQC Inspection%]" + Constants.vbCrLf; + // For i As Integer = 1 To ErrorMsg.Count + strExpMsg += "[%IPQCNO%]: " + strQCFormNo; + // Next + throw new iMESException.MESException("IPQCNO", strExpMsg); + } + + // 2020/11/20 Reo Mantis 82084 [PAD]eRunCard_調整 BR 生產記錄 + objLot.UpdWIPRuleCheckLog(LogGroupSerial, datEventTime, colSQL: CollectionSQL); + // ======================================= 70441 End ======================================= + + // 8.檢查是否允許執行 + for (int i = 1, loopTo4 = CollectionSQL.Count; i <= loopTo4; i++) + CollectionSQL_Rows.Add(-1); + + // 12.檢查是否允許執行 + objLot.ChkLotStamp_RowCount(ref cnnTemp, ref CollectionSQL, ref CollectionSQL_Rows, LotNo, LotStamp); + + // 20210909 13871,生產批下線歷程 + objLotLog.funCreateSQL(LotNo: LotNo, SysActiveId: ActiveId_CI, ReferenceLotNo: LotNo); + if (LinkName == "WAIT") + { + var objWaitData = new iMESWIPReleaseLogHandler.clsLotReleaseLogHandle.clsLotData.clsWait() + { WaitType = 0, WaitNo = MaxWaitNo }; + objLotLog.funCreateSQL(WaitData: objWaitData, LotNo: LotNo, SysActiveId: 11, ReferenceLotNo: LotNo); + } + // 呼叫執行SQL指令 ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, CollectionSQL, CollectionSQL_Rows); // //Return success BR_CheckInRet = "success"; } - catch (Exception e1) { BR_CheckInRet = "fail"; @@ -331,7 +814,5 @@ namespace MEStc_ABC return BR_CheckInRet; } - - } } \ No newline at end of file diff --git a/SRC/wsABC/wsABC.csproj b/SRC/wsABC/wsABC.csproj index cccd3bb..ca9234d 100644 --- a/SRC/wsABC/wsABC.csproj +++ b/SRC/wsABC/wsABC.csproj @@ -54,6 +54,14 @@ On + + False + ..\MES_S_DLL\kcWIP.dll + + + False + ..\MES_S_DLL\MEStc_ABC.dll + False diff --git a/SRC/wsABC/wsWIP/wsWIP.cs b/SRC/wsABC/wsWIP/wsWIP.cs index 039a1e6..123d16d 100644 --- a/SRC/wsABC/wsWIP/wsWIP.cs +++ b/SRC/wsABC/wsWIP/wsWIP.cs @@ -4,6 +4,9 @@ using static iMESCore.Base.iMESComSubroutine; using static iMESCore.Base.iMESComXML; using static iMESCore.Base.iMESConst; using iMESCore.Settings; +using System.Web.Services; +using System.Data; +using Microsoft.VisualBasic.CompilerServices; namespace wsABC { @@ -21,8 +24,9 @@ namespace wsABC private string strMessage; // Message XML字串 private string strServiceName = "wsWIP_ABC"; // ServiceName private string strResourceDir = "Resources"; - + private kcWIP.clsLot objLot = new kcWIP.clsLot(); private kcSYS.clsSYSUserLog objSYS = new kcSYS.clsSYSUserLog(); // 宣告Sys的物件 + private MEStc_ABC.clsLot clsLot = new MEStc_ABC.clsLot(); // 宣告Sys的物件 public wsWIP() { @@ -39,93 +43,412 @@ namespace wsABC return "HelloWorld"; } + [WebMethod(Description = "Execute Check In by LotNo")] + public string Exe_CheckIn(string InXml) + { + string Exe_CheckInRet = default(string); - //public string LoadOPMaterialState(string InXml) - //{ - // string LoadOPMaterialStateRet = null; + long LotStamp; + string LotNo = default(string), LinkName, UserNo = default(string); - // // 先給預設值,以判斷是否有傳入該參數 - // string OPNo = defString; - // string MaterialNo = defString; - // string MaterialLotNo = defString; - // string UnitNo = defString; - // string MaterialType = defString; + DataTable dtAttrib; + DataTable dtEquipment; + DataTable dtEquipmentChamber; + DataRow drData; - // ArriveTime = DateTime.Now; + DataTable dtMTLLot; - // try - // { - // // 讀取InXml字串 - // xmlDoc.LoadXml(InXml); - // // 組Identity字串 - // strIdentity = CombineXMLIdentity(Environment.MachineName, GetXMLCurUserNo(xmlDoc), ArriveTime.ToString(defDateTimeFormat)); + System.Xml.XmlNodeList xmlList; + string ShiftNo = "N/A"; + string LotRecord = defString; + int i; + var CheckInTime = defDateTime; + string RuleNo = ""; // Added by Jialing 2011/02/18 - // // 判斷是否有傳入OPNo,若有,表示要依OPNo查詢 - // if (xmlDoc.DocumentElement.GetElementsByTagName("opno").Count > 0) - // { - // if (xmlDoc.GetElementsByTagName("opno").Item(0).SelectNodes("value").Count > 0) - // { - // OPNo = xmlDoc.DocumentElement.GetElementsByTagName("opno").Item(0).SelectNodes("value").Item(0).InnerText; - // } - // } - // // 判斷是否有傳入MaterialNo,若有,表示要依MaterialNo查詢 - // if (xmlDoc.DocumentElement.GetElementsByTagName("materialno").Count > 0) - // { - // if (xmlDoc.GetElementsByTagName("materialno").Item(0).SelectNodes("value").Count > 0) - // { - // MaterialNo = xmlDoc.DocumentElement.GetElementsByTagName("materialno").Item(0).SelectNodes("value").Item(0).InnerText; - // } - // } - // // 判斷是否有傳入MaterialLotNo,若有,表示要依MaterialLotNo查詢 - // if (xmlDoc.DocumentElement.GetElementsByTagName("materiallotno").Count > 0) - // { - // if (xmlDoc.GetElementsByTagName("materiallotno").Item(0).SelectNodes("value").Count > 0) - // { - // MaterialLotNo = xmlDoc.DocumentElement.GetElementsByTagName("materiallotno").Item(0).SelectNodes("value").Item(0).InnerText; - // } - // } - // if (xmlDoc.DocumentElement.GetElementsByTagName("unitno").Count > 0) - // { - // if (xmlDoc.GetElementsByTagName("unitno").Item(0).SelectNodes("value").Count > 0) - // { - // UnitNo = xmlDoc.DocumentElement.GetElementsByTagName("unitno").Item(0).SelectNodes("value").Item(0).InnerText; - // } - // } - // if (xmlDoc.DocumentElement.GetElementsByTagName("materialtype").Count > 0) - // { - // if (xmlDoc.GetElementsByTagName("materialtype").Item(0).SelectNodes("value").Count > 0) - // { - // MaterialType = xmlDoc.DocumentElement.GetElementsByTagName("materialtype").Item(0).SelectNodes("value").Item(0).InnerText; - // } - // } + ArriveTime = DateTime.Now; - // // 呼叫Dll執行 - // //strReturnValue = objWIP.LoadOPMaterialState(OPNo, MaterialNo, MaterialLotNo, UnitNo, MaterialType); - // strException = ""; - // strResult = "success"; - // } + try + { + // 讀取InXml字串 + xmlDoc.LoadXml(InXml); + UserNo = GetXMLCurUserNo(xmlDoc); - // catch (iMESException.MESException ex) - // { - // strReturnValue = ""; - // strException = CombineXMLException(ex.ErrorCode.ToString(), TranslateMsg(ex.Message, GetXMLLanguageMode(xmlDoc), strResourceDir), "Load OP Material State Fail!!", ex.StackTrace); - // strResult = "fail"; - // } + // 組Identity字串 + strIdentity = CombineXMLIdentity(Environment.MachineName, UserNo, Conversions.ToString(ArriveTime)); - // catch (Exception ex) - // { - // strReturnValue = ""; - // strException = CombineXMLException(defWSErrCode, ex.Message, "Load OP Material State Fail!!", ex.StackTrace); - // strResult = "fail"; - // } + // 開始解譯InXml字串 + if (xmlDoc.DocumentElement.GetElementsByTagName("lotstamp").Count > 0) + { + if (xmlDoc.GetElementsByTagName("lotstamp").Item(0).SelectNodes("value").Count > 0) + { + LotStamp = Conversions.ToLong(xmlDoc.DocumentElement.GetElementsByTagName("lotstamp").Item(0).SelectNodes("value").Item(0).InnerText); + } + else + { + throw new iMESException.MESException("0000-200002", "[%LotStamp%] [%Not Found%]"); + } + } + else + { + throw new iMESException.MESException("0000-200002", "[%LotStamp%] [%Not Found%]"); + } + if (xmlDoc.DocumentElement.GetElementsByTagName("lotno").Count > 0) + { + if (xmlDoc.GetElementsByTagName("lotno").Item(0).SelectNodes("value").Count > 0) + { + LotNo = xmlDoc.DocumentElement.GetElementsByTagName("lotno").Item(0).SelectNodes("value").Item(0).InnerText; + } + else + { + throw new iMESException.MESException("0000-200002", "[%LotNo%] [%Not Found%]"); + } + } + else + { + throw new iMESException.MESException("0000-200002", "[%LotNo%] [%Not Found%]"); + } + if (xmlDoc.DocumentElement.GetElementsByTagName("linkname").Count > 0) + { + if (xmlDoc.GetElementsByTagName("linkname").Item(0).SelectNodes("value").Count > 0) + { + LinkName = xmlDoc.DocumentElement.GetElementsByTagName("linkname").Item(0).SelectNodes("value").Item(0).InnerText; + } + else + { + throw new iMESException.MESException("0000-200002", "[%LinkName%] [%Not Found%]"); + } + } + else + { + throw new iMESException.MESException("0000-200002", "[%LinkName%] [%Not Found%]"); + } + // Added by Jialing 2011/02/18 + if (xmlDoc.DocumentElement.GetElementsByTagName("ruleno").Count > 0) + { + if (xmlDoc.GetElementsByTagName("ruleno").Item(0).SelectNodes("value").Count > 0) + { + RuleNo = xmlDoc.DocumentElement.GetElementsByTagName("ruleno").Item(0).SelectNodes("value").Item(0).InnerText; + } + } + if (xmlDoc.DocumentElement.GetElementsByTagName("shiftno").Count > 0) + { + if (xmlDoc.GetElementsByTagName("shiftno").Item(0).SelectNodes("value").Count > 0) + { + ShiftNo = xmlDoc.DocumentElement.GetElementsByTagName("shiftno").Item(0).SelectNodes("value").Item(0).InnerText; + } + } + if (xmlDoc.DocumentElement.GetElementsByTagName("lotrecord").Count > 0) + { + if (xmlDoc.GetElementsByTagName("lotrecord").Item(0).SelectNodes("value").Count > 0) + { + LotRecord = xmlDoc.DocumentElement.GetElementsByTagName("lotrecord").Item(0).SelectNodes("value").Item(0).InnerText; + } + } - // finally - // { - // // 將各部份之XML字串組起來並傳出 - // LoadOPMaterialStateRet = CombineXMLResponse(strIdentity, strReturnValue, strException, strResult, ""); - // } - // return LoadOPMaterialStateRet; + // 加入CheckIntime By carl 2007/06/04 + if (xmlDoc.DocumentElement.GetElementsByTagName("checkintime").Count > 0) + { + if (xmlDoc.GetElementsByTagName("checkintime").Item(0).SelectNodes("value").Count > 0) + { + CheckInTime = Conversions.ToDate(xmlDoc.DocumentElement.GetElementsByTagName("checkintime").Item(0).SelectNodes("value").Item(0).InnerText); + } + } - //} + // 1.取出CheckIn Data, Attrib -------------------------------------------------------------------------------------------- + // + // .. .. + // + // .. + // .. + // .. + // .. + // .. + // .. + // + // + // + dtAttrib = new DataTable("Attrib"); + dtAttrib.Columns.Add("AttribNo", Type.GetType("System.String")); + dtAttrib.Columns.Add("AttribType", Type.GetType("System.Int32")); + dtAttrib.Columns.Add("AttribSequence", Type.GetType("System.Int32")); + dtAttrib.Columns.Add("AttribSource", Type.GetType("System.Int32")); + dtAttrib.Columns.Add("AttribPhase", Type.GetType("System.Int32")); + dtAttrib.Columns.Add("AttribValue", Type.GetType("System.String")); + dtAttrib.Columns.Add("SaveToLotPropertyNo", Type.GetType("System.String")); + // 2015-12-16, Joe, Add + dtAttrib.Columns.Add("TestValue", Type.GetType("System.String")); + dtAttrib.Columns.Add("QCItemNo", Type.GetType("System.String")); + dtAttrib.Columns.Add("Result", Type.GetType("System.String")); + dtAttrib.Columns.Add("Result_INT", Type.GetType("System.Int32")); + dtAttrib.Columns.Add("FactorSerial", Type.GetType("System.String")); + dtAttrib.Columns.Add("SerialNo", Type.GetType("System.Int32")); + dtAttrib.Columns.Add("MEMO", Type.GetType("System.String")); + dtAttrib.Columns.Add("ComponentNo", Type.GetType("System.String")); + + if (xmlDoc.DocumentElement.GetElementsByTagName("attrib").Count > 0) + { + if (xmlDoc.GetElementsByTagName("attrib").Item(0).SelectNodes("value").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("attrib").Item(0).SelectNodes("value"); + var loopTo = xmlList.Count - 1; + for (i = 0; i <= loopTo; i++) + { + if (xmlList[i].SelectNodes("attribno").Count == 0 | xmlList[i].SelectNodes("attribtype").Count == 0 | xmlList[i].SelectNodes("attribsequence").Count == 0 | xmlList[i].SelectNodes("attribsource").Count == 0 | xmlList[i].SelectNodes("attribphase").Count == 0 | xmlList[i].SelectNodes("attribvalue").Count == 0) + { + throw new iMESException.MESException("0000-200002", "[%AttribNo%], [%AttribType%], [%AttribSequence%], [%AttribSource%], [%AttribPhase%], [%AttribValue%] [%cannotbeempty%]"); + } + // 將資料存入暫存Table + drData = dtAttrib.NewRow(); + drData["AttribNo"] = xmlList[i].SelectNodes("attribno").Item(0).InnerText; + drData["AttribType"] = xmlList[i].SelectNodes("attribtype").Item(0).InnerText; + drData["AttribSequence"] = xmlList[i].SelectNodes("attribsequence").Item(0).InnerText; + drData["AttribSource"] = xmlList[i].SelectNodes("attribsource").Item(0).InnerText; + drData["AttribPhase"] = xmlList[i].SelectNodes("attribphase").Item(0).InnerText; + drData["AttribValue"] = xmlList[i].SelectNodes("attribvalue").Item(0).InnerText; + if (xmlList[i].SelectNodes("savetolotpropertyno").Count > 0) + { + drData["SaveToLotPropertyNo"] = xmlList[i].SelectNodes("savetolotpropertyno").Item(0).InnerText; + } + else + { + drData["SaveToLotPropertyNo"] = ""; + } + // 2015-12-16, Joe, Add + drData["TestValue"] = xmlList[i].SelectNodes("attribvalue").Item(0).InnerText; + if (xmlList[i].SelectNodes("qcitemno").Count > 0) + { + drData["QCItemNo"] = xmlList[i].SelectNodes("qcitemno").Item(0).InnerText; + } + if (xmlList[i].SelectNodes("result").Count > 0) + { + drData["Result"] = xmlList[i].SelectNodes("result").Item(0).InnerText; + } + if (xmlList[i].SelectNodes("result_int").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("result_int").Item(0).InnerText)) + { + if (Information.IsNumeric(xmlList[i].SelectNodes("result_int").Item(0).InnerText)) + { + drData["Result_INT"] = xmlList[i].SelectNodes("result_int").Item(0).InnerText; + } + else + { + throw new iMESException.MESException("0000-200011", "Result_INT must be numeric"); + } + } + if (xmlList[i].SelectNodes("factorserial").Count > 0) + { + drData["FactorSerial"] = xmlList[i].SelectNodes("factorserial").Item(0).InnerText; + } + if (xmlList[i].SelectNodes("serialno").Count > 0 && !string.IsNullOrEmpty(xmlList[i].SelectNodes("serialno").Item(0).InnerText)) + { + drData["SerialNo"] = xmlList[i].SelectNodes("serialno").Item(0).InnerText; + } + dtAttrib.Rows.Add(drData); + } + } + } + + // 2.取出CheckIn Data, Equipment -------------------------------------------------------------------------------------------- + // + // .. .. + // + // .. + // .. + // + // + // + dtEquipment = new DataTable("Equipment"); + dtEquipment.Columns.Add("EquipmentNo", Type.GetType("System.String")); + dtEquipment.Columns.Add("LoadPort", Type.GetType("System.Int16")); + + if (xmlDoc.DocumentElement.GetElementsByTagName("equipment").Count > 0) + { + if (xmlDoc.GetElementsByTagName("equipment").Item(0).SelectNodes("value").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("equipment").Item(0).SelectNodes("value"); + var loopTo1 = xmlList.Count - 1; + for (i = 0; i <= loopTo1; i++) + { + if (xmlList[i].SelectNodes("equipmentno").Count == 0) + { + throw new iMESException.MESException("0000-200002", "[%EquipmentNo%] [%cannotbeempty%]"); + } + + // 將資料存入暫存Table + drData = dtEquipment.NewRow(); + drData["EquipmentNo"] = xmlList[i].SelectNodes("equipmentno").Item(0).InnerText; + if (xmlList[i].SelectNodes("loadport").Count > 0) + { + drData["LoadPort"] = xmlList[i].SelectNodes("loadport").Item(0).InnerText; + } + dtEquipment.Rows.Add(drData); + } + } + } + //TsungyYu 2021/06/10取出 Chamber-------------------------------------------------------------------------------------------- + + dtEquipmentChamber = new DataTable("EquipmentChamber"); + dtEquipmentChamber.Columns.Add("EquipmentNo", System.Type.GetType("System.String")); + dtEquipmentChamber.Columns.Add("BelongEquipmentNo", System.Type.GetType("System.String")); + if (xmlDoc.DocumentElement.GetElementsByTagName("equipmentchamber").Count > 0) + { + if (xmlDoc.GetElementsByTagName("equipmentchamber").Item(0).SelectNodes("value").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("equipmentchamber").Item(0).SelectNodes("value"); + var loopTo1 = xmlList.Count - 1; + for (i = 0; i <= loopTo1; i++) + { + if (xmlList[i].SelectNodes("equipmentno").Count == 0) + { + throw new iMESException.MESException("0000-200002", "[%EquipmentNo%] [%cannotbeempty%]"); + } + //將資料存入暫存Table + drData = dtEquipmentChamber.NewRow(); + drData["EquipmentNo"] = xmlList[i].SelectNodes("equipmentno").Item(0).InnerText; + drData["BelongEquipmentNo"] = xmlList[i].SelectNodes("belongequipmentno").Item(0).InnerText; + dtEquipmentChamber.Rows.Add(drData); + } + } + } + // 多人加工 + DataTable dtLoginState; + dtLoginState = new DataTable("tblLoginState"); + dtLoginState.Columns.Add("UserNo", Type.GetType("System.String")); + dtLoginState.Columns.Add("UserName", Type.GetType("System.String")); + dtLoginState.Columns.Add("CheckInTime", Type.GetType("System.DateTime")); + + if (xmlDoc.DocumentElement.GetElementsByTagName("loginstate").Count > 0) + { + if (xmlDoc.GetElementsByTagName("loginstate").Item(0).SelectNodes("value").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("loginstate").Item(0).SelectNodes("value"); + var loopTo2 = xmlList.Count - 1; + for (i = 0; i <= loopTo2; i++) + { + if (xmlList[i].SelectNodes("userno").Count == 0 || xmlList[i].SelectNodes("username").Count == 0 || xmlList[i].SelectNodes("checkintime").Count == 0) + { + throw new iMESException.MESException("0000-200002", "[%userno%], [%username%], [%checkintime%] [%not found%]"); + } + // 將資料存入暫存Table + drData = dtLoginState.NewRow(); + drData["UserNo"] = xmlList[i].SelectNodes("userno").Item(0).InnerText; + drData["UserName"] = xmlList[i].SelectNodes("username").Item(0).InnerText; + drData["CheckInTime"] = xmlList[i].SelectNodes("checkintime").Item(0).InnerText; + dtLoginState.Rows.Add(drData); + } + } + } + + // 模治具 + DataTable dtAccessory; + dtAccessory = new DataTable("Accessory"); + dtAccessory.Columns.Add("EquipmentNo", Type.GetType("System.String")); + dtAccessory.Columns.Add("AccessoryNo", Type.GetType("System.String")); + dtAccessory.Columns.Add("AccessoryVersion", Type.GetType("System.String")); + dtAccessory.Columns.Add("AccessoryType", Type.GetType("System.String")); + dtAccessory.Columns.Add("AccumulateQty", Type.GetType("System.Decimal")); + + if (xmlDoc.DocumentElement.GetElementsByTagName("accessory").Count > 0) + { + if (xmlDoc.GetElementsByTagName("accessory").Item(0).SelectNodes("value").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("accessory").Item(0).SelectNodes("value"); + var loopTo3 = xmlList.Count - 1; + for (i = 0; i <= loopTo3; i++) + { + if (xmlList[i].SelectNodes("equipmentno").Count == 0 || xmlList[i].SelectNodes("accessoryno").Count == 0 || xmlList[i].SelectNodes("accessoryversion").Count == 0 || xmlList[i].SelectNodes("accessorytype").Count == 0 || xmlList[i].SelectNodes("accumulateqty").Count == 0) + { + throw new iMESException.MESException("0000-200002", "[%equipmentno%], [%accessoryno%], [%accessoryversion%], [%accessorytype%],[%accumulateqty%] [%not found%]"); + } + // 將資料存入暫存Table + drData = dtAccessory.NewRow(); + drData["EquipmentNo"] = xmlList[i].SelectNodes("equipmentno").Item(0).InnerText; + drData["AccessoryNo"] = xmlList[i].SelectNodes("accessoryno").Item(0).InnerText; + drData["AccessoryVersion"] = xmlList[i].SelectNodes("accessoryversion").Item(0).InnerText; + drData["AccessoryType"] = xmlList[i].SelectNodes("accessorytype").Item(0).InnerText; + drData["AccumulateQty"] = xmlList[i].SelectNodes("accumulateqty").Item(0).InnerText; + dtAccessory.Rows.Add(drData); + } + } + } + else + { + // Kevin 20140106,區分沒選模治具與沒顯示模治具,介面沒顯示模治具則設為Nothing + dtAccessory = null; + } + + dtMTLLot = new DataTable("Temp_MaterialLot"); + dtMTLLot.Columns.Add("MaterialNo", Type.GetType("System.String")); + dtMTLLot.Columns.Add("MaterialLotNo", Type.GetType("System.String")); + + if (xmlDoc.DocumentElement.GetElementsByTagName("temp_materiallot").Count > 0) + { + if (xmlDoc.GetElementsByTagName("temp_materiallot").Item(0).SelectNodes("value").Count > 0) + { + xmlList = xmlDoc.GetElementsByTagName("temp_materiallot").Item(0).SelectNodes("value"); + var loopTo4 = xmlList.Count - 1; + for (i = 0; i <= loopTo4; i++) + { + // 將資料存入暫存Table + drData = dtMTLLot.NewRow(); + drData["MaterialNo"] = xmlList[i].SelectNodes("materialno").Item(0).InnerText; + drData["MaterialLotNo"] = xmlList[i].SelectNodes("materiallotno").Item(0).InnerText; + dtMTLLot.Rows.Add(drData); + } + } + } + + // 3.檢查投料點在機台的料是否足夠 ------------------------------------------------------------------------------------------- + objLot.ChkMaterialOnEquipment(LotNo, dtEquipment); + + // 4.Update CheckIn---------------------------------------------------------------------------------------------------------- + string LanguageMode = GetXMLLanguageMode(xmlDoc); + objLot.BR_CheckIn(LotStamp, LotNo, LinkName, dtAttrib, dtEquipment, UserNo, ShiftNo, LotRecord, CheckInTime, RuleNo, dtLoginState, dtAccessory, dtMTLLot, LanguageMode, dtEquipmentChamber); + + // 5.Return Value------------------------------------------------------------------------------------------------------------ + strException = ""; + strResult = "success"; + + objSYS.AddEventLog(strServiceName, UserNo, "LotNo", LotNo, DateTime.Now, "Exe_CheckIn", ComputerName: GetXMLCurComputer(xmlDoc)); + } + + catch (iMESException.MESException ex) + { + strReturnValue = ""; + switch (ex.ErrorCode.ToString() ?? "") + { + case "IPQCNO": + { + strException = CombineXMLException(ex.ErrorCode.ToString(), TranslateMsg(ex.Message, GetXMLLanguageMode(xmlDoc), strResourceDir), "IPQCNO", ex.StackTrace); + break; + } + + default: + { + strException = CombineXMLException(Conversions.ToString(ex.ErrorCode), TranslateMsg(ex.Message, GetXMLLanguageMode(xmlDoc), strResourceDir), "Exe_CheckIn fail!", ex.StackTrace); + break; + } + } + strResult = "fail"; + objSYS.AddErrorLog_ErrorCode(strServiceName, UserNo, "LotNo", LotNo, DateTime.Now, strException, ComputerName: GetXMLCurComputer(xmlDoc), ErrorCode: Conversions.ToString(ex.ErrorCode)); + } + + catch (Exception ex) + { + strReturnValue = ""; + strException = CombineXMLException(defWSErrCode, ex.Message, "Exe_CheckIn fail!", ex.StackTrace); + strResult = "fail"; + objSYS.AddErrorLog_ErrorCode(strServiceName, UserNo, "LotNo", LotNo, DateTime.Now, strException, ComputerName: GetXMLCurComputer(xmlDoc)); + } + + finally + { + // 將各部份之XML字串組起來並傳出 + Exe_CheckInRet = CombineXMLResponse(strIdentity, strReturnValue, strException, strResult, ""); + + } + return Exe_CheckInRet; + + } + } } \ No newline at end of file