=datEndTime.
+ // L計算起迄 : S---------------------------------------------------------------------E
+ // L6 Wait_1st : |-------------------------------------------------------------------------------------------------------|
+ strSQL = "Select CreateDate,ReleaseDate,WaitNo From tblWIPWaitBasis " + " Where LotNo='" + strFromLotNo + "'" + " And CreateDate<=To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And (ReleaseDate>=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') or ReleaseDate is null) " + " Order by ReleaseDate";
+ SQLCommandTuning(strDataBaseType, ref strSQL);
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ while (drTemp.Read())
+ {
+ // 切割點
+ // -CreateDate在外面,不需加入.
+ // -ReleaseDate在外面,不需加入.
+
+ // 排除時間段
+ drAdd = dtHoldWait.NewRow();
+ drAdd["LotNo"] = strLotNo;
+ drAdd["LogGroupSerial"] = strLogGroupSerial;
+ drAdd["StartTime"] = Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss");
+ drAdd["EndTime"] = Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss");
+ drAdd["DType"] = "W";
+ drAdd["DTypeNo"] = drTemp["WaitNo"];
+ dtHoldWait.Rows.Add(drAdd);
+ }
+ drTemp.Close();
+ //cmmTemp.Dispose();
+ }
+ }
+
+ catch
+ {
+ throw;
+ }
+ finally
+ {
+
+ }
+
+ return default(string);
+
+ }
+
+ private int funWriteShareEMPLog(string WriteTxt)
+ {
+ int funWriteShareEMPLogRet = default(int);
+
+ funWriteShareEMPLogRet = -1;
+
+ try
+ {
+ if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + @"\Log"))
+ {
+ Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + @"\Log");
+ }
+
+ var fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + @"\Log\AutoRun_ShareEMPTime_Log_" + Strings.Format(DateTime.Now, "yyyyMMdd") + ".txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
+ var w = new StreamWriter(fs);
+
+ w.BaseStream.Seek(0L, SeekOrigin.End);
+ w.WriteLine(Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + " " + WriteTxt);
+ w.Close();
+ fs.Close();
+
+ funWriteShareEMPLogRet = 0;
+ }
+
+ catch (Exception e1)
+ {
+
+ }
+
+ return funWriteShareEMPLogRet;
+
+ }
+
+ #endregion
+
+ #region ---設備保養工單自動開立---
+
+ private string funPMWOAutoCreate_EQPTypeSOP(Collection colParameters = null)
+ {
+ string funPMWOAutoCreate_EQPTypeSOPRet = default(string);
+
+ var cnnTemp = default(IDbConnection);
+ //var daTemp = default(System.Data.OleDb.OleDbDataAdapter);
+
+ var colSQL = new Collection();
+ var colSQL_Rows = new Collection();
+ var dsTemp = new DataSet();
+ var dsChamber = new DataSet();
+ DataRow[] drSel;
+
+ string strSQL;
+ string strWONo;
+ DateTime datEventTime;
+
+ int intWOItemNo = 0;
+ bool blnAutoCreateWO, blnLockEquipment, blnAutoEmail, blnCreateAndReleaseWO, blnChkEQPState;
+ DataRow drAdd;
+ var dtSendMail = BuildMailTable();
+ string strSendMailMSG;
+ string EquipmentNoList = "";
+ string strEQPSerialNo;
+ int intWOType = 0; // 預防保養工單
+
+ string strFailMsg = "";
+ string ChamberManage = defString;
+ DbDataReader drTemp;
+ try
+ {
+ datEventTime = DateTime.Now;
+
+ cnnTemp = CreateConnection(strConnectionString);
+
+ //// 取出已到期的保養計劃(預估保養日PMEstDateTime <= Now)
+ //strSQL = " Select A.*,B.EquipmentNo,B.PMSerialNo,B.PMEstDateTime,B.SerialNo,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName As PMSOPName_Basis" +
+ // " From tblPMEQPTypeSOPBasis A Join tblPMEQPMaintenancePlan B On A.PMEQPSOPNo = B.PMEQPSOPNo" + " Join tblEQPEquipmentBasis C On B.EquipmentNo = C.EquipmentNo " +
+ // " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where B.PMEstDateTime <= To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') ";
+ //strSQL = SQLCommandTuning(strDataBaseType, ref strSQL);
+ ////cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ ////daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ ////daTemp.Fill(dsTemp, "PMEQPMaintenancePlan");
+ ////daTemp.Dispose();
+ //ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQPMaintenancePlan", cnnTemp);
+
+ //取出已到期的保養計劃(預估保養日PMEstDateTime-BeforehandDay <= Now), 若未設提前開單天數(BeforehandDay, 則BeforehandDay會是0)
+ strSQL = " Select A.*,B.EquipmentNo,B.PMSerialNo,B.PMEstDateTime,B.SerialNo,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName As PMSOPName_Basis" +
+ " From tblPMEQPTypeSOPBasis A Join tblPMEQPMaintenancePlan B On A.PMEQPSOPNo = B.PMEQPSOPNo" + " Join tblEQPEquipmentBasis C On B.EquipmentNo = C.EquipmentNo " +
+ " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where (B.PMEstDateTime-Nvl(A.Beforehandday,0)) <= To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') ";
+ strSQL = SQLCommandTuning(strDataBaseType, ref strSQL);
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ //daTemp.Fill(dsTemp, "PMEQPMaintenancePlan");
+ //daTemp.Dispose();
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQPMaintenancePlan", cnnTemp);
+
+ // 取出設備狀態互斥設定
+ //cmmTemp.CommandText = "Select * From tblEMSViolateStatusChange";
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ //daTemp.Fill(dsTemp, "ViolateStatusChange");
+ //daTemp.Dispose();
+ strSQL = "Select * From tblEMSViolateStatusChange";
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ViolateStatusChange", cnnTemp);
+
+ // 組出應保養的設備List
+ foreach (DataRow row in dsTemp.Tables["PMEQPMaintenancePlan"].DefaultView.ToTable(true, "EquipmentNo").Rows)
+ EquipmentNoList = Conversions.ToString(EquipmentNoList + row["EquipmentNo"] + ",");
+ EquipmentNoList = EquipmentNoList.TrimEnd(',');
+
+ // 取出各設備的EMSEquipmentState
+ //cmmTemp.CommandText = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')";
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ //daTemp.Fill(dsTemp, "EMSEquipmentState");
+ //daTemp.Dispose();
+ strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')";
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "EMSEquipmentState", cnnTemp);
+
+ // 2021/10/14 Mantis:0100751 當啟用系統參數:子設備管理,改變設備狀態時,需一併更新設備底下子設備的狀態
+ strSQL = "Select PARAMETERVALUE from tblSYSParameter where PARAMETERNO = 'ChamberManage'";
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ ChamberManage = drTemp["PARAMETERVALUE"].ToString();
+ }
+ drTemp.Dispose();
+
+
+ // 依每筆設備保養標準作業程序來開立保養工單
+ foreach (DataRow drEQPSOP in dsTemp.Tables["PMEQPMaintenancePlan"].DefaultView.ToTable(true, new[] { "PMEQPSOPNO", "AutoCreateWO", "CreateAndReleaseWO", "LockEquipment", "AutoEmail" }).Rows)
+ {
+
+ colSQL.Clear();
+ colSQL_Rows.Clear();
+
+ strWONo = "未開工單";
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPSOP["AutoCreateWO"], 1, false)))
+ {
+ blnAutoCreateWO = true;
+ }
+ else
+ {
+ blnAutoCreateWO = false;
+ }
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPSOP["CreateAndReleaseWO"], 1, false)))
+ {
+ blnCreateAndReleaseWO = true;
+ }
+ else
+ {
+ blnCreateAndReleaseWO = false;
+ }
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPSOP["LockEquipment"], 1, false))) // 變更機台狀態
+ {
+ blnLockEquipment = true;
+ }
+ else
+ {
+ blnLockEquipment = false;
+ }
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPSOP["AutoEmail"], 1, false))) // 是否要發送Mail
+ {
+ blnAutoEmail = true;
+ }
+ else
+ {
+ blnAutoEmail = false;
+ }
+
+ foreach (DataRow drEQP in dsTemp.Tables["PMEQPMaintenancePlan"].Select(Conversions.ToString("PMEQPSOPNO = '" + drEQPSOP["PMEQPSOPNo"] + "'")))
+ {
+
+ if (string.IsNullOrEmpty(drEQP["PMSOPName_Basis"].ToString()))
+ {
+ if (!string.IsNullOrEmpty(strFailMsg))
+ {
+ strFailMsg = Conversions.ToString(strFailMsg + Constants.vbCrLf + "[PMSOPBasis does not exist, PMSOPNo:" +
+ drEQP["PMSOPNo"] + "]");
+ }
+ else
+ {
+ strFailMsg = Conversions.ToString("[PMSOPBasis does not exist, PMSOPNo:" + drEQP["PMSOPNo"] + "]");
+ }
+ continue;
+ }
+
+ // 設備狀態變更處理
+ blnChkEQPState = true; //設備狀態檢核通過預設為通過, 只有要改變設備狀態且設備狀態互斥時才會被改為false
+ //沒有設提早開單且有要改變設備狀態的, 才做設備狀態變更
+ if (Conversions.ToInteger(drEQP["BeforehandDay"]) == 0 && blnLockEquipment == true && !string.IsNullOrEmpty(drEQP["EquipmentState"].ToString()))
+ {
+ drSel = dsTemp.Tables["EMSEquipmentState"].Select(Conversions.ToString("EquipmentNo = '" + drEQP["EquipmentNo"] + "'"));
+ if (drSel.Length > 0)
+ {
+ // 狀態互斥則開工單但不下線
+ if (dsTemp.Tables["ViolateStatusChange"].Select(Conversions.ToString("EquipmentState = " +
+ drSel[0]["EquipmentState"] + " And ViolativeState = " + drEQP["EquipmentState"])).Length > 0)
+ {
+ //continue;
+ blnChkEQPState = false;
+ }
+
+ else
+ {
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drSel[0]["EquipmentState"], drEQP["EquipmentState"], false))) // 狀態不同才需改變設備狀態
+ {
+
+ strEQPSerialNo = InitEQPSerialNo();
+
+ if (strEQPSerialNo == "fail")
+ {
+ funPMWOAutoCreate_EQPTypeSOPRet = "fail;[Get InitEQPSerialNo fail]";
+ return funPMWOAutoCreate_EQPTypeSOPRet;
+ }
+
+ // Del Same EQPSerialNo
+ strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" + drSel[0]["EQPSerialNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(-1);
+
+ // Add EMSEquipmentStateLog
+ strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" +
+ drEQP["EquipmentNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+
+ // 更新EMSEquipmentState
+ strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " +
+ drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ," +
+ "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" + "Where EquipmentNo = '" +
+ drEQP["EquipmentNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ // 若開啟子設備管理,則須更新設備下子設備的設備狀態
+ if (ChamberManage == "1")
+ {
+ strSQL = "Select EquipmentNo from tblEQPEquipmentBasis Where BELONGEQUIPMENTNO = '" + drEQP["EquipmentNo"].ToString() + "'";
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ dsChamber = new DataSet();
+ //daTemp.Fill(dsChamber, "ChamberData");
+ //daTemp.Dispose();
+ ExecuteSQLQuery_Adapter(strSQL, dsChamber, "ChamberData", cnnTemp);
+ foreach (DataRow dr in dsChamber.Tables["ChamberData"].Rows)
+ {
+ strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo = '" + dr["EquipmentNo"].ToString() + "'";
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ // 設備狀態不同才變更
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drEQP["EquipmentState"], drTemp["EquipmentState"], false)))
+ {
+ strEQPSerialNo = InitEQPSerialNo();
+
+ if (strEQPSerialNo == "fail")
+ {
+ funPMWOAutoCreate_EQPTypeSOPRet = "fail;[Get InitEQPSerialNo fail]";
+ return funPMWOAutoCreate_EQPTypeSOPRet;
+ }
+
+ // Del Same EQPSerialNo
+ strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" +
+ drTemp["EQPSerialNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(-1);
+
+ // Add EMSEquipmentStateLog
+ strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" +
+ drTemp["EquipmentNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+
+ // 更新EMSEquipmentState
+ strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " +
+ drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") +
+ "','YYYY/MM/DD HH24:MI:SS') ," + "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," +
+ "UserNo = 'AutoRun'" + "Where EquipmentNo = '" + drTemp["EquipmentNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ }
+ }
+ drTemp.Dispose();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // 2.保養工單開立處理
+ if (blnAutoCreateWO == true)
+ {
+
+ if (strWONo == "未開工單")
+ {
+ strWONo = InitPMWONo();
+ intWOItemNo = 0;
+ strSQL = "Insert into tblPMWoBasis(WONo,WOType,IssueState,CreateDate,Creator,Description) " +
+ " Values ('" + strWONo + "'," + intWOType + ",2,To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'Auto Run','Auto Run Create')";
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ }
+
+ intWOItemNo += 1;
+
+ // 保養工單開立及自動下線: 需為保養工單開立即下線且不為提前開單(BeforehandDay=0)的工單且設備狀態檢核通過才可直接下線
+ if (blnCreateAndReleaseWO == true && Conversions.ToInteger(drEQP["BeforehandDay"]) == 0 && blnChkEQPState == true)
+ {
+ // 保養工單開立後直接下線, 狀態為2, ReleaseDate為目前時間
+ strSQL = "Insert into tblPMWODetail(" + " WONo,WOItemNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,PMSOPNO,PMESTDATETIME,RELEASEDATE,WOStatus,SerialNo)" + " Values('"
+ + strWONo + "'," + intWOItemNo + "," + drEQP["PMSerialNo"] + ",'" + drEQP["EquipmentNo"] + "','" + drEQP["PMEQPSOPNo"] + "','" + drEQP["PMSOPNO"] + "'," +
+ " To_Date('" + Strings.Format(drEQP["PMESTDATETIME"], "yyyy/MM/dd") + "','YYYY/MM/DD')" + ", To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'), 2,'" + drEQP["SerialNo"] + "')";
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+
+ // ExecuteState=3表示已下線工單, WOReleaseDate為目前時間
+ strSQL = "Insert into tblPMEQPMaintenancePlanLog(SerialNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,FrequencyNo,PMSOPNo,PMEstDateTime,Creator,CreateDate,Reviser,ReviseDate," +
+ "ExecuteState,PMWONo,PMWoItemNo,WOCreateDate,LogCreator,LogCreateDate,WOReleaseDate) " +
+ " Select SerialNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,FrequencyNo,PMSOPNo,PMEstDateTime,Creator,CreateDate," + " Reviser,ReviseDate,3,'" + strWONo + "'," + intWOItemNo + "," +
+ " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'),'Auto Run'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'), " +
+ " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') " + " From tblPMEQPMaintenancePlan " + " Where SerialNo='" + drEQP["SerialNo"] + "'";
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ }
+ else
+ {
+ // 保養工單開立後不直接下線, 狀態為1:待料, ReleaseDate為空
+ strSQL = "Insert into tblPMWODetail(" + " WONo,WOItemNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,PMSOPNO,PMESTDATETIME,WOStatus,SerialNo)" + " Values('"
+ + strWONo + "'," + intWOItemNo + "," + drEQP["PMSerialNo"] + ",'" + drEQP["EquipmentNo"] + "','" + drEQP["PMEQPSOPNo"] + "','" + drEQP["PMSOPNO"] + "'," +
+ " To_Date('" + Strings.Format(drEQP["PMESTDATETIME"], "yyyy/MM/dd") + "','YYYY/MM/DD'),1,'" + drEQP["SerialNo"] + "')";
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+
+ // ExecuteState=2表示工單開立, WOReleaseDate為空
+ strSQL = "Insert into tblPMEQPMaintenancePlanLog(SerialNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,FrequencyNo,PMSOPNo,PMEstDateTime,Creator,CreateDate,Reviser,ReviseDate," +
+ "ExecuteState,PMWONo,PMWoItemNo,WOCreateDate,LogCreator,LogCreateDate) " +
+ " Select SerialNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,FrequencyNo,PMSOPNo,PMEstDateTime,Creator,CreateDate," + " Reviser,ReviseDate,2,'" + strWONo + "'," + intWOItemNo + "," +
+ " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'),'Auto Run'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') " +
+ " From tblPMEQPMaintenancePlan " + " Where SerialNo='" + drEQP["SerialNo"] + "'";
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ }
+
+ // 清除PMEQPMaintancePlan資料
+ strSQL = Conversions.ToString("Delete From tblPMEQPMaintenancePlan Where SerialNo='" + drEQP["SerialNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ }
+
+ // 3.Mail發送處理
+ if (blnAutoEmail == true)
+ {
+ drAdd = dtSendMail.NewRow();
+ drAdd["WONo"] = strWONo;
+ drAdd["EquipmentNo"] = drEQP["EquipmentNo"] + "";
+ drAdd["EquipmentName"] = drEQP["EquipmentName"] + "";
+ drAdd["FrequencyName"] = drEQP["FrequencyName"] + "";
+ drAdd["PMSOPName"] = drEQP["PMSOPName"] + "";
+ drAdd["EngineerGroupNo"] = drEQP["EngineerGroupNo"] + "";
+ dtSendMail.Rows.Add(drAdd);
+ }
+
+ // 4. 更新設備的PMEqupmentState
+ strSQL = Conversions.ToString("Update tblPMEquipmentState Set SincePMQty = 0, SincePMTimes = 0, LastPMDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " Where EquipmentNo = '" +
+ drEQP["EquipmentNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ }
+
+ ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows);
+ }
+
+ dtSendMail = dtSendMail.DefaultView.ToTable(true, new[] { "WONo", "EquipmentNo", "FrequencyName", "PMSOPName", "EngineerGroupNo" });
+
+ foreach (DataRow rowGroupNo in dtSendMail.DefaultView.ToTable(true, "EngineerGroupNo").Rows)
+ {
+ strSendMailMSG = "PM Work Order
";
+
+ foreach (DataRow row in dtSendMail.Select(Conversions.ToString("EngineerGroupNo = '" + rowGroupNo["EngineerGroupNo"] + "'")))
+ {
+ strSendMailMSG = Conversions.ToString(strSendMailMSG + "WONo: " + row["WONo"] + "
");
+ strSendMailMSG = Conversions.ToString(strSendMailMSG + "EquipemntNo: " + row["EquipmentNo"] + "
");
+ strSendMailMSG = Conversions.ToString(strSendMailMSG + "PMSOPName: " + row["PMSOPName"] + "
");
+ strSendMailMSG = Conversions.ToString(strSendMailMSG + "FrequencyName: " + row["FrequencyName"] + "
");
+ }
+
+ if (!string.IsNullOrEmpty(strSendMailMSG))
+ {
+ strSendMailMSG += "";
+ string argFileName = "N/A";
+ string argEmailSubject = "PM Work Order";
+ modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, strSendMailMSG, Conversions.ToString(rowGroupNo["EngineerGroupNo"]), GroupType: (modAutoRunLibrary.GroupType)2);
+ }
+ }
+
+ //當參數1「已開立工單逾保養日自動下線」的值為Y時,需查核透過 Auto Run 所自動開立的預防保養工單(tblPMWoBasis.Creator = Auto Run And tblPMWoBasis.WOType = 0),
+ //若已超過其預定保養日(PMEstDateTime),但該保養工單還未下線(包含這次所開立的保養工單及不排除提早開單的工單),則將該保養工單做下線,
+ //設備狀態則依該保養工單所對應的設備保養標準程序(PM201)中,所設定是否改變設備狀態,來決定要不要改變設備狀態,若設定要變更設備狀態,但設備狀態無法變更時,就不下線該保養工單。
+ if (colParameters["Parameter01"].ToString() == "Y")
+ {
+ bool blnReleaseWO = true;
+
+ datEventTime = DateTime.Now;
+
+ //取出已到期的保養計劃(預估保養日PMEstDateTime <= Now)
+ strSQL = " Select A.*,B.EquipmentNo,B.SerialNo,C.LockEquipment, C.EquipmentState" +
+ " From tblPMWoDetail A Join tblPMWOBasis Basis On A.WONo = Basis.WONo" +
+ " Join tblPMEQPMaintenancePlanLog B On A.WONo = B.PMWONo" +
+ " Join tblPMEQPTypeSOPBasis C On B.PMEQPSOPNo = C.PMEQPSOPNo" +
+ " Where Basis.Creator = 'Auto Run' And A.WOStatus = 1 And B.PMEstDateTime < To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') ";
+ strSQL = SQLCommandTuning(strDataBaseType, ref strSQL);
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "OverPMDate", cnnTemp);
+
+ // 組出應保養的設備List
+ EquipmentNoList = "";
+ foreach (DataRow row in dsTemp.Tables["OverPMDate"].DefaultView.ToTable(true, "EquipmentNo").Rows)
+ EquipmentNoList = Conversions.ToString(EquipmentNoList + row["EquipmentNo"] + ",");
+ EquipmentNoList = EquipmentNoList.TrimEnd(',');
+
+ // 取出各設備的EMSEquipmentState
+ if (dsTemp.Tables["EMSEquipmentState"] != null)
+ {
+ dsTemp.Tables.Remove(dsTemp.Tables["EMSEquipmentState"]);
+ }
+ strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')";
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "EMSEquipmentState", cnnTemp);
+
+ foreach (DataRow row in dsTemp.Tables["OverPMDate"].Rows)
+ {
+ colSQL.Clear();
+ colSQL_Rows.Clear();
+ blnReleaseWO = true;
+
+ if (row["LockEquipment"].ToString() == "1" && !string.IsNullOrEmpty(row["EquipmentState"].ToString())) //需改變設備狀態
+ {
+ drSel = dsTemp.Tables["EMSEquipmentState"].Select("EquipmentNo = '" + row["EquipmentNo"] + "'");
+ if (drSel.Length > 0)
+ {
+ // 設備狀態不相等且互斥則不可下線
+ if (drSel[0]["EquipmentState"] != row["EquipmentState"] && dsTemp.Tables["ViolateStatusChange"].Select("EquipmentState = " + drSel[0]["EquipmentState"] + " And ViolativeState = " + row["EquipmentState"]).Length > 0)
+ {
+ blnReleaseWO = false;
+ }
+ }
+ }
+
+ if (blnReleaseWO == true)
+ {
+ strSQL = "Update tblPMWODetail Set WOStatus = 2, ReleaseDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') Where WONo = '" + row["WONo"] + "' And WOItemNo = " + row["WOItemNo"];
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+
+ strSQL = "Update tblPMEQPMaintenancePlanLog Set ExecuteState = 3, WOReleaseDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') Where SerialNo = '" + row["SerialNo"] + "'";
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+
+ ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows);
+ }
+ }
+ }
+
+ if (!string.IsNullOrEmpty(strFailMsg))
+ {
+ funPMWOAutoCreate_EQPTypeSOPRet = "fail;" + strFailMsg;
+ }
+ else
+ {
+ funPMWOAutoCreate_EQPTypeSOPRet = "success";
+ }
+ }
+
+ catch (Exception ex)
+ {
+ funPMWOAutoCreate_EQPTypeSOPRet = CombineFailMsg("0000-999999", ex.Message);
+ }
+
+ finally
+ {
+ // //釋放資源
+ if (dsTemp != null)
+ {
+ dsTemp.Dispose();
+ dsTemp = null;
+ }
+
+ //if (daTemp != null)
+ //{
+ // daTemp.Dispose();
+ // daTemp = null;
+ //}
+
+ colSQL = null;
+ colSQL_Rows = null;
+
+ // //Close Connection
+ CloseConnection(cnnTemp);
+ }
+
+ return funPMWOAutoCreate_EQPTypeSOPRet;
+
+ }
+
+ private string funPMWOAutoCreate_FixedQty(Collection colParameters = null)
+ {
+ string funPMWOAutoCreate_FixedQtyRet = default(string);
+
+ var cnnTemp = default(IDbConnection);
+ //var daTemp = default(System.Data.OleDb.OleDbDataAdapter);
+
+ var colSQL = new Collection();
+ var colSQL_Rows = new Collection();
+ var dsTemp = new DataSet();
+ DataRow[] drSel;
+
+ string strSQL;
+ string strWONo;
+ DateTime datEventTime;
+
+ int intWOItemNo = 0;
+ bool blnAutoCreateWO, blnLockEquipment, blnAutoEmail;
+ DataRow drAdd;
+ var dtSendMail = BuildMailTable();
+ string strSendMailMSG;
+ string EquipmentNoList = "";
+ string strEQPSerialNo;
+ int intWOType = 2; // 定量保養工單
+
+ string strFailMsg = "";
+ var dsChamber = new DataSet();
+ string ChamberManage = defString;
+ DbDataReader drTemp;
+ try
+ {
+ datEventTime = DateTime.Now;
+
+ cnnTemp = CreateConnection(strConnectionString);
+
+ // 取出數量已到的設備(SincePMQty >= Quantity)
+ // 2019/12/5, Ning, 改用 Left Join tblPMSOPBasis
+ //2023/3/9,Ning,若有設定寬限數量(tblPMFixedQtyPMBasis.ToleranceQty<>0), 則改成取出已達寬限數量的設備(TypeCode:0 -> EquipmentNo ,1 -> EquipmentType)
+ strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedQtyPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" +
+ " Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" +
+ " Where A.TypeCode = 0 And ((B.SincePMQty >= A.Quantity And A.ToleranceQty = 0) OR (B.SincePMQty >= A.ToleranceQty And A.ToleranceQty <> 0))";
+ // strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " &
+ // " From tblPMFixedQtyPMBasis A,tblPMEquipmentState B,tblEQPEquipmentBasis C, tblPMSOPBasis D " &
+ // " Where A.TypeCode = 0 And A.EquipmentNo = B.EquipmentNo And B.EquipmentNo = C.EquipmentNo And A.PMSOPNo = D.PMSOPNo" &
+ // " And B.SincePMQty >= A.Quantity "
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ //daTemp.Fill(dsTemp, "PMEQP");
+ //daTemp.Dispose();
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQP", cnnTemp);
+
+ // 取出設備狀態互斥設定
+ //cmmTemp.CommandText = "Select * From tblEMSViolateStatusChange";
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ //daTemp.Fill(dsTemp, "ViolateStatusChange");
+ //daTemp.Dispose();
+ strSQL = "Select * From tblEMSViolateStatusChange";
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ViolateStatusChange", cnnTemp);
+
+ // 組出應保養的設備List
+ foreach (DataRow drEQP in dsTemp.Tables["PMEQP"].Rows)
+ EquipmentNoList = Conversions.ToString(EquipmentNoList + drEQP["EquipmentNo"] + ",");
+ EquipmentNoList = EquipmentNoList.TrimEnd(',');
+
+ // 取出各設備的EMSEquipmentState
+ //cmmTemp.CommandText = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')";
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ //daTemp.Fill(dsTemp, "EMSEquipmentState");
+ //daTemp.Dispose();
+ strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')";
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "EMSEquipmentState", cnnTemp);
+
+ strSQL = "Select PARAMETERVALUE from tblSYSParameter where PARAMETERNO = 'ChamberManage'";
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ ChamberManage = drTemp["PARAMETERVALUE"].ToString();
+ }
+ drTemp.Dispose();
+
+ // 依每筆設備的定量保養設定來開立保養工單(同一設備類別開一張保養工單)
+ foreach (DataRow drEQPType in dsTemp.Tables["PMEQP"].DefaultView.ToTable(true, new[] { "EquipmentType", "AutoCreateWO", "LockEquipment", "AutoEmail" }).Rows)
+ {
+
+ colSQL.Clear();
+ colSQL_Rows.Clear();
+
+ strWONo = "未開工單";
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["AutoCreateWO"], 1, false)))
+ {
+ blnAutoCreateWO = true;
+ }
+ else
+ {
+ blnAutoCreateWO = false;
+ }
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["LockEquipment"], 1, false))) // 變更機台狀態
+ {
+ blnLockEquipment = true;
+ }
+ else
+ {
+ blnLockEquipment = false;
+ }
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["AutoEmail"], 1, false))) // 是否要發送Mail
+ {
+ blnAutoEmail = true;
+ }
+ else
+ {
+ blnAutoEmail = false;
+ }
+
+ foreach (DataRow drEQP in dsTemp.Tables["PMEQP"].Select(Conversions.ToString("EquipmentType = '" + drEQPType["EquipmentType"] + "'")))
+ {
+
+ if (string.IsNullOrEmpty(drEQP["PMSOPName"].ToString()))
+ {
+ if (!string.IsNullOrEmpty(strFailMsg))
+ {
+ strFailMsg = Conversions.ToString(strFailMsg + Constants.vbCrLf + "[PMSOPBasis does not exist, PMSOPNo:" +
+ drEQP["PMSOPNo"] + "]");
+ }
+ else
+ {
+ strFailMsg = Conversions.ToString("[PMSOPBasis does not exist, PMSOPNo:" + drEQP["PMSOPNo"] + "]");
+ }
+ continue;
+ }
+
+ // 設備狀態變更處理
+ if (blnLockEquipment == true && !string.IsNullOrEmpty(drEQP["EquipmentState"].ToString()))
+ {
+
+ drSel = dsTemp.Tables["EMSEquipmentState"].Select(Conversions.ToString("EquipmentNo = '" + drEQP["EquipmentNo"] + "'"));
+ if (drSel.Length > 0)
+ {
+ // 狀態互斥則續下筆
+ if (dsTemp.Tables["ViolateStatusChange"].Select(Conversions.ToString("EquipmentState = " +
+ drSel[0]["EquipmentState"] + " And ViolativeState = " + drEQP["EquipmentState"])).Length > 0)
+ {
+ continue;
+ }
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drSel[0]["EquipmentState"], drEQP["EquipmentState"], false))) // 狀態不同才需改變設備狀態
+ {
+
+ strEQPSerialNo = InitEQPSerialNo();
+
+ if (strEQPSerialNo == "fail")
+ {
+ funPMWOAutoCreate_FixedQtyRet = "fail;[Get InitEQPSerialNo fail]";
+ return funPMWOAutoCreate_FixedQtyRet;
+ }
+
+ // Del Same EQPSerialNo
+ strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" + drSel[0]["EQPSerialNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(-1);
+
+ // Add EMSEquipmentStateLog
+ strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" +
+ drEQP["EquipmentNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+
+ // 更新EMSEquipmentState, 以EquipmentState做RowCount查核
+ strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " +
+ drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ," +
+ "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" + "Where EquipmentNo = '" + drEQP["EquipmentNo"] +
+ "' And EquipmentState = " + drSel[0]["EquipmentState"]);
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ // 若開啟子設備管理,則須更新設備下子設備的設備狀態
+ if (ChamberManage == "1")
+ {
+ strSQL = "Select EquipmentNo from tblEQPEquipmentBasis Where BELONGEQUIPMENTNO = '" + drEQP["EquipmentNo"].ToString() + "'";
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ dsChamber = new DataSet();
+ //daTemp.Fill(dsChamber, "ChamberData");
+ //daTemp.Dispose();
+ ExecuteSQLQuery_Adapter(strSQL, dsChamber, "ChamberData", cnnTemp);
+ foreach (DataRow dr in dsChamber.Tables["ChamberData"].Rows)
+ {
+ strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo = '" + dr["EquipmentNo"].ToString() + "'";
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ // 設備狀態不同才變更
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drEQP["EquipmentState"], drTemp["EquipmentState"], false)))
+ {
+ strEQPSerialNo = InitEQPSerialNo();
+
+ if (strEQPSerialNo == "fail")
+ {
+ funPMWOAutoCreate_FixedQtyRet = "fail;[Get InitEQPSerialNo fail]";
+ return funPMWOAutoCreate_FixedQtyRet;
+ }
+
+ // Del Same EQPSerialNo
+ strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" +
+ drTemp["EQPSerialNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(-1);
+
+ // Add EMSEquipmentStateLog
+ strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" +
+ drTemp["EquipmentNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+
+ // 更新EMSEquipmentState
+ strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " +
+ drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") +
+ "','YYYY/MM/DD HH24:MI:SS') ," + "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" +
+ "Where EquipmentNo = '" + drTemp["EquipmentNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ }
+ }
+ drTemp.Dispose();
+ }
+ }
+ }
+ }
+ }
+
+ // 2.保養工單開立處理
+ if (blnAutoCreateWO == true)
+ {
+
+ if (strWONo == "未開工單")
+ {
+ strWONo = InitPMWONo();
+ intWOItemNo = 0;
+ strSQL = "Insert into tblPMWoBasis(WONo,WOType,IssueState,CreateDate,Creator,Description) " + " Values ('" + strWONo + "'," + intWOType + ",2,To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'Auto Run','Auto Run Create')";
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ }
+
+ intWOItemNo += 1;
+
+ // 保養工單開立後直接下線, WOStatus = 2
+ // 2020/4/29, Ning, 保養工單開立後不直接下線, 狀態為1:待料
+ strSQL = "Insert into tblPMWODetail(WONo,WOItemNo,PMSerialNo,EquipmentNo,PMSOPNO,PMESTDATETIME,WOStatus) Values('" +
+ strWONo + "'," + intWOItemNo + "," + intWOItemNo + ",'" + drEQP["EquipmentNo"] + "','" + drEQP["PMSOPNO"] + "'," +
+ " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'),1)";
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ }
+
+ // 3.Mail發送處理
+ if (blnAutoEmail == true)
+ {
+ drAdd = dtSendMail.NewRow();
+ drAdd["WONo"] = strWONo;
+ drAdd["EquipmentNo"] = drEQP["EquipmentNo"] + "";
+ drAdd["EquipmentName"] = drEQP["EquipmentName"] + "";
+ drAdd["PMSOPName"] = drEQP["PMSOPName"] + "";
+ drAdd["EngineerGroupNo"] = drEQP["EngineerGroupNo"] + "";
+ dtSendMail.Rows.Add(drAdd);
+ }
+
+ // 4. 更新設備的PMEqupmentState
+ strSQL = Conversions.ToString("Update tblPMEquipmentState Set SincePMQty = 0, SincePMTimes = 0, LastPMDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " Where EquipmentNo = '" +
+ drEQP["EquipmentNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ }
+
+ ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows);
+ }
+
+ dtSendMail = dtSendMail.DefaultView.ToTable(true, new[] { "WONo", "EquipmentNo", "PMSOPName", "EngineerGroupNo" });
+
+ foreach (DataRow rowGroupNo in dtSendMail.DefaultView.ToTable(true, "EngineerGroupNo").Rows)
+ {
+ strSendMailMSG = "Fixed Qty Work Order
";
+
+ foreach (DataRow row in dtSendMail.Select(Conversions.ToString("EngineerGroupNo = '" + rowGroupNo["EngineerGroupNo"] + "'")))
+ {
+ strSendMailMSG = Conversions.ToString(strSendMailMSG + "WONo: " + row["WONo"] + "
");
+ strSendMailMSG = Conversions.ToString(strSendMailMSG + "EquipemntNo: " + row["EquipmentNo"] + "
");
+ strSendMailMSG = Conversions.ToString(strSendMailMSG + "PMSOPName: " + row["PMSOPName"] + "
");
+ }
+
+ if (!string.IsNullOrEmpty(strSendMailMSG))
+ {
+ strSendMailMSG += "";
+ string argFileName = "N/A";
+ string argEmailSubject = "Fixed Qty Work Order";
+ modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, strSendMailMSG, Conversions.ToString(rowGroupNo["EngineerGroupNo"]), GroupType: (modAutoRunLibrary.GroupType)2);
+ }
+ }
+
+ if (!string.IsNullOrEmpty(strFailMsg))
+ {
+ funPMWOAutoCreate_FixedQtyRet = "fail;" + strFailMsg;
+ }
+ else
+ {
+ funPMWOAutoCreate_FixedQtyRet = "success";
+ }
+ }
+
+ catch (Exception ex)
+ {
+ funPMWOAutoCreate_FixedQtyRet = CombineFailMsg("0000-999999", ex.Message + ",StackTrace:" + ex.StackTrace + "]");
+ }
+ finally
+ {
+ // //釋放資源
+ if (dsTemp != null)
+ {
+ dsTemp.Dispose();
+ dsTemp = null;
+ }
+
+ //if (daTemp != null)
+ //{
+ // daTemp.Dispose();
+ // daTemp = null;
+ //}
+
+ colSQL = null;
+ colSQL_Rows = null;
+
+ // //Close Connection
+ CloseConnection(cnnTemp);
+ }
+
+ return funPMWOAutoCreate_FixedQtyRet;
+
+ }
+
+ private string funPMWOAutoCreate_FixedTimes(Collection colParameters = null)
+ {
+ string funPMWOAutoCreate_FixedTimesRet = default(string);
+
+ var cnnTemp = default(IDbConnection);
+ //var daTemp = default(System.Data.OleDb.OleDbDataAdapter);
+
+ var colSQL = new Collection();
+ var colSQL_Rows = new Collection();
+ var dsTemp = new DataSet();
+ DataRow[] drSel;
+ var dsChamber = new DataSet();
+ string strSQL;
+ string strWONo;
+ DateTime datEventTime;
+
+ int intWOItemNo = 0;
+ bool blnAutoCreateWO, blnLockEquipment, blnAutoEmail;
+ DataRow drAdd;
+ var dtSendMail = BuildMailTable();
+ string strSendMailMSG;
+ string EquipmentNoList = "";
+ string strEQPSerialNo;
+ int intWOType = 3; // 定次定時保養工單
+
+ string strFailMsg = "";
+ string ChamberManage = defString;
+ DbDataReader drTemp;
+ try
+ {
+ datEventTime = DateTime.Now;
+
+ cnnTemp = CreateConnection(strConnectionString);
+
+ // 取出定次(QtyType = 0)已到的設備(SincePMTimes >= Quantity)
+ // 2019/12/5, Ning, 改用 Left Join tblPMSOPBasis
+ strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" +
+ " Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" +
+ " Where A.QtyType = 0 And A.TypeCode = 0 And ((B.SincePMTimes >= A.Quantity And A.ToleranceQty = 0) OR (B.SincePMTimes >= A.ToleranceQty And A.ToleranceQty <> 0))";
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ //daTemp.Fill(dsTemp, "PMEQP");
+ //daTemp.Dispose();
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQP", cnnTemp);
+
+ // 取出定時(QtyType = 1, Hours)已到的設備(上次保養至今 >= Quantity)
+ if (strDataBaseType == "oracle")
+ {
+ strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" +
+ " Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where A.QtyType = 1 And A.TypeCode = 0" +
+ " And ((B.LastPMDate Is Not Null And (To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') - LastPMDate) * 24 >= A.Quantity And A.ToleranceQty = 0) OR" +
+ " (B.LastPMDate Is Not Null And (To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') - LastPMDate) * 24 >= A.ToleranceQty And A.ToleranceQty <> 0))";
+ }
+ else if (Conversions.ToBoolean(Operators.OrObject(strDataBaseType == "mssql", Operators.ConditionalCompareObjectEqual(DataBaseType, "msaccess", false)))) // SQL與Access語法相同
+ {
+ strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " +
+ " From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" + " Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" +
+ " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where A.QtyType = 1 And A.TypeCode = 0" +
+ " And ((B.LastPMDate Is Not Null And DateDiff(hh, LastPMDate, '" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "') >= A.Quantity And A.ToleranceQty = 0) OR" +
+ " (B.LastPMDate Is Not Null And DateDiff(hh, LastPMDate, '" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "') >= A.ToleranceQty And A.ToleranceQty <> 0))";
+ }
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ //daTemp.Fill(dsTemp, "PMEQP");
+ //daTemp.Dispose();
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQP", cnnTemp);
+
+ // 取出定時(QtyType = 2, Minutes)已到的設備(上次保養至今 >= Quantity)
+ if (strDataBaseType == "oracle")
+ {
+ strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" +
+ " Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where A.QtyType = 2 And A.TypeCode = 0" +
+ " And ((B.LastPMDate Is Not Null And (To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') - LastPMDate)*24*60 >= A.Quantity And A.ToleranceQty = 0) OR" +
+ " (B.LastPMDate Is Not Null And (To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') - LastPMDate)*24*60 >= A.ToleranceQty And A.ToleranceQty <> 0))";
+ }
+ else if (Conversions.ToBoolean(Operators.OrObject(strDataBaseType == "mssql", Operators.ConditionalCompareObjectEqual(DataBaseType, "msaccess", false)))) // SQL與Access語法相同
+ {
+ strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" +
+ " Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where A.QtyType = 2 And A.TypeCode = 0" +
+ " And ((B.LastPMDate Is Not Null And DateDiff(mi, LastPMDate, '" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "') >= A.Quantity And A.ToleranceQty = 0) OR" +
+ " (B.LastPMDate Is Not Null And DateDiff(mi, LastPMDate, '" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "') >= A.ToleranceQty And A.ToleranceQty <> 0))";
+ }
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ //daTemp.Fill(dsTemp, "PMEQP");
+ //daTemp.Dispose();
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQP", cnnTemp);
+
+ // 取出設備狀態互斥設定
+ //cmmTemp.CommandText = "Select * From tblEMSViolateStatusChange";
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ //daTemp.Fill(dsTemp, "ViolateStatusChange");
+ //daTemp.Dispose();
+ strSQL = "Select * From tblEMSViolateStatusChange";
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ViolateStatusChange", cnnTemp);
+
+ // 組出應保養的設備List
+ foreach (DataRow drEQP in dsTemp.Tables["PMEQP"].Rows)
+ EquipmentNoList = Conversions.ToString(EquipmentNoList + drEQP["EquipmentNo"] + ",");
+ EquipmentNoList = EquipmentNoList.TrimEnd(',');
+
+ // 取出各設備的EMSEquipmentState
+ //cmmTemp.CommandText = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')";
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ //daTemp.Fill(dsTemp, "EMSEquipmentState");
+ //daTemp.Dispose();
+ strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')";
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "EMSEquipmentState", cnnTemp);
+
+ // 2021/10/14 Mantis:0100751 當啟用系統參數:子設備管理,改變設備狀態時,需一併更新設備底下子設備的狀態
+ strSQL = "Select PARAMETERVALUE from tblSYSParameter where PARAMETERNO = 'ChamberManage'";
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ ChamberManage = drTemp["PARAMETERVALUE"].ToString();
+ }
+ drTemp.Dispose();
+
+
+ // 依每筆設備的定量保養設定來開立保養工單(同一設備類別開一張保養工單)
+ foreach (DataRow drEQPType in dsTemp.Tables["PMEQP"].DefaultView.ToTable(true, new[] { "EquipmentType", "AutoCreateWO", "LockEquipment", "AutoEmail" }).Rows)
+ {
+
+ colSQL.Clear();
+ colSQL_Rows.Clear();
+
+ strWONo = "未開工單";
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["AutoCreateWO"], 1, false)))
+ {
+ blnAutoCreateWO = true;
+ }
+ else
+ {
+ blnAutoCreateWO = false;
+ }
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["LockEquipment"], 1, false))) // 變更機台狀態
+ {
+ blnLockEquipment = true;
+ }
+ else
+ {
+ blnLockEquipment = false;
+ }
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["AutoEmail"], 1, false))) // 是否要發送Mail
+ {
+ blnAutoEmail = true;
+ }
+ else
+ {
+ blnAutoEmail = false;
+ }
+
+ foreach (DataRow drEQP in dsTemp.Tables["PMEQP"].Select(Conversions.ToString("EquipmentType = '" + drEQPType["EquipmentType"] + "'")))
+ {
+
+ if (string.IsNullOrEmpty(drEQP["PMSOPName"].ToString()))
+ {
+ if (!string.IsNullOrEmpty(strFailMsg))
+ {
+ strFailMsg = Conversions.ToString(strFailMsg + Constants.vbCrLf + "[PMSOPBasis does not exist, PMSOPNo:" +
+ drEQP["PMSOPNo"] + "]");
+ }
+ else
+ {
+ strFailMsg = Conversions.ToString("[PMSOPBasis does not exist, PMSOPNo:" + drEQP["PMSOPNo"] + "]");
+ }
+ continue;
+ }
+
+ // 設備狀態變更處理
+ if (blnLockEquipment == true && !string.IsNullOrEmpty(drEQP["EquipmentState"].ToString()))
+ {
+
+ drSel = dsTemp.Tables["EMSEquipmentState"].Select(Conversions.ToString("EquipmentNo = '" + drEQP["EquipmentNo"] + "'"));
+ if (drSel.Length > 0)
+ {
+ // 狀態互斥則續下筆
+ if (dsTemp.Tables["ViolateStatusChange"].Select(Conversions.ToString("EquipmentState = " +
+ drSel[0]["EquipmentState"] + " And ViolativeState = " + drEQP["EquipmentState"])).Length > 0)
+ {
+ continue;
+ }
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drSel[0]["EquipmentState"], drEQP["EquipmentState"], false))) // 狀態不同才需改變設備狀態
+ {
+
+ strEQPSerialNo = InitEQPSerialNo();
+
+ if (strEQPSerialNo == "fail")
+ {
+ funPMWOAutoCreate_FixedTimesRet = "fail;[Get InitEQPSerialNo fail]";
+ return funPMWOAutoCreate_FixedTimesRet;
+ }
+
+ // Del Same EQPSerialNo
+ strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" + drSel[0]["EQPSerialNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(-1);
+
+ // Add EMSEquipmentStateLog
+ strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" +
+ drEQP["EquipmentNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+
+ // 更新EMSEquipmentState, 以EquipmentState做RowCount查核
+ strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " +
+ drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ," +
+ "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" + "Where EquipmentNo = '" + drEQP["EquipmentNo"] +
+ "' And EquipmentState = " + drSel[0]["EquipmentState"]);
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ // 若開啟子設備管理,則須更新設備下子設備的設備狀態
+ if (ChamberManage == "1")
+ {
+ strSQL = "Select EquipmentNo from tblEQPEquipmentBasis Where BELONGEQUIPMENTNO = '" + drEQP["EquipmentNo"].ToString() + "'";
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ //dsChamber = new DataSet();
+ //daTemp.Fill(dsChamber, "ChamberData");
+ //daTemp.Dispose();
+ ExecuteSQLQuery_Adapter(strSQL, dsChamber, "ChamberData", cnnTemp);
+ foreach (DataRow dr in dsChamber.Tables["ChamberData"].Rows)
+ {
+ strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo = '" + dr["EquipmentNo"].ToString() + "'";
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ // 設備狀態不同才變更
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drEQP["EquipmentState"], drTemp["EquipmentState"], false)))
+ {
+ strEQPSerialNo = InitEQPSerialNo();
+
+ if (strEQPSerialNo == "fail")
+ {
+ funPMWOAutoCreate_FixedTimesRet = "fail;[Get InitEQPSerialNo fail]";
+ return funPMWOAutoCreate_FixedTimesRet;
+ }
+
+ // Del Same EQPSerialNo
+ strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" +
+ drTemp["EQPSerialNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(-1);
+
+ // Add EMSEquipmentStateLog
+ strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" +
+ drTemp["EquipmentNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+
+ // 更新EMSEquipmentState
+ strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " +
+ drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") +
+ "','YYYY/MM/DD HH24:MI:SS') ," + "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" +
+ "Where EquipmentNo = '" + drTemp["EquipmentNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ }
+ }
+ drTemp.Dispose();
+ }
+ }
+ }
+ }
+ }
+
+ // 2.保養工單開立處理
+ if (blnAutoCreateWO == true)
+ {
+
+ if (strWONo == "未開工單")
+ {
+ strWONo = InitPMWONo();
+ intWOItemNo = 0;
+ strSQL = "Insert into tblPMWoBasis(WONo,WOType,IssueState,CreateDate,Creator,Description) " + " Values ('" + strWONo + "'," + intWOType + ",2,To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'Auto Run','Auto Run Create')";
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ }
+
+ intWOItemNo += 1;
+
+ // 保養工單開立後直接下線, WOStatus = 2
+ // 2020/4/29, Ning, 保養工單開立後不直接下線, 狀態為1:待料
+ strSQL = "Insert into tblPMWODetail(WONo,WOItemNo,PMSerialNo,EquipmentNo,PMSOPNO,PMESTDATETIME,WOStatus) Values('" +
+ strWONo + "'," + intWOItemNo + "," + intWOItemNo + ",'" + drEQP["EquipmentNo"] + "','" + drEQP["PMSOPNO"] + "'," +
+ " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'),1)";
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+
+ }
+
+ // 3.Mail發送處理
+ if (blnAutoEmail == true)
+ {
+ drAdd = dtSendMail.NewRow();
+ drAdd["WONo"] = strWONo;
+ drAdd["EquipmentNo"] = drEQP["EquipmentNo"] + "";
+ drAdd["EquipmentName"] = drEQP["EquipmentName"] + "";
+ drAdd["PMSOPName"] = drEQP["PMSOPName"] + "";
+ drAdd["EngineerGroupNo"] = drEQP["EngineerGroupNo"] + "";
+ dtSendMail.Rows.Add(drAdd);
+ }
+
+ // 4. 更新設備的PMEqupmentState
+ strSQL = Conversions.ToString("Update tblPMEquipmentState Set SincePMQty = 0, SincePMTimes = 0, LastPMDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " Where EquipmentNo = '" +
+ drEQP["EquipmentNo"] + "'");
+ colSQL.Add(strSQL);
+ colSQL_Rows.Add(1);
+ }
+
+ ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows);
+ }
+
+ dtSendMail = dtSendMail.DefaultView.ToTable(true, new[] { "WONo", "EquipmentNo", "PMSOPName", "EngineerGroupNo" });
+
+ foreach (DataRow rowGroupNo in dtSendMail.DefaultView.ToTable(true, "EngineerGroupNo").Rows)
+ {
+ strSendMailMSG = "Fixed Times Work Order
";
+
+ foreach (DataRow row in dtSendMail.Select(Conversions.ToString("EngineerGroupNo = '" + rowGroupNo["EngineerGroupNo"] + "'")))
+ {
+ strSendMailMSG = Conversions.ToString(strSendMailMSG + "WONo: " + row["WONo"] + "
");
+ strSendMailMSG = Conversions.ToString(strSendMailMSG + "EquipemntNo: " + row["EquipmentNo"] + "
");
+ strSendMailMSG = Conversions.ToString(strSendMailMSG + "PMSOPName: " + row["PMSOPName"] + "
");
+ }
+
+ if (!string.IsNullOrEmpty(strSendMailMSG))
+ {
+ strSendMailMSG += "";
+ string argFileName = "N/A";
+ string argEmailSubject = "Fixed Times Work Order";
+ modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, strSendMailMSG, Conversions.ToString(rowGroupNo["EngineerGroupNo"]), GroupType: (modAutoRunLibrary.GroupType)2);
+ }
+ }
+
+ if (!string.IsNullOrEmpty(strFailMsg))
+ {
+ funPMWOAutoCreate_FixedTimesRet = "fail;" + strFailMsg;
+ }
+ else
+ {
+ funPMWOAutoCreate_FixedTimesRet = "success";
+ }
+ }
+
+ catch (Exception ex)
+ {
+ funPMWOAutoCreate_FixedTimesRet = CombineFailMsg("0000-999999", ex.Message);
+ }
+
+ finally
+ {
+ // //釋放資源
+ if (dsTemp != null)
+ {
+ dsTemp.Dispose();
+ dsTemp = null;
+ }
+
+ //if (daTemp != null)
+ //{
+ // daTemp.Dispose();
+ // daTemp = null;
+ //}
+
+ colSQL = null;
+ colSQL_Rows = null;
+
+ // //Close Connection
+ CloseConnection(cnnTemp);
+ }
+
+ return funPMWOAutoCreate_FixedTimesRet;
+
+ }
+
+ private DataTable BuildMailTable()
+ {
+ DataTable BuildMailTableRet = default(DataTable);
+
+ var dtMail = new DataTable("SendMail");
+
+ dtMail.Columns.Add("WONo", typeof(string));
+ dtMail.Columns.Add("EquipmentNo", typeof(string));
+ dtMail.Columns.Add("EquipmentName", typeof(string));
+ dtMail.Columns.Add("EngineerGroupNo", typeof(string));
+ dtMail.Columns.Add("PMSOPName", typeof(string));
+
+ // SOPBasis
+ dtMail.Columns.Add("FrequencyName", typeof(string));
+
+
+ BuildMailTableRet = dtMail;
+ return BuildMailTableRet;
+
+ }
+
+ private string InitPMWONo()
+ {
+ string InitPMWONoRet = default(string);
+ // 傳入值: 無
+ // 傳回值: InitPMEQPSOPNo(成功),fail(失敗),
+
+ object SerialNo;
+ var cnnTemp = default(IDbConnection);
+ var intSerial = default(int);
+ var strMaxNo = default(string);
+ string strSQL;
+
+
+ try
+ {
+ // //Create connection
+ cnnTemp = CreateConnection(strConnectionString);
+
+ strSQL = "Select Max(WONo) From (select WONo from TBLPMWOBASIS union select WONo from TBLPMWOBASIS_HIS) A Where WONo like 'EW________'";
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ SerialNo = ExecuteSQLQuery_Scalar(strSQL, cnnTemp);
+ if (SerialNo == null)
+ {
+ intSerial = 1;
+ }
+ else if (SerialNo is DBNull)
+ {
+ intSerial = 1;
+ }
+ else
+ {
+ strMaxNo = Conversions.ToString(SerialNo);
+ }
+ //cmmTemp.Dispose();
+
+ if (intSerial != 1)
+ {
+ // 取出序號
+ intSerial = Conversions.ToInteger(Strings.Mid(strMaxNo, 7, 4));
+ if (intSerial == 9999 || Conversions.ToInteger(Strings.Mid(strMaxNo, 5, 2)) != Thread.CurrentThread.CurrentCulture.Calendar.GetMonth(DateTime.Now))
+ {
+ intSerial = 1;
+ }
+ else
+ {
+ intSerial = intSerial + 1;
+ }
+ }
+
+ InitPMWONoRet = "EW" + Strings.Mid(Thread.CurrentThread.CurrentCulture.Calendar.GetYear(DateTime.Now).ToString(), 3, 2) + Strings.Format(Thread.CurrentThread.CurrentCulture.Calendar.GetMonth(DateTime.Now), "00") + Strings.Format(intSerial, "0000");
+ }
+
+ catch (Exception e1)
+ {
+ InitPMWONoRet = "fail";
+ throw;
+ } // New Exception("kcPM.InitPMWONo: " & e1.Message)
+
+ finally
+ {
+ CloseConnection(cnnTemp);
+ }
+
+ return InitPMWONoRet;
+
+ }
+
+ public string InitEQPSerialNo()
+ {
+ string InitEQPSerialNoRet = default(string);
+ // 傳入值: 無
+ // 傳回值: String(成功),fail(失敗)
+ // 2016-07-22, Joe, 調整原取EQPSerialNo的方式,改為日期+ThreadID
+
+ // 2017/10/25 OwenLiu, 調整取EQPSerialNo的方式,改為日期+ThreadID+亂數
+ // 編碼格式: [yyMMddHHmmssfff][ThreadId][nnn]
+ // yyMMddHHmmssfff : 取號當下的日期時間+3碼毫秒
+ // ThreadId : 執行序Id(2碼數字),自動補0
+ // nnn: 1~999 的隨機亂數(3碼數字),自動補0
+
+ string SerialNo;
+ short intUpperBound = 1; // 亂數的最小值
+ short intLowerBound = 999; // 亂數的最大值
+ short intRandomValue = 0;
+ var datEventTime = DateTime.Now;
+
+ InitEQPSerialNoRet = defString;
+
+ try
+ {
+ VBMath.Randomize();
+ intRandomValue = Convert.ToInt16(Math.Floor((intUpperBound - intLowerBound + 1) * VBMath.Rnd()) + intLowerBound);
+
+ // SerialNo = Format(Now, "yyMMddHHmmssfff") & Right(System.Threading.Thread.CurrentThread.ManagedThreadId.ToString, 3).PadLeft(3, "0") & "01"
+ SerialNo = datEventTime.ToString("yyMMddHHmmssfff");
+ SerialNo += Strings.Right(Thread.CurrentThread.ManagedThreadId.ToString(), 2).PadLeft(2, '0');
+ SerialNo += intRandomValue.ToString("000");
+
+ InitEQPSerialNoRet = SerialNo;
+ }
+ catch (Exception e1)
+ {
+ InitEQPSerialNoRet = "fail";
+ throw;
+ }
+
+ finally
+ {
+ }
+
+ return InitEQPSerialNoRet;
+
+ }
+
+ #endregion
+
+ #region ---自動下工排程作業---
+
+ private string funAutoClockOut(Collection colParameters = null)
+ {
+ string funAutoClockOutRet = default(string);
+
+ var CollectionSQL = new Collection();
+ string strSQL = string.Empty;
+ string strReturnMessage = ""; // 執行檔Catch訊息(Job Jog)。Chr(10)分隔每個錯誤訊息。
+ IDbConnection cn = null;
+ int intShiftCount = 0;
+ string[] strShiftName = new string[] { };
+ var strShiftSplit = default(string[]);
+ var strShiftInput = default(string);
+ var dbClockOutTime = default(double);
+ string argstrConnectionString = Conversions.ToString(ConnectionString);
+ try
+ {
+ cn = CreateConnection(argstrConnectionString);
+
+ string strTemp = "";
+ // Parameter01:班別
+ // Parameter02:自動下工時間
+ if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))))
+ {
+ }
+ else
+ {
+ strTemp = Strings.Trim(Conversions.ToString(colParameters["Parameter01"])).ToUpper();
+ strShiftInput = Convert.ToString(strTemp);
+ }
+
+ if (colParameters["Parameter02"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"]))))
+ {
+ }
+ else
+ {
+ strTemp = Strings.Trim(Conversions.ToString(colParameters["Parameter02"])).ToUpper();
+ if (modAutoRunLibrary.funChkNumericIsValid(pSourceText: strTemp, AllowMinus: false, AllowZeroValue: false, AllowFloat: true, AllowContainsDot: true))
+ {
+ if (Convert.ToDouble(strTemp) >= 0d)
+ {
+ dbClockOutTime = Convert.ToDouble(strTemp);
+ }
+ else
+ {
+ dbClockOutTime = 0.5d;
+ }
+ }
+ else
+ {
+ throw new Exception("Parameter02(ClockOutTime) is not valid Nnumeric data!");
+ }
+ }
+ // ------------------------------------------------
+ if (strShiftInput != "*")
+ {
+ strShiftSplit = strShiftInput.Split(',');
+ }
+
+ strSQL = "Select DISTINCT A.ShiftNo From tblUSRShiftBasis A " + " Where(to_char(sysdate,'HH24:MI:SS') < to_char(fromtime,'HH24:MI:SS') Or to_char(sysdate,'HH24:MI:SS') > to_char(totime+" + dbClockOutTime.ToString() + "/24,'HH24:MI:SS') and to_char(totime,'HH24:MI:SS')> to_char(fromtime,'HH24:MI:SS') ) " + " Or (to_char(sysdate,'HH24:MI:SS') < to_char(fromtime,'HH24:MI:SS') And to_char(sysdate,'HH24:MI:SS') > to_char(totime+" + dbClockOutTime.ToString() + "/24,'HH24:MI:SS') and to_char(totime,'HH24:MI:SS')< to_char(fromtime,'HH24:MI:SS') ) ";
+
+
+ string argDataBaseType = Conversions.ToString(DataBaseType);
+ //cmd.CommandText = SQLCommandTuning(argDataBaseType, ref strSQL);
+
+ using (var dr = ExecuteSQLQuery_Reader(SQLCommandTuning(argDataBaseType, ref strSQL), cn))
+ {
+ if (strShiftInput != "*")
+ {
+ while (dr.Read())
+ {
+ foreach (var objShiftNo in strShiftSplit)
+ {
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(objShiftNo, dr["ShiftNo"].ToString(), false)))
+ {
+ Array.Resize(ref strShiftName, intShiftCount + 1);
+ strShiftName[intShiftCount] = dr["ShiftNo"].ToString();
+ intShiftCount += 1;
+ }
+ }
+ }
+ }
+ else
+ {
+ while (dr.Read())
+ {
+ Array.Resize(ref strShiftName, intShiftCount + 1);
+ strShiftName[intShiftCount] = dr["ShiftNo"].ToString();
+ intShiftCount += 1;
+ }
+ }
+ }
+
+ strSQL = " Select 1 As CheckFlag, A.* From tblWIPOperatorState A Where 1 = 1 ";
+ if (strShiftName.Length - 1 >= 0)
+ {
+ strSQL += " And A.ShiftNo = '" + strShiftName[0] + "' ";
+ intShiftCount += 1;
+ }
+
+ if (strShiftName.Length - 1 > 0)
+ {
+ var loopTo = strShiftName.Length - 1;
+ for (intShiftCount = 1; intShiftCount <= loopTo; intShiftCount++)
+ strSQL += " Or A.ShiftNo = '" + strShiftName[intShiftCount] + "' ";
+ }
+
+
+ string argDataBaseType1 = Conversions.ToString(DataBaseType);
+ //cmd.CommandText = SQLCommandTuning(argDataBaseType1, ref strSQL);
+ using (var dr = ExecuteSQLQuery_Reader(SQLCommandTuning(argDataBaseType1, ref strSQL), cn))
+ {
+ string argSendTime = Conversions.ToString(DateTime.Now);
+ strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime);
+ while (dr.Read())
+ {
+
+ string argvalue_name = "userno";
+ string argname = "UserNo";
+ string argtype = "String";
+ string argvalue = CInput(dr["UserNo"].ToString());
+ string argdesc = "";
+ strParameter = CombineXMLParameter(argvalue_name, argname, argtype, argvalue, argdesc);
+ // 2018/01/04 OwenLiu, 登出時間改用介面上的時間(員工登入時的AP Server時間)
+ string argvalue_name1 = "logoutdate";
+ string argname1 = "LogoutDate";
+ string argtype1 = "Date";
+ string argvalue1 = Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss");
+ string argdesc1 = "";
+ strParameter += CombineXMLParameter(argvalue_name1, argname1, argtype1, argvalue1, argdesc1);
+ // strParameter += CombineXMLParameter("logoutdate", "LogoutDate", "Date", Format(Now, "yyyy/MM/dd HH:mm:ss"), "")
+ string argvalue_name2 = "loginplaceno";
+ string argname2 = "LoginPlaceNo";
+ string argtype2 = "String";
+ string argvalue2 = CInput(dr["LoginPlaceNo"].ToString());
+ string argdesc2 = "";
+ strParameter += CombineXMLParameter(argvalue_name2, argname2, argtype2, argvalue2, argdesc2);
+ string argvalue_name3 = "multioperatormode";
+ string argname3 = "MultiOperatorMode";
+ string argtype3 = "Integer";
+ var tmp = dr;
+ string argvalue3 = Conversions.ToString(tmp["MultiOperatorMode"]);
+ string argdesc3 = "";
+ strParameter += CombineXMLParameter(argvalue_name3, argname3, argtype3, argvalue3, argdesc3);
+
+ InXml = CombineXMLRequest(strIdentity, strParameter);
+
+ OutXml = modAutoRunLibrary.InvokeSrv("wsWIP_OperatorState.ExecuteClockOut", InXml);
+
+ XmlDoc.LoadXml(OutXml);
+ }
+ }
+
+ ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL);
+ }
+
+ catch (Exception ex)
+ {
+ // 錯誤訊息: 截取錯誤訊息+換行符號
+ if (!string.IsNullOrEmpty(strReturnMessage))
+ {
+ strReturnMessage += ControlChars.Cr + ex.Message;
+ }
+ else
+ {
+ strReturnMessage += ex.Message;
+ }
+ }
+ finally
+ {
+ CloseConnection(cn);
+ }
+
+ if (string.IsNullOrEmpty(strReturnMessage))
+ {
+ // //回傳Success
+ funAutoClockOutRet = "success";
+ }
+ else
+ {
+ // Message長度4000限制
+ if (strReturnMessage.Length > 3996)
+ strReturnMessage = strReturnMessage.Substring(0, 3996) + "...";
+
+ funAutoClockOutRet = CombineFailMsg("0000-999999", strReturnMessage);
+ }
+
+ return funAutoClockOutRet;
+ }
+
+ #endregion
+
+ #region GuardServer
+
+ private string funGuardServerSync(Collection colParameters = null)
+ {
+ string funGuardServerSyncRet = default(string);
+ string strReturnMessage = ""; // 執行檔Catch訊息(Job Jog)。Chr(10)分隔每個錯誤訊息。
+ string path;
+
+ try
+ {
+ path = modAutoRunLibrary.InvokeSrv_GuardServer();
+
+ var gsInfo = GuardServerProvider.Methods.GuardServerSchedule.ExecuteImplement(path);
+
+ if (gsInfo.Status != GuardServerProvider.Class.LicenseCode.OK && gsInfo.Status != GuardServerProvider.Class.LicenseCode.NotUseGuardServer)
+ {
+ strReturnMessage += gsInfo.Message;
+ }
+ }
+ catch (Exception ex)
+ {
+ if (!string.IsNullOrEmpty(strReturnMessage))
+ {
+ strReturnMessage += ControlChars.Cr + ex.Message;
+ }
+ else
+ {
+ strReturnMessage += ex.Message;
+ }
+ }
+
+
+ if (string.IsNullOrEmpty(strReturnMessage))
+ {
+ // //回傳Success
+ funGuardServerSyncRet = "success";
+ }
+ else
+ {
+ // Message長度4000限制
+ if (strReturnMessage.Length > 3996)
+ strReturnMessage = strReturnMessage.Substring(0, 3996) + "...";
+
+ funGuardServerSyncRet = CombineFailMsg("0000-999999", strReturnMessage);
+ }
+
+ return funGuardServerSyncRet;
+
+ }
+
+ #endregion
+
+
+ #region SDD201222_01 設備點檢支援可設定頻率
+
+ // 預開設備點檢單
+ // 1. 取出設備主檔(EP104)中已核准,且有設定點檢表的設備,依設備編號由小到大排序後,查核該設備當天是否需要預開點檢單。
+ // 2. 設備在執行查核是否要預開單前,需先將該設備在tblWIPEQPQCTask(生產設備檢驗任務表)中,狀態為1:已驗及2:待補檢的設備點檢單(Status in (1,2) and QCTaskClass=1)做刪除,(排除BelongDate=CurrentDate的)
+ // 但待補檢的設備點檢單,需在設備線上點檢歷程(tblWIPEQPQCListLog),新增一筆該設備點檢單的記錄,檢驗結果填 -1(tblWIPEQPQCListLog.QCResult = -1)。
+ // 3. 當該設備所設定的點檢頻率是,「每班檢」或「每日檢」時,才需要做預開單
+ // 4. 若該設備當天的點檢單,都已預先開立完成(tblWIPEQPQCTask內已有當天該設備點檢頻率的點檢單),則當天就不需再開立,也就是每種點檢頻率,一天只需預開一張點檢單。
+ // 5. 點檢頻率是「每班檢」時,依該設備所屬區域對應的部門,查出該部門的所有的班別,每一個班別就預開一張設備點檢單。
+ // 6. 點檢頻率是「每日檢」時,依所設定每日檢的起始時間,預開一張設備點檢單。
+ // 7. 預先開立的設備點檢單,檢驗任務編號,請比照取得 EQPSerialNo的方式(以 GUID 的方式)取得,
+ // 檢驗任務分類是設備點檢,狀態是未驗(Status=0),並需壓上預計執行時間,寫入tabletblWIPEQPQCTask(生產設備檢驗任務表)。
+ // 8. 預開點檢單的預計執行時間,就是該點檢單的點檢頻率時間+當天的日期,
+ // 每班檢的點檢單預計執行時間,就以該點檢單是哪個班別(早班或午班或晚班)的點檢單,以那個班別的起始時間為預計執行時間,
+ // 而每日檢的點檢單預計執行時間,則是以該點檢單是,每日的哪個起始時間的點檢單,以該頻率的起始時間為預計執行時間
+ // 9. 預開點檢單的歸屬日,填入開單當天的日期。
+ // 10.不需將所有設備的預開單處理,都包在同一個交易一起寫入資料庫內,一台設備做完,就寫入資料庫內。
+ // 11. 建議此 Job 基本是每天只執行一次,最好是在當天的 00:00 時開始執行,才符合預開設備點檢單的作用。
+ private string funPreCreateEQPQCList(Collection colParameters = null)
+ {
+ string funPreCreateEQPQCListRet = default(string);
+
+ var cnnTemp = default(IDbConnection);
+ DbDataReader drTemp;
+ string strSQL;
+ //System.Data.OleDb.OleDbDataAdapter daTemp;
+
+ string strSQLAddField;
+ string strSQLAddValue;
+ var CollectionSQL = new Collection();
+ var aryDeleteList = new ArrayList();
+
+ DataTable dtEQPQCListSetup = new DataTable(), dtQCTack = new DataTable(), dtShift = new DataTable();
+
+ var datCurrentDate = DateTime.Now;
+ DataRow[] drSel;
+ DataRow drAdd;
+
+ string strQCTaskNo = "";
+ string strPlanQCTime = "";
+
+ try
+ {
+
+ cnnTemp = CreateConnection(strConnectionString);
+
+ // 1. 取得各設備的設備點檢卡控設定資料
+ strSQL = "SELECT A.*,B.QCListNo FROM tblEQPQCListSetup A " + " JOIN tblEQPEquipmentBasis B ON A.EquipmentNo = B.EquipmentNo " + " WHERE B.IssueState = 2 Order By A.EquipmentNo ";
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ //daTemp.Fill(dtEQPQCListSetup);
+ //daTemp.Dispose();
+ //cmmTemp.Dispose();
+ ExecuteSQLQuery_Adapter(strSQL, dtEQPQCListSetup, cnnTemp);
+
+ // 2.刪除歸屬日不是今天的資料,並備份其中待補檢的資料到Log表中
+ foreach (DataRow rL in dtEQPQCListSetup.Rows)
+ {
+
+ // 2.1 每次執行前都清空集合
+ CollectionSQL.Clear();
+
+ // 2.2 取得各設備的設備點檢卡控設定資料
+ strSQL = Conversions.ToString("SELECT * FROM tblWIPEQPQCTask " + " Where Status In (0,1,2) And InspType In (1,2) And QCTaskClass = 1 And EquipmentNo = '" +
+ rL["EquipmentNo"] + "' ");
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ if (!(dtQCTack == null))
+ dtQCTack.Clear();
+ //daTemp.Fill(dtQCTack);
+ //daTemp.Dispose();
+ //cmmTemp.Dispose();
+ ExecuteSQLQuery_Adapter(strSQL, dtQCTack, cnnTemp);
+
+ foreach (DataRow rQT in dtQCTack.Rows)
+ {
+
+ // 2.3 找出歸屬日不是當日的現況資料
+ if ((Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rQT["Status"], 1, false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rQT["Status"], 2, false))) && (Strings.Format(Conversions.ToDate(rQT["BelongDate"]), "yyyy/MM/dd") ?? "") != (Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") ?? ""))
+ {
+
+ // 2.3.1 將現況表上已驗與待補驗,並且BelongDate(歸屬日)不是當日的資料刪除
+ if (!aryDeleteList.Contains(rL["EquipmentNo"])) // 避免多次執行同樣的SCRIPT
+ {
+ strSQL = Conversions.ToString(" Delete From tblWIPEQPQCTask Where BelongDate <> To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "','yyyy/MM/dd') " + " And Status In (1,2) And InspType In (1,2) And QCTaskClass = 1 And EquipmentNo = '" +
+ rL["EquipmentNo"] + "' ");
+ CollectionSQL.Add(strSQL);
+
+ aryDeleteList.Add(rL["EquipmentNo"]);
+ }
+
+ // 2.3.2 將待補檢的檢驗單備份到Log表內,QCResult = -1,QCTaskStatus=2
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rQT["Status"], 2, false)))
+ {
+
+ strSQLAddField = " Insert Into tblWIPEQPQCListLog (QCTaskNo,QCListSerial,EquipmentNo,QCListNo,QCResult,QCTaskStatus ";
+ strSQLAddValue = Conversions.ToString(" Values ('" +
+ rQT["QCTaskNo"] + "','" + rQT["QCTaskNo"] + "','" + rL["EquipmentNo"] + "','" + rQT["QCNo"] + "',-1,2 ");
+
+ if (!string.IsNullOrEmpty(rQT["InspType"].ToString()))
+ {
+ strSQLAddField = strSQLAddField + ",InspType";
+ strSQLAddValue = Conversions.ToString(strSQLAddValue + "," + rQT["InspType"] + " ");
+ }
+
+ if (!string.IsNullOrEmpty(rQT["ShiftNo"].ToString()))
+ {
+ strSQLAddField = strSQLAddField + ",ShiftNo";
+ strSQLAddValue = Conversions.ToString(strSQLAddValue + ",'" + rQT["ShiftNo"] + "' ");
+ }
+
+ if (!string.IsNullOrEmpty(rQT["LotNo"].ToString()))
+ {
+ strSQLAddField = strSQLAddField + ",LotNo";
+ strSQLAddValue = Conversions.ToString(strSQLAddValue + ",'" + rQT["LotNo"] + "' ");
+ }
+
+ if (!string.IsNullOrEmpty(rQT["InspStartTime"].ToString()))
+ {
+ strSQLAddField = strSQLAddField + ",InspStartTime ";
+ strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(rQT["InspStartTime"]), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')";
+ }
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(rQT["BelongDate"], defDateTime, false)))
+ {
+ strSQLAddField = strSQLAddField + ",BelongDate ";
+ strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(rQT["BelongDate"]), "yyyy/MM/dd") + "','YYYY/MM/DD')";
+ }
+
+ if (!string.IsNullOrEmpty(rQT["PlanQCTime"].ToString()))
+ {
+ strSQLAddField = strSQLAddField + ",PlanQCTime ";
+ strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(rQT["PlanQCTime"]), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')";
+ }
+
+ strSQLAddField = strSQLAddField + ",Creator ";
+ strSQLAddValue = strSQLAddValue + ",'AutoRun' ";
+
+ strSQLAddField = strSQLAddField + ",CreateDate ";
+ strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')";
+
+ strSQL = strSQLAddField + ")" + strSQLAddValue + ")";
+
+ CollectionSQL.Add(strSQL);
+ }
+
+ }
+
+ }
+
+
+ // 3. 「每班檢」或「每日檢」時,才需要做預開單(並且當天尚未存在檢驗單)
+ string InspTypeTmp = rL["InspType"].ToString();
+ switch (InspTypeTmp)
+ {
+
+ // 3.1 每班檢
+ case "1":
+ {
+
+ // 3.1.1 找出該設備的班別
+ // 97012: 湖北台基设备做每班检找班别时,设备群组内的设备无法进行班别查找,请调整为可以支持设备群组内的设备做每班点检时可寻找到班别
+ // Edison 2021/07/29調整找班別的語法,加入設備群組的班別
+ strSQL = " Select * From tblUSRSHIFTBASIS Where IssueState = 2 And DEPARTMENTNO = ( " +
+ " Select DepartmentNo From tblSMDAreaBasis " +
+ " Where IssueState = 2 And AREANO = (Select ContainAreaNo From tblSMDAreaRelation Where ObjectNo = '" +
+ rL["EquipmentNo"] + "')) " + " UNION " +
+ " Select * From tblUSRSHIFTBASIS Where IssueState = 2 And DEPARTMENTNO = ( " +
+ " Select DepartmentNo From tblSMDAreaBasis " +
+ " Where IssueState = 2 And AREANO = (Select ContainAreaNo From tblSMDAreaRelation Where ObjectNo = " +
+ " (SELECT EQUIPMENTGROUP FROM TBLEQPGROUPDETAIL WHERE EQUIPMENTNO='" + rL["EquipmentNo"] + "' ) )) ";
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ if (!(dtShift == null))
+ dtShift.Clear();
+ //daTemp.Fill(dtShift);
+ //daTemp.Dispose();
+ //cmmTemp.Dispose();
+ ExecuteSQLQuery_Adapter(strSQL, dtShift, cnnTemp);
+
+ foreach (DataRow rS in dtShift.Rows)
+ {
+
+ // 3.1.2 若現狀況表中該設備當天不存在此班別檢驗單,則新增一筆
+ drSel = dtQCTack.Select(Conversions.ToString(" InspType = " +
+ rL["InspType"] + " And BelongDate = #" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "# And ShiftNo = '" +
+ rS["ShiftNo"] + "' And Status = 0 "));
+ if (drSel.Length == 0)
+ {
+ strQCTaskNo = InitEQPSerialNoByGuid();
+ strSQLAddField = " Insert Into tblWIPEQPQCTask (QCTASKNO, EQUIPMENTNO, QCTASKCLASS, INSPTYPE, QCNO ";
+ strSQLAddValue = Conversions.ToString(" Values ('" + strQCTaskNo + "','" +
+ rL["EquipmentNo"] + "',1,1,'" + rL["QCListNo"] + "' ");
+
+ strSQLAddField = strSQLAddField + ",ShiftNo";
+ strSQLAddValue = Conversions.ToString(strSQLAddValue + ",'" + rS["ShiftNo"] + "' ");
+
+ strSQLAddField = strSQLAddField + ",BelongDate ";
+ strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "','YYYY/MM/DD')";
+
+ strSQLAddField = strSQLAddField + ",CreateDate ";
+ strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')";
+
+ strPlanQCTime = Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + " " + Strings.Format(Conversions.ToDate(rS["FromTime"]), "H:mm:ss");
+ strSQLAddField = strSQLAddField + ",PlanQCTime ";
+ strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(strPlanQCTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')";
+
+ strSQL = strSQLAddField + ")" + strSQLAddValue + ")";
+
+ CollectionSQL.Add(strSQL);
+
+ }
+
+ }
+
+ break;
+ }
+
+
+ // 3.2 每日檢
+ case "2":
+ {
+ // 3.2.2 若現狀況表中該設備當天不存在每日檢檢驗單,則新增一筆
+ drSel = dtQCTack.Select(Conversions.ToString(" InspType = " +
+ rL["InspType"] + " And BelongDate = #" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "# And Status = 0"));
+ if (drSel.Length == 0)
+ {
+ strQCTaskNo = InitEQPSerialNoByGuid();
+ strSQLAddField = " Insert Into tblWIPEQPQCTask (QCTASKNO, EQUIPMENTNO, QCTASKCLASS, INSPTYPE, QCNO ";
+ strSQLAddValue = Conversions.ToString(" Values ('" + strQCTaskNo + "','" +
+ rL["EquipmentNo"] + "',1,2,'" + rL["QCListNo"] + "' ");
+
+ strSQLAddField = strSQLAddField + ",InspStartTime";
+ strSQLAddValue = Conversions.ToString(strSQLAddValue + ",'" + rL["InspStartTime"] + "' ");
+
+ strSQLAddField = strSQLAddField + ",BelongDate ";
+ strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "','YYYY/MM/DD')";
+
+ strSQLAddField = strSQLAddField + ",CreateDate ";
+ strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')";
+
+ strPlanQCTime = Conversions.ToString(Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + " " +
+ rL["InspStartTime"]);
+ strSQLAddField = strSQLAddField + ",PlanQCTime ";
+ strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(strPlanQCTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')";
+
+ strSQL = strSQLAddField + ")" + strSQLAddValue + ")";
+
+ CollectionSQL.Add(strSQL);
+
+ }
+
+ break;
+ }
+
+ }
+
+ if (CollectionSQL.Count > 0)
+ {
+ ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL);
+ }
+
+ }
+
+ funPreCreateEQPQCListRet = "success";
+ }
+
+ catch (Exception ex)
+ {
+ funPreCreateEQPQCListRet = CombineFailMsg("0000-999999", ex.Message);
+
+ colParameters.Add(funPreCreateEQPQCListRet, "EmailBody");
+ SendJobFailEmail(colParameters);
+ }
+
+ finally
+ {
+ if (!(dtEQPQCListSetup == null))
+ dtEQPQCListSetup.Dispose();
+ if (!(dtQCTack == null))
+ dtQCTack.Dispose();
+ if (!(dtShift == null))
+ dtShift.Dispose();
+ CloseConnection(cnnTemp);
+ }
+
+ return funPreCreateEQPQCListRet;
+
+ }
+
+ // 待補檢設備點檢單通知
+ // 1. 參數一,是設定補檢有效時間,單位為小時,可以設定小數;當目前時間-檢驗任務的預計執行時間< 補檢有效時間時,就視為需做通知,所以是在准許時間內的待補檢單才需通知。
+ // 2. 取出生產設備檢驗任務表(tblWIPEQPQCTask)中,檢驗任務狀態為待補檢的設備點檢單(Status=2 and QCTaskClass=1),
+ // 並檢查每筆待補檢的檢驗任務,是否還在有效的補檢時間內,若是,則此筆的待補檢的檢驗任務需做 mail 通知該設備的工程管理群組人員
+ // 3. 有效的待補檢檢驗任務的判別方式,是以目前時間減檢驗任務的預計執行時間後,相減後的時間小於參數一所設定的有效時間(小時)
+ // (目前時間-檢驗任務的預計執行時間(分鐘) < 補檢有效時間(分鐘) = 有效的待補檢點檢單),時間的計算都以分鐘來做計算及判定
+ // 4. 若有有效的時間內的補檢設備點檢單,則依該點檢單的設備編號,找出所屬的工程管理群組,並mail給該管理群組內的人員。
+ // 5. Mail 的發送以工程管理群組為主,把工程管理群組所要列管的設備下,所有的有效補檢的點檢單,彙整成一封mail 寄出。
+ private string funAlertAfterEventEQPQCList(Collection colParameters = null)
+ {
+ string funAlertAfterEventEQPQCListRet = default(string);
+
+ var cnnTemp = default(IDbConnection);
+ //System.Data.OleDb.OleDbDataAdapter daTemp;
+ string strSQL;
+ var CollectionSQL = new Collection();
+
+ DataTable dtQCTack = new DataTable(), dtMail = new DataTable();
+
+ var datCurrentDate = DateTime.Now;
+ DataRow[] drSel, drSelM;
+
+ double dblEffectiveTime = 0d;
+ double dblMinDiff = 0d;
+
+ string strMailBody = "";
+
+ System.Windows.Forms.SystemInformation WinFormInfo;
+ modWIN.gComputerName = System.Windows.Forms.SystemInformation.ComputerName;
+
+ do
+ {
+ try
+ {
+ // ParameterXX參數說明
+ // 01 補檢有效時間
+ // Parameter01為傳入參數, 作為補檢有效時間, 若無此值則不進行下面的程式
+ if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))))
+ {
+ funAlertAfterEventEQPQCListRet = CombineFailMsg("0000-200002", "After Event Effective Time not found!!!(Parameter 01)");
+ break;
+ }
+ else if (Information.IsNumeric(colParameters["Parameter01"]))
+ {
+ dblEffectiveTime = Conversions.ToDouble(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])));
+ }
+ else
+ {
+ funAlertAfterEventEQPQCListRet = CombineFailMsg("0000-200011", "After Event Effective Time not Numeric!!!(Parameter 01)");
+ break;
+ }
+
+ cnnTemp = CreateConnection(strConnectionString);
+
+ // 1. 取得各設備的設備點檢卡控設定資料
+ strSQL = " SELECT A.*,B.EngineerGroupNo,B.EquipmentName,C.ShiftName FROM tblWIPEQPQCTask A " + " Join tblEQPEquipmentBasis B ON A.EquipmentNo = B.EquipmentNo " + " Left Join tblUSRShiftBasis C ON A.SHIFTNO = C.SHIFTNO " + " Where a.Status =2 And QCTaskClass=1 Order By InspType,PlanQCTime";
+ //cmmTemp = new IDbCommand(strSQL, cnnTemp);
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp);
+ //daTemp.Fill(dtQCTack);
+ //daTemp.Dispose();
+ //cmmTemp.Dispose();
+ ExecuteSQLQuery_Adapter(strSQL, dtQCTack, cnnTemp);
+
+ // 2. 查核每筆待補檢資料是否符合發送mail標準 (當目前時間-檢驗任務的預計執行時間< 補檢有效時間)
+ // 新增是否繼送Mail的查核欄位
+ dtQCTack.Columns.Add("SendMail", Type.GetType("System.String"));
+ foreach (DataRow rQT in dtQCTack.Rows)
+ {
+ dblMinDiff = DateAndTime.DateDiff("n", Conversions.ToDate(rQT["PlanQCTime"]), Conversions.ToDate(datCurrentDate));
+ if (dblMinDiff < dblEffectiveTime * 60d)
+ {
+ rQT["SendMail"] = "Y";
+ }
+ else
+ {
+ rQT["SendMail"] = "N";
+ }
+ }
+
+ // 3.依據設備工成群組組成發送Mail內容Table
+ dtMail.Columns.Add("EngineerGroupNo", Type.GetType("System.String"));
+ dtMail.Columns.Add("MailBody", Type.GetType("System.String"));
+ dtMail.Columns.Add("EquipmentNo", Type.GetType("System.String"));
+
+ string FileName = defString;
+ foreach (DataRow rM in dtQCTack.DefaultView.ToTable(true, "EngineerGroupNo").Rows)
+ {
+
+ drSel = dtQCTack.Select(Conversions.ToString("EngineerGroupNo = '" + rM["EngineerGroupNo"] + "' And SendMail ='Y' "));
+ if (drSel.Length > 0)
+ {
+
+ foreach (DataRow rMB in drSel)
+ {
+ string InspTypeTmp = rMB["InspType"].ToString();
+ switch (InspTypeTmp)
+ {
+ case "0":
+ {
+ strMailBody = Conversions.ToString(Constants.vbCrLf + "       - " + TranslateMsg("[%LOTINSPECTION%]", strLanguageMode, strResourceDir) + " : " +
+ rMB["LotNo"] + " / " + TranslateMsg("[%QCLISTNO%]", strLanguageMode, strResourceDir) + " : " + rMB["QCNo"]);
+ break;
+ }
+ case "1":
+ {
+ strMailBody = Conversions.ToString(Constants.vbCrLf + "       - " + TranslateMsg("[%SHIFTINSPECTION%]", strLanguageMode, strResourceDir) + " : " +
+ rMB["ShiftName"] + " / " + TranslateMsg("[%QCLISTNO%]", strLanguageMode, strResourceDir) + " : " + rMB["QCNo"]);
+ break;
+ }
+ case "2":
+ {
+ strMailBody = Conversions.ToString(Constants.vbCrLf + "       - " + TranslateMsg("[%DAILYINSPECTION%]", strLanguageMode, strResourceDir) + "   " +
+ rMB["InspStartTime"] + " / " + TranslateMsg("[%QCLISTNO%]", strLanguageMode, strResourceDir) + " : " + rMB["QCNo"]);
+ break;
+ }
+ }
+ drSelM = dtMail.Select(Conversions.ToString(" EquipmentNo = '" + rMB["EquipmentNo"] + "' "));
+ if (drSelM.Length == 0)
+ {
+ var drAdd = dtMail.NewRow();
+ drAdd["EngineerGroupNo"] = rMB["EngineerGroupNo"];
+ drAdd["EquipmentNo"] = rMB["EquipmentNo"];
+ drAdd["MailBody"] = Constants.vbCrLf + "    " + rMB["EquipmentNo"] + " / " + rMB["EquipmentName"] + strMailBody;
+ dtMail.Rows.Add(drAdd);
+ }
+ else
+ {
+ drSelM[0]["MailBody"] = drSelM[0]["MailBody"] + strMailBody;
+ }
+ }
+ }
+
+ // 4. 發送Mail
+ drSelM = dtMail.Select(Conversions.ToString(" EngineerGroupNo = '" + rM["EngineerGroupNo"] + "' "));
+ if (drSelM.Length > 0)
+ {
+ strMailBody = " Dear Receiver, " + Constants.vbCrLf + Constants.vbCrLf + "    " + TranslateMsg("[%EquipmenListedBelowstillhadAlterEventPleaseCheckit%]", strLanguageMode, strResourceDir);
+ foreach (DataRow rSM in drSelM)
+ strMailBody = Conversions.ToString(strMailBody + Constants.vbCrLf + rSM["MailBody"]);
+
+ string argEmailSubject = TranslateMsg("[%EuipmentInspectionAlterEventMailSubject%]", strLanguageMode, strResourceDir);
+ string argEmailBody = CInput(strMailBody);
+ modAutoRunLibrary.SendMultiEmail(ref FileName, ref argEmailSubject, argEmailBody, Conversions.ToString(rM["EngineerGroupNo"]), GroupType: (modAutoRunLibrary.GroupType)Conversions.ToInteger("2"));
+ }
+
+ }
+
+
+ funAlertAfterEventEQPQCListRet = "success";
+ }
+
+ catch (Exception ex)
+ {
+ funAlertAfterEventEQPQCListRet = CombineFailMsg("0000-999999", ex.Message);
+
+ colParameters.Add(funAlertAfterEventEQPQCListRet, "EmailBody");
+ SendJobFailEmail(colParameters);
+ }
+
+ finally
+ {
+ if (!(dtQCTack == null))
+ dtQCTack.Dispose();
+ CloseConnection(cnnTemp);
+ }
+ }
+ while (false);
+ return funAlertAfterEventEQPQCListRet;
+
+ }
+
+ public string InitEQPSerialNoByGuid()
+ {
+ string InitEQPSerialNoByGuidRet = default(string);
+ // 傳入值: 無
+ // 傳回值: String(成功),fail(失敗)
+ // 2016-07-22, Joe, 調整原取EQPSerialNo的方式,改為日期+ThreadID
+
+ // 2017/10/25 OwenLiu, 調整取EQPSerialNo的方式,改為日期+ThreadID+亂數
+ // 編碼格式: [yyMMddHHmmssfff][ThreadId][nnn]
+ // yyMMddHHmmssfff : 取號當下的日期時間+3碼毫秒
+ // ThreadId : 執行序Id(2碼數字),自動補0
+ // nnn: 1~999 的隨機亂數(3碼數字),自動補0
+
+ // 2020/02/24 OwenLiu, Mantis:0067661, 調整EQPSerial 的編碼規則
+ // 每次產生新的GUID再用Base64編碼成字串,在隨機在編碼後的字串固定範圍(2~10字元位置)內加入3碼亂數(自動補0)
+ string SerialNo;
+ short intUpperBound = 999; // 亂數的最大值
+ short intLowerBound = 1; // 亂數的最小值
+ short intStartBound = 2; // 亂數的最小值
+ short intEndBound = 10; // 亂數的最大值
+ short intRandomValue = 0;
+ short intRandomPosition = 0;
+ var datEventTime = DateTime.Now;
+
+ InitEQPSerialNoByGuidRet = defString;
+
+ try
+ {
+ VBMath.Randomize();
+ intRandomValue = Convert.ToInt16(Math.Floor((intUpperBound - intLowerBound + 1) * VBMath.Rnd()) + intLowerBound);
+ intRandomPosition = Convert.ToInt16(Math.Floor((intStartBound - intEndBound + 1) * VBMath.Rnd()) + intEndBound);
+ string strEQPGuid = Convert.ToBase64String(Guid.NewGuid().ToByteArray());
+
+ SerialNo = strEQPGuid.Substring(0, intRandomPosition) + intRandomValue.ToString("000") + strEQPGuid.Substring(intRandomPosition);
+
+ InitEQPSerialNoByGuidRet = SerialNo;
+ }
+ catch (Exception e1)
+ {
+ InitEQPSerialNoByGuidRet = "fail";
+ throw;
+ }
+
+ finally
+ {
+ }
+
+ return InitEQPSerialNoByGuidRet;
+
+ }
+
+ #endregion
+
+ #region OGSM 駕駛艙
+ private string CombineFailMsg(string ErrorCode, string Description)
+ {
+ string CombineFailMsgRet = default(string);
+ CombineFailMsgRet = "fail;" + ErrorCode + ";" + Description;
+ return CombineFailMsgRet;
+ }
+
+ ///
+ /// 解析ErrorLog的Description之ErrorCode,回填ErrorCode與ErrorType(舊資料)
+ ///
+ ///
+ /// 已執行到的時間記錄於Parameter10
+ ///
+ ///
+ /// 每次取3天份的資料,每次取還未執行的舊資料(3/8~3/10 => 3/5~3/7 => 3/2~3/4)
+ /// 今天為2022/3/29,若Parameter10欄位沒有值, 則取得2022/3/27~2022/3/29 結束後將2022/3/26回填Parameter10
+ /// 今天為2022/3/29,若Parameter10欄位有值(2022/3/27), 則取得2022/3/25~2022/3/27 結束後將2022/3/24回填Parameter10
+ ///
+ private string funParseErrorLogErrorCodePast(Collection colParameters = null)
+ {
+ string funParseErrorLogErrorCodePastRet = default(string);
+
+ string strReturnMessage = ""; // 執行檔Catch訊息(Job Jog)。Chr(10)分隔每個錯誤訊息。
+
+ try
+ {
+ if (colParameters["JobNo"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["JobNo"]))))
+ {
+ funParseErrorLogErrorCodePastRet = CombineFailMsg("0000-999999", "There is no JobNo!");
+ return funParseErrorLogErrorCodePastRet;
+ }
+
+ DateTime startDate, endDate;
+ // 已執行到的時間記錄於Parameter10
+ if (colParameters["Parameter10"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter10"]))))
+ {
+ endDate = DateTime.Now;
+ startDate = endDate.AddDays(-2);
+ }
+ else
+ {
+ endDate = DateTime.Parse(Conversions.ToString(colParameters["Parameter10"]));
+ startDate = endDate.AddDays(-2);
+ }
+
+ var dtTemp = new DataTable();
+ dtTemp = GetErrorLog(startDate, endDate);
+
+ // 表示時段中的ErrorCode都有填上
+ if (dtTemp.Rows.Count <= 0)
+ {
+ Collection argCollectionSQL = null;
+ UpdateParameter10(startDate.AddDays(-1), Conversions.ToString(colParameters["JobNo"]), CollectionSQL: argCollectionSQL);
+ funParseErrorLogErrorCodePastRet = "success";
+ return funParseErrorLogErrorCodePastRet;
+ }
+
+ // 填上ErrorCode, ErrorType
+ FillInErrorCodeAndErrorType(dtTemp);
+
+ // update ErrorCode, ErrorType
+ var CollectionSQL = new Collection();
+ UpdateErrorCodeAndErrorType(dtTemp, ref CollectionSQL);
+
+ UpdateParameter10(startDate.AddDays(-1), Conversions.ToString(colParameters["JobNo"]), CollectionSQL);
+ ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL);
+ }
+
+ catch (Exception ex)
+ {
+ // 錯誤訊息: 截取錯誤訊息+換行符號
+ if (!string.IsNullOrEmpty(strReturnMessage))
+ {
+ strReturnMessage += ControlChars.Cr + ex.Message;
+ }
+ else
+ {
+ strReturnMessage += ex.Message;
+ }
+ }
+
+ if (string.IsNullOrEmpty(strReturnMessage))
+ {
+ // //回傳Success
+ funParseErrorLogErrorCodePastRet = "success";
+ }
+ else
+ {
+ // Message長度4000限制
+ if (strReturnMessage.Length > 3996)
+ strReturnMessage = strReturnMessage.Substring(0, 3996) + "...";
+
+ funParseErrorLogErrorCodePastRet = CombineFailMsg("0000-999999", strReturnMessage);
+ }
+
+ return funParseErrorLogErrorCodePastRet;
+ }
+ private DataTable GetErrorLog(DateTime startDate, DateTime endDate)
+ {
+
+ var sb = new StringBuilder();
+ sb.Append("select userid, recorddate, servicename, DESCRIPTION, errorcode, errorType from tblsyserrorlog ");
+ sb.Append("where ");
+ sb.AppendFormat("recorddate >= to_date('{0}','YYYY/MM/DD HH24:MI:SS') and ", Strings.Format(startDate, "yyyy/MM/dd 00:00:00"));
+ sb.AppendFormat("recorddate <= to_date('{0}','YYYY/MM/DD HH24:MI:SS') and ", Strings.Format(endDate, "yyyy/MM/dd 23:59:59"));
+ sb.Append("(errorcode is null or errorcode = '')");
+
+ string strSQL = sb.ToString();
+ var dtTemp = new DataTable();
+ var dsTemp = new DataSet();
+
+ var cnnTemp = default(IDbConnection);
+ //System.Data.OleDb.OleDbDataAdapter daTemp;
+
+ try
+ {
+ cnnTemp = CreateConnection(strConnectionString);
+ //cmmTemp = new IDbCommand(strSQL, (IDbConnection)cnnTemp);
+ //daTemp = new System.Data.OleDb.OleDbDataAdapter((IDbCommand)cmmTemp);
+ //daTemp.Fill(dsTemp, "errorLog");
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "errorLog", cnnTemp);
+ dtTemp = dsTemp.Tables[0];
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ finally
+ {
+ CloseConnection(cnnTemp);
+ }
+
+
+ return dtTemp;
+
+ }
+ private void FillInErrorCodeAndErrorType(DataTable dtTemp)
+ {
+
+ foreach (DataRow dr in dtTemp.Rows)
+ {
+ string description = dr["DESCRIPTION"].ToString();
+
+ if (!description.Contains(""))
+ {
+ dr["ERRORCODE"] = "0000-999999";
+ dr["ERRORTYPE"] = 2;
+ continue;
+ }
+
+ // 讀取InXml字串
+ XmlDoc.LoadXml("" + description + "");
+ dr["ERRORCODE"] = XmlDoc.DocumentElement.GetElementsByTagName("code").Item(0).InnerText;
+ dr["ERRORTYPE"] = dr["ERRORCODE"].ToString() == "0000-999999" ? 2 : 1;
+ }
+
+ }
+ private void UpdateErrorCodeAndErrorType(DataTable dtTemp, ref Collection CollectionSQL)
+ {
+
+ CollectionSQL = new Collection();
+
+ string errorCode, errorType;
+ string userid, serviceName;
+ var sb = new StringBuilder();
+ string strSQL;
+
+ foreach (DataRow dr in dtTemp.Rows)
+ {
+ errorCode = dr["ERRORCODE"].ToString();
+ errorType = dr["ERRORTYPE"].ToString();
+ userid = dr["USERID"].ToString();
+ serviceName = dr["SERVICENAME"].ToString();
+
+ sb.Clear();
+ sb.AppendFormat("update tblsyserrorlog set errorcode = '{0}', errortype = '{1}' ", errorCode, errorType);
+ sb.AppendFormat("where userid = '{0}' and ", userid);
+ sb.AppendFormat("recorddate = to_date('{0}','YYYY/MM/DD HH24:MI:SS') and ", Strings.Format(dr["RECORDDATE"], "yyyy/MM/dd HH:mm:ss"));
+ sb.AppendFormat("servicename = '{0}'", serviceName);
+ strSQL = sb.ToString();
+
+ CollectionSQL.Add(strSQL);
+ }
+
+ }
+ private void UpdateParameter10(DateTime nextParameter10, string jobNo, Collection CollectionSQL = null)
+ {
+
+ var sb = new StringBuilder();
+ sb.AppendFormat("update tblMESAutoRunJob set parameter10 = '{0}' where jobno = '{1}'", Strings.Format(nextParameter10, "yyyy/MM/dd"), jobNo);
+ string strSQL = sb.ToString();
+
+ if (CollectionSQL != null)
+ {
+ CollectionSQL.Add(strSQL);
+ return;
+ }
+
+ CollectionSQL = new Collection();
+ CollectionSQL.Add(strSQL);
+
+ ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL);
+
+ }
+ ///
+ /// 解析ErrorLog的Description之ErrorCode,回填ErrorCode與ErrorType(新資料)
+ ///
+ ///
+ /// 已執行到的時間記錄於Parameter09
+ ///
+ ///
+ /// 每次取3天份的資料,每次取還未執行的新資料(3/8~3/10 => 3/11~3/13 => 3/14~3/16)
+ /// 今天為2022/3/29,若Parameter09欄位沒有值, 則取得現時點往回3天份的資料(2022/3/27~2022/3/29) 結束後將2022/3/29回填Parameter09
+ /// 今天為2022/3/29,若Parameter09欄位有值且差距大於2天(2022/3/25), 則取得2022/3/25~2022/3/27 結束後將2022/3/28回填Parameter09
+ /// 今天為2022/3/29,若Parameter09欄位有值且差距小於2天(2022/3/27), 則取得2022/3/27~2022/3/29 結束後將2022/3/29回填Parameter09
+ ///
+ private string funParseErrorLogErrorCodeForward(Collection colParameters = null)
+ {
+ string funParseErrorLogErrorCodeForwardRet = default(string);
+
+ string strReturnMessage = ""; // 執行檔Catch訊息(Job Jog)。Chr(10)分隔每個錯誤訊息。
+
+ try
+ {
+ if (colParameters["JobNo"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["JobNo"]))))
+ {
+ funParseErrorLogErrorCodeForwardRet = CombineFailMsg("0000-999999", "There is no JobNo!");
+ return funParseErrorLogErrorCodeForwardRet;
+ }
+
+ // 已執行到的時間記錄於Parameter10
+ DateTime startDate, endDate, nextParameter10;
+ endDate = GetEndDate(Conversions.ToString(colParameters["Parameter10"]));
+ startDate = GetStartDate(Conversions.ToString(colParameters["Parameter10"]));
+ nextParameter10 = GetNextParameter10(Conversions.ToString(colParameters["Parameter10"]));
+
+ var dtTemp = new DataTable();
+ dtTemp = GetErrorLog(startDate, endDate);
+
+ // 表示時段中的ErrorCode都有填上
+ if (dtTemp.Rows.Count <= 0)
+ {
+ Collection argCollectionSQL = null;
+ UpdateParameter10(nextParameter10, Conversions.ToString(colParameters["JobNo"]), CollectionSQL: argCollectionSQL);
+ funParseErrorLogErrorCodeForwardRet = "success";
+ return funParseErrorLogErrorCodeForwardRet;
+ }
+
+ // 填上ErrorCode, ErrorType
+ FillInErrorCodeAndErrorType(dtTemp);
+
+ // update ErrorCode, ErrorType
+ var CollectionSQL = new Collection();
+ UpdateErrorCodeAndErrorType(dtTemp, ref CollectionSQL);
+
+ UpdateParameter10(nextParameter10, Conversions.ToString(colParameters["JobNo"]), CollectionSQL);
+ ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL);
+ }
+
+ catch (Exception ex)
+ {
+ // 錯誤訊息: 截取錯誤訊息+換行符號
+ if (!string.IsNullOrEmpty(strReturnMessage))
+ {
+ strReturnMessage += ControlChars.Cr + ex.Message;
+ }
+ else
+ {
+ strReturnMessage += ex.Message;
+ }
+ }
+
+ if (string.IsNullOrEmpty(strReturnMessage))
+ {
+ // //回傳Success
+ funParseErrorLogErrorCodeForwardRet = "success";
+ }
+ else
+ {
+ // Message長度4000限制
+ if (strReturnMessage.Length > 3996)
+ strReturnMessage = strReturnMessage.Substring(0, 3996) + "...";
+
+ funParseErrorLogErrorCodeForwardRet = CombineFailMsg("0000-999999", strReturnMessage);
+ }
+
+ return funParseErrorLogErrorCodeForwardRet;
+ }
+ private DateTime GetStartDate(string parameter10)
+ {
+
+ if (parameter10 == null || string.IsNullOrEmpty(Strings.Trim(parameter10)))
+ {
+ return DateTime.Now.AddDays(-2);
+ }
+ else
+ {
+ return DateTime.Parse(parameter10);
+ }
+
+ }
+ private DateTime GetEndDate(string parameter10)
+ {
+
+ if (parameter10 == null || string.IsNullOrEmpty(Strings.Trim(parameter10)))
+ {
+ return DateTime.Now;
+ }
+
+ var tempDate = DateTime.Parse(parameter10);
+ if (DateTime.Today.CompareTo(tempDate.AddDays(+2)) <= 0)
+ {
+ return DateTime.Today;
+ }
+ else
+ {
+ return tempDate.AddDays(+2);
+ }
+
+ }
+ private DateTime GetNextParameter10(string parameter10)
+ {
+
+ if (parameter10 == null || string.IsNullOrEmpty(Strings.Trim(parameter10)))
+ {
+ return DateTime.Now;
+ }
+
+ var tempDate = DateTime.Parse(parameter10);
+ if (DateTime.Today.CompareTo(tempDate.AddDays(+2)) <= 0)
+ {
+ return DateTime.Today;
+ }
+ else
+ {
+ return tempDate.AddDays(+3);
+ }
+
+ }
+
+ #endregion
+
+
+ #region MES與WF與PLM整合_產品與物料整合
+
+ ///
+ /// WF產品與物料整合 與E10ICD及T100不同,以item_category區分只處理產品或物料部分
+ ///
+ ///
+ ///
+ private object funMESCallERPPRDMTLBasis_WF(Collection colParameters = null)
+ {
+ object funMESCallERPPRDMTLBasis_WFRet = default(object);
+ var XmlDoc = new XmlDocument();
+ var CollectionSQL = new Collection();
+
+ // ===========================================================
+ // 宣告 AutoRunJob設定及執行記錄 變數
+ // ===========================================================
+ string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。
+ string strPageSize = "500"; // 參數二,分包筆數
+ int intRunTime = 5; // 參數三,分包執行次數,預設為5次
+ var strDate = default(string); // 參數四,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主
+ string strSubject, strBody; // 寄送通知資訊
+ string strServiceName = "item.get_workflow";
+
+ // AutorunJob拋轉資訊
+ string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。
+ var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。
+ var colResponseXML = new Collection();
+ string strKey_Condition = "";
+ string strRequest_Datetime = "";
+
+ do
+ {
+ try
+ {
+ // Parameter01為參數一
+ // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。
+ if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))))
+ {
+ strParameter01 = colParameters["Parameter01"].ToString().Trim();
+ }
+ else
+ {
+ aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880
+ break;
+ }
+
+ // Parameter02為參數二
+ // 分包筆數必須為數值型態,Add by KevinChang
+ strPageSize = "500";
+ if (Information.IsNumeric(colParameters["Parameter02"]))
+ {
+ if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"]))))
+ {
+ // 每封包筆數不可小於500筆,Add by KevinChang
+ if (Conversions.ToInteger(colParameters["Parameter02"]) < 500)
+ {
+ strPageSize = "500";
+ }
+ else
+ {
+ strPageSize = colParameters["Parameter02"].ToString().Trim();
+ }
+ }
+ }
+
+ // Parameter03為參數三
+ // 分包執行次數,預設為5次,必須為數值型態。
+ if (Information.IsNumeric(colParameters["Parameter03"]))
+ {
+ if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"]))))
+ {
+ intRunTime = Conversions.ToInteger(colParameters["Parameter03"]);
+ }
+ }
+
+ // Parameter04為參數四
+ // 手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主
+ if (!(colParameters["Parameter04"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter04"]))))
+ {
+ // 2022/10/19 Lena, 日期格式調整為 yyyy/MM/dd HH:mm:ss
+ // strDate = GetDate(colParameters("Parameter04"), "Parameter04")
+
+ if (Information.IsDate(colParameters["Parameter04"]))
+ {
+ strDate = Strings.Format(Conversions.ToDate(colParameters["Parameter04"]), "yyyy/MM/dd HH:mm:ss");
+ }
+ else
+ {
+ throw new Exception(Conversions.ToString("Parameter04 value is " +
+ colParameters["Parameter04"] + " DateTime Format is Error!(The format string like: yyyy/MM/dd HH:mm:ss)"));
+ }
+ }
+ else
+ {
+ // strDate = GetERPTransactionDate(strServiceName)
+
+ string strERPDate;
+ strERPDate = GetERPTransactionDate(strServiceName);
+ if ((strERPDate ?? "") != defString)
+ {
+ strDate = strERPDate;
+ if (strERPDate.Length > 14)
+ {
+ strDate = Strings.Mid(strERPDate, 1, 4) + "/" + Strings.Mid(strERPDate, 5, 2) + "/" + Strings.Mid(strERPDate, 7, 2) + " " + Strings.Mid(strERPDate, 9, 2) + ":" + Strings.Mid(strERPDate, 11, 2) + ":" + Strings.Mid(strERPDate, 13, 2);
+ }
+ }
+ }
+
+ // 取得erp資訊
+ GetERPSetting_WF();
+
+ // If (Not GetERPSetting(dtERPSetting, "WorkFlow")) Then
+ // aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!"))
+ // Exit Try
+ // End If
+
+ bool chkStatus = true;
+
+ // 抓取其它status為0之資料且塞入colResponseXML
+ GetReTransData(strServiceName, ref colResponseXML);
+
+ // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作
+ InXml = CombineRequestXML_item_get_WF("8", strPageSize, strKey_Condition, strDate);
+
+ int intloopTimes = 0;
+ string strCode = default(string);
+ string strSql_Code = default(string);
+ string strDescription = default(string);
+ do
+ {
+ // 迴圈執行超過intRunTime(預設5)次直接跳出迴圈
+ if (intloopTimes >= intRunTime)
+ {
+ break;
+ }
+
+ // 先確認是否有測試檔案,有的話就讀取出xml
+ OutXml = string.Empty;
+ OutXml = LoadXmlFileForTest(strServiceName);
+
+ try
+ {
+
+ if (string.IsNullOrEmpty(OutXml))
+ {
+ // ----- Call ERP Web Service -----
+ using (var ws = new wsERP_WorkFlow.WFMESService())
+ {
+ ws.Url = gERPWSURL;
+ OutXml = ws.XMLAdapter(InXml);
+ }
+ // 2017-05-03, Joe, 轉換單引號
+ OutXml = OutXml.Replace("'", "''");
+ }
+ }
+
+ catch (Exception ex)
+ {
+ OutXml = ex.Message;
+ throw ex;
+ }
+ finally
+ {
+ // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內
+ colResponseXML.Add(OutXml);
+ }
+
+ XmlDoc.LoadXml(OutXml);
+
+ // 執行ERP交易完畢寫入Log
+ string argstrException = null;
+
+ // 將ERP拋回的資料轉成物件
+ modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis_WF", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException);
+ chkExecutionStatus_WF(XmlDoc, ref strCode, ref strSql_Code, ref strDescription, ref strKey_Condition, ref strRequest_Datetime);
+ if (strCode == "0")
+ {
+ if (string.IsNullOrEmpty(strKey_Condition))
+ break;
+ InXml = CombineRequestXML_item_get_WF("8", strPageSize, strKey_Condition, strDate);
+ }
+ else
+ {
+ chkStatus = false;
+ aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋
+ break;
+ }
+
+ intloopTimes += 1;
+ }
+ while (true);
+
+ // 寫入log table
+ TreatWriteLogTable_WF(colResponseXML, strServiceName);
+
+ // 寫入MES DB
+ if (chkStatus)
+ {
+ foreach (string strOutXML in colResponseXML)
+ {
+ if (WriteProductOrMaterailBasis_WF(strOutXML, ref aryReturnMessage) < 0)
+ {
+ if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目.
+ {
+ aryReturnMessage.Add(TranslateMsg("item_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir));
+ }
+ }
+ }
+ }
+ }
+ catch (Exception EX_AUT)
+ {
+
+ aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString());
+ OutXml = EX_AUT.Message.ToString();
+ results = "fail";
+ // 執行ERP交易完畢寫入Log
+ string argstrException = null;
+ modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis_WF", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException);
+ }
+ finally
+ {
+ // --------------------------------------------------
+ // 回傳執行結果:succces 或 fail(ReturnMessage)
+ // --------------------------------------------------
+ if (aryReturnMessage.Count == 0)
+ {
+ funMESCallERPPRDMTLBasis_WFRet = "success";
+ results = "success";
+ }
+ else
+ {
+
+ // 組合執行錯誤字串: Chr(10)分隔
+ strReturnMessage = ArrayList2String(ref aryReturnMessage);
+ if ((strReturnMessage ?? "") == defString)
+ {
+ // 當錯誤字串組合失敗。補上
+ strReturnMessage = "ReturnMessage收集失敗!!";
+ }
+
+ // tblMESAutoRunLog.ReturnMessage 長度4000限制.
+ string strTemp = "";
+ if (strReturnMessage.Length > 4000)
+ {
+ // 自 strReturnMessage 中截取0-3991碼.
+ strTemp = strReturnMessage.Substring(0, 3991) + "...";
+ }
+ else
+ {
+ strTemp = strReturnMessage;
+ }
+
+ // 更新log table異常資訊
+ // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid")
+ // UpdateLogTableErrorInfo(nodeID.InnerText, strTemp)
+ UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp);
+
+ // //fail;
+ funMESCallERPPRDMTLBasis_WFRet = CombineFailMsg("0000-999999", strTemp);
+
+ }
+ // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06
+ // 執行ERP交易完畢寫入Log
+ string argstrException = null;
+ modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis_WF", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException);
+ }
+ }
+ // ===
+ while (false);
+
+ // --------------------------------------------------
+ // 當執行失敗,寄送 Email。必須有設定參數一。
+ // --------------------------------------------------
+ IDbConnection argcnnTemp = null;
+ try
+ {
+ if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false)))
+ {
+ strSubject = "[AUT]料件-基本資料抛轉失敗! ";
+ strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text);
+
+ // 寄送 Email
+ argcnnTemp = CreateConnection(strConnectionString);
+ if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0)
+ {
+ // '寄送不成功, ReturnMessage 再增加1項.
+ // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString
+
+ // 寄送不成功, ReturnMessage 再增加1項.
+ // tblMESAutoRunLog.ReturnMessage 長度4000限制.
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPPRDMTLBasis().ToString().Length, 4000, false)))
+ {
+
+ string strTemp = "";
+ strTemp = strReturnMessage;
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp +
+ aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false)))
+ {
+ strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]);
+ }
+ else
+ {
+ strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]);
+
+ // 自 strTemp 中截取0-3991碼.
+ strTemp = strTemp.Substring(0, 3991) + "...";
+ }
+
+ // //fail;
+ funMESCallERPPRDMTLBasis_WFRet = CombineFailMsg("0000-999999", strTemp);
+ }
+ }
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ finally
+ {
+ CloseConnection(argcnnTemp);
+ }
+
+ return funMESCallERPPRDMTLBasis_WFRet;
+ }
+
+ ///
+ /// funMESCallERPPRDMTLBasis_WF接口呼叫WF端時的RequestXML
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public string CombineRequestXML_item_get_WF(string DoAction = "8", string PageSize = "500", string key_condition = "", string request_datetime = "", string User = null, string Password = null, string ApplicationName = null, string Source = null, string Oraganization = null, string Language = null)
+ {
+ string CombineRequestXML_item_get_WFRet = default(string);
+
+ GetERPSetting_WF();
+
+ try
+ {
+ // ERPSignIn改由來自資料庫的ERP Setting表
+ if (User == null)
+ User = gERPUser;
+ if (Password == null)
+ Password = gERPPassword;
+ if (ApplicationName == null)
+ ApplicationName = "MES";
+ if (Source == null)
+ Source = modWIN.gComputerName;
+ if (Oraganization == null)
+ Oraganization = gERPOraganization;
+ if (Language == null)
+ Language = gERPLanguage;
+ }
+
+ catch (Exception ex)
+ {
+ CombineRequestXML_item_get_WFRet = "CombineRequestXML_item_get_WF fail;" + ex.Message;
+ }
+
+ CombineRequestXML_item_get_WFRet = "" + '\n';
+ CombineRequestXML_item_get_WFRet += "" + Oraganization + "" + '\n';
+ CombineRequestXML_item_get_WFRet += "" + DoAction + "" + '\n';
+ CombineRequestXML_item_get_WFRet += "" + User + "" + '\n';
+ CombineRequestXML_item_get_WFRet += "" + Password + "" + '\n';
+ CombineRequestXML_item_get_WFRet += "" + ApplicationName + "" + '\n';
+ CombineRequestXML_item_get_WFRet += "" + modWIN.gComputerName + "" + '\n';
+ CombineRequestXML_item_get_WFRet += "" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "" + '\n';
+ CombineRequestXML_item_get_WFRet += "" + strDefLanguage + "" + '\n';
+ CombineRequestXML_item_get_WFRet += "" + request_datetime + "" + '\n';
+ CombineRequestXML_item_get_WFRet += "" + PageSize + "" + '\n';
+ CombineRequestXML_item_get_WFRet += "" + key_condition + "" + '\n';
+ CombineRequestXML_item_get_WFRet += "" + '\n';
+ CombineRequestXML_item_get_WFRet += "";
+ return CombineRequestXML_item_get_WFRet;
+
+ }
+
+ ///
+ /// 解析WF(Work Flow)回傳表頭
+ ///
+ /// 傳入XML
+ ///
+ ///
+ ///
+ ///
+ public bool chkExecutionStatus_WF(XmlDocument Xmldoc, ref string code, ref string sql_code, ref string description, ref string key_condition, ref string request_datetime)
+ {
+ bool chkExecutionStatus_WFRet = default(bool);
+
+ chkExecutionStatus_WFRet = false;
+
+ var de = Xmldoc.DocumentElement["execution"];
+ if (de == null == true)
+ return chkExecutionStatus_WFRet;
+ for (int i = 0, loopTo = de.ChildNodes.Count - 1; i <= loopTo; i++)
+ {
+ if (de.ChildNodes[i].Name == "status")
+ {
+ var cn = de.ChildNodes[i];
+ code = de.ChildNodes[i].Attributes["code"].Value.ToString();
+ sql_code = de.ChildNodes[i].Attributes["sql_code"].Value.ToString();
+ description = de.ChildNodes[i].Attributes["description"].Value.ToString();
+ chkExecutionStatus_WFRet = true;
+ }
+ }
+
+ key_condition = "";
+ if (Xmldoc.DocumentElement.GetElementsByTagName("key_condition").Count > 0)
+ {
+ if (!string.IsNullOrEmpty(Xmldoc.GetElementsByTagName("key_condition").Item(0).InnerText))
+ {
+ key_condition = Xmldoc.GetElementsByTagName("key_condition").Item(0).InnerText;
+ }
+ }
+
+ request_datetime = "";
+ if (Xmldoc.DocumentElement.GetElementsByTagName("request_datetime").Count > 0)
+ {
+ if (!string.IsNullOrEmpty(Xmldoc.GetElementsByTagName("request_datetime").Item(0).InnerText))
+ {
+ request_datetime = Xmldoc.GetElementsByTagName("request_datetime").Item(0).InnerText;
+ }
+ }
+
+ return chkExecutionStatus_WFRet;
+
+ }
+
+ ///
+ /// 解析item_get_detail Value Tag Detail回傳Dictionary(Of String, String)
+ ///
+ ///
+ ///
+ public DataTable GetXML_DetailValue2Dictionary_WF(XmlDocument Xmldoc)
+ {
+ DataTable GetXML_DetailValue2Dictionary_WFRet = default(DataTable);
+
+ var dtResult = new DataTable("item_get_detail");
+ XmlNodeList xmlList;
+
+ try
+ {
+
+ // 先加入欄位資訊
+ if (Xmldoc.DocumentElement.GetElementsByTagName("item_get_detail").Count > 0)
+ {
+ // 2022/10/19 Lena, 修正 ERF 回拋是沒有明細資料時的錯誤.
+ if (Xmldoc.GetElementsByTagName("item_get_detail").Item(0).SelectNodes("value").Count > 0)
+ {
+ xmlList = Xmldoc.GetElementsByTagName("item_get_detail").Item(0).SelectNodes("value");
+ for (int i = 0; i <= 0; i++)
+ {
+ for (int j = 0, loopTo = xmlList[i].ChildNodes.Count - 1; j <= loopTo; j++)
+ {
+ if (xmlList[i].ChildNodes[j] != null)
+ {
+ if (!dtResult.Columns.Contains(xmlList[i].ChildNodes[j].Name))
+ {
+ dtResult.Columns.Add(xmlList[i].ChildNodes[j].Name, Type.GetType("System.String"));
+ }
+ }
+ }
+ }
+
+ // 每個List新增一筆資料
+ for (int i = 0, loopTo1 = xmlList.Count - 1; i <= loopTo1; i++)
+ {
+ var drAdd = dtResult.NewRow();
+ for (int j = 0, loopTo2 = xmlList[i].ChildNodes.Count - 1; j <= loopTo2; j++)
+ {
+ if (xmlList[i].ChildNodes[j] != null)
+ {
+ drAdd[xmlList[i].ChildNodes[j].Name] = xmlList[i].ChildNodes[j].InnerText;
+ }
+ else
+ {
+ drAdd[xmlList[i].ChildNodes[j].Name] = "";
+ }
+ }
+ dtResult.Rows.Add(drAdd);
+ }
+
+ }
+ }
+ }
+
+ catch (Exception ex)
+ {
+ throw;
+ }
+ finally
+ {
+ GetXML_DetailValue2Dictionary_WFRet = dtResult;
+ }
+
+ return GetXML_DetailValue2Dictionary_WFRet;
+
+ }
+
+ ///
+ /// 確認分包資料回傳時,是否仍有後續資料,沒有則回傳fale中斷處理
+ ///
+ ///
+ ///
+ public bool CheckOutXMLData(string OutXML)
+ {
+ bool CheckOutXMLDataRet = default(bool);
+
+ CheckOutXMLDataRet = false;
+
+ var XmlDoc = new XmlDocument();
+ XmlDoc.LoadXml(OutXML);
+ if (XmlDoc.GetElementsByTagName("returnvalue").Item(0).SelectNodes("item_get_detail").Count > 0)
+ {
+ CheckOutXMLDataRet = true;
+ }
+
+ return CheckOutXMLDataRet;
+
+ }
+
+ ///
+ /// 根據XML List內容新增或刪除產品與物料主檔(不同與T100與E10ICD item_category="A" 只處理產品主檔 ,item_category="M"只處理物料主檔)
+ ///
+ ///
+ ///
+ ///
+ private int WriteProductOrMaterailBasis_WF(string OutXML, ref ArrayList aryReturnMessage)
+ {
+ int WriteProductOrMaterailBasis_WFRet = default(int);
+ WriteProductOrMaterailBasis_WFRet = -1; // Return -1:fail,0:Success
+
+ // ===========================================================
+ // 宣告 DB相關 變數
+ // ===========================================================
+ var drTemp = default(DbDataReader);
+ IDbConnection cnnMES = null;
+ Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要).
+ string strSQL;
+ string strSQLCol;
+ string strSQLVal;
+
+ // 每筆中介交易記錄
+ string strIfWhereCond_PK;
+ string strMES_Result;
+ string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。
+ var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。
+
+ try
+ {
+ cnnMES = CreateConnection(strConnectionString);
+
+ // 宣告拋轉資料使用變數
+ string strERP_ProductNo, strERP_MaterialNo, strERP_ProductVersion, strERP_status, strERP_UnitNo, strERP_ItemName, strErpNo, strERP_SpecNo, strERP_LotManage = default(string);
+ DataRow drChk;
+
+ // 預設值
+ string strProductType = "PRODUCT"; // 給予預設值"PRODUCT",若不存在則自動新增產品類別.
+ int intIssueState = 0;
+ int intCurVersion = 0;
+ string strMaterialType = "MATERIL"; // 給予預設值"MATERIL",若不存在則自動新增物料類別.
+ int intPutInPlace = 3; // 投料點:預設為3(工單).
+ int intCountWay = 1; // 計量方法:預設為1(實際用量).
+ int intCheckLotNo = 1; // 物料批號檢查:預設為0(不檢查批號).
+ var aryProductType = new ArrayList(); // 記錄產品類別是否新增
+ var aryMaterialType = new ArrayList(); // 記錄物料類別是否新增
+ var aryUnitNo = new ArrayList(); // 記錄單位主檔是否新增
+ do
+ {
+ try
+ {
+
+ var XmlDoc = new XmlDocument();
+ XmlDoc.LoadXml(OutXML);
+
+ // 將OutXML解析為資料表型態,方便後續新增刪除的處理
+ var dtDetail = GetXML_DetailValue2Dictionary_WF(XmlDoc);
+
+ bool exitTry2 = false;
+ for (int intRow = 0, loopTo = dtDetail.Rows.Count - 1; intRow <= loopTo; intRow++)
+ {
+
+ if (string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["item_category"])))
+ {
+ aryMES_Message.Add(TranslateMsg("item_category" + " [%Is Empty%]!", strLanguageMode, strResourceDir));
+ break;
+ }
+
+ if (dtDetail.Rows[intRow]["item_category"].Equals("A")) // 處理產品類型
+ {
+ // -----------------------------------------------------------
+ // 固定檢查ProductType='PRODUCT'資料,若不存在則自動新增。
+ // -----------------------------------------------------------
+ // If AddProductType(cnnMES, colSQL_2MES, colSQL_2MES_Rows, aryMES_Message, strProductType, strERPCreator, DateTime.Now, "AutoRun建立") < 0 Then Exit Try
+
+ if (aryProductType.IndexOf(strProductType) == -1)
+ {
+ if (AddProductType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strProductType, strERPCreator, DateTime.Now, "AutoRun建立") < 0)
+ {
+ exitTry2 = true;
+ break;
+ }
+ else
+ {
+ aryProductType.Add(strProductType);
+ }
+ }
+
+ // -----------------------------------------------------------
+ // 取出各欄位資料
+ // -----------------------------------------------------------
+ strERP_ProductNo = dtDetail.Rows[intRow]["item_no"].ToString().Trim().ToUpper();
+ strErpNo = dtDetail.Rows[intRow]["item_no"].ToString().Trim(); // 記錄原始之ERP編號
+ strERP_ProductVersion = Interaction.IIf(string.IsNullOrWhiteSpace(dtDetail.Rows[intRow]["item_ver"].ToString()), "1", dtDetail.Rows[intRow]["item_ver"]).ToString().Trim();
+
+ strERP_status = dtDetail.Rows[intRow]["transstatus"].ToString().Trim().ToUpper();
+ // 2022/10/19 Lena,修正錯誤
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtDetail.Rows[intRow]["production_unit_no"], "", false)))
+ {
+ strERP_UnitNo = "N/A";
+ }
+ else // 單位有傳入才作檢查
+ {
+ string strUnitNo = dtDetail.Rows[intRow]["production_unit_no"].ToString().Trim();
+ strERP_UnitNo = dtDetail.Rows[intRow]["production_unit_no"].ToString().Trim().ToLower();
+ // -----------------------------------------------------------
+ // 檢查UnitNo資料,若不存在則自動新增。
+ // -----------------------------------------------------------
+ if (aryUnitNo.IndexOf(strERP_UnitNo) == -1)
+ {
+ if (AddUnitNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strUnitNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0)
+ {
+ exitTry2 = true;
+ break;
+ }
+ else
+ {
+ aryUnitNo.Add(strERP_UnitNo);
+ }
+ }
+
+ }
+ strERP_ItemName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["item_name"])), "N/A", dtDetail.Rows[intRow]["item_name"]));
+ strERP_SpecNo = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["specno"])), "N/A", dtDetail.Rows[intRow]["specno"]));
+
+ // 檢查是否有此產品設定
+ strSQL = "Select ProductNo,IssueState From tblPRDProductBasis " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'";
+ //cmmTemp = new IDbCommand(strSQL, cnnMES);
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES);
+ bool exitTry = false;
+ switch (strERP_status ?? "")
+ {
+ case "AU": // 有資料修改沒資料新增
+ {
+
+ if (!drTemp.Read())
+ {
+ intIssueState = 0;
+ // -----------------------------------------------------------
+ // 產品編號合理性檢查
+ // 2019/07/22 Eric 啟用檢查
+ // -----------------------------------------------------------
+ if (ProductIntegration_ChkValid_ProductNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0)
+ {
+ exitTry2 = exitTry = true;
+ break; // GoTo lblExitTry_2_NextRow
+ }
+
+ // -----------------------------------------------------------
+ // 新增MES產品設定
+ // -----------------------------------------------------------
+ strSQLCol = "Insert Into tblPRDProductBasis " + "(ProductNo,ProductVersion,ProductName,ProductType," + " UnitNo,UnitType,ItemSpec,Description," + " IssueState,CurVersion,Creator,CreateDate,ERPNo,QCCategory";
+ strSQLVal = ") Values('" + strERP_ProductNo + "','" + strERP_ProductVersion + "','" + strERP_ItemName + "','" + strProductType + "','" + strERP_UnitNo + "','" + strERP_UnitNo + "','" + strERP_SpecNo + "','AutoRun建立'," + intIssueState + "," + intCurVersion + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "', 'N/A'";
+ // 2022/10/19 Lane, 修正欄位名稱錯誤的問題
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined01"])))
+ {
+ strSQLCol += ",User_Defined01";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined01"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined02"])))
+ {
+ strSQLCol += ",User_Defined02";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined02"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined03"])))
+ {
+ strSQLCol += ",User_Defined03";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined03"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined04"])))
+ {
+ strSQLCol += ",User_Defined04";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined04"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined05"])))
+ {
+ strSQLCol += ",User_Defined05";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined05"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined06"])))
+ {
+ strSQLCol += ",User_Defined06";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined06"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined07"])))
+ {
+ strSQLCol += ",User_Defined07";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined07"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined08"])))
+ {
+ strSQLCol += ",User_Defined08";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined08"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined09"])))
+ {
+ strSQLCol += ",User_Defined09";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined09"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined10"])))
+ {
+ strSQLCol += ",User_Defined10";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined10"].ToString().Trim()), "'"));
+ }
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine11")) Then
+ // strSQLCol += ",User_Defined11"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine11").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine12")) Then
+ // strSQLCol += ",User_Defined12"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine12").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine13")) Then
+ // strSQLCol += ",User_Defined13"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine13").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine14")) Then
+ // strSQLCol += ",User_Defined14"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine14").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine15")) Then
+ // strSQLCol += ",User_Defined15"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine15").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine16")) Then
+ // strSQLCol += ",User_Defined16"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine16").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine17")) Then
+ // strSQLCol += ",User_Defined17"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine17").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine18")) Then
+ // strSQLCol += ",User_Defined18"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine18").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine19")) Then
+ // strSQLCol += ",User_Defined19"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine19").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine20")) Then
+ // strSQLCol += ",User_Defined20"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine20").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine21")) Then
+ // strSQLCol += ",User_Defined21"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine21")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine22")) Then
+ // strSQLCol += ",User_Defined22"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine22")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine23")) Then
+ // strSQLCol += ",User_Defined23"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine23")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine24")) Then
+ // strSQLCol += ",User_Defined24"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine24")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine25")) Then
+ // strSQLCol += ",User_Defined25"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine25")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine26")) Then
+ // strSQLCol += ",User_Defined26"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine26")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine27")) Then
+ // strSQLCol += ",User_Defined27"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine27")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine28")) Then
+ // strSQLCol += ",User_Defined28"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine28")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine29")) Then
+ // strSQLCol += ",User_Defined29"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine29")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine30")) Then
+ // strSQLCol += ",User_Defined30"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine30")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine31")) Then
+ // strSQLCol += ",User_Defined31"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine31").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine32")) Then
+ // strSQLCol += ",User_Defined32"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine32").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine33")) Then
+ // strSQLCol += ",User_Defined33"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine33").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine34")) Then
+ // strSQLCol += ",User_Defined34"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine34").Trim + "'"
+ // End If
+
+ // 2017-05-22, Joe, Add 圖號
+ // 2022/10/19 修正欄位名稱的錯誤
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["graph_no"])))
+ {
+ strSQLCol += ",GraphNo";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["graph_no"].ToString().Trim()), "'"));
+ }
+
+ strSQL = strSQLCol + strSQLVal + ")";
+ colSQL_2MES.Add(strSQL);
+ colSQL_2MES_Rows.Add(1);
+ }
+
+ else
+ {
+ // -----------------------------------------------------------
+ // 修改MES產品設定
+ // -----------------------------------------------------------
+ // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false)))
+ {
+ intIssueState = 0;
+ }
+ else
+ {
+ intIssueState = Conversions.ToInteger(drTemp["IssueState"]);
+ }
+ // 2017-06-08, Joe, 修改為異動CurVersion
+ strSQL = "Update tblPRDProductBasis Set " + " IssueState = " + intIssueState + " , ProductName = '" + strERP_ItemName + "', UnitNo = '" + strERP_UnitNo + "', UnitType = '" + strERP_UnitNo + "' " + " ,ProductType = '" + strProductType + "', ItemSpec = '" + strERP_SpecNo + "', ERPNo = '" + strErpNo + "' ";
+
+ // 2022/10/19 Lena, 修正欄位名稱錯誤的問題
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined01"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined01='" +
+ dtDetail.Rows[intRow]["userdefined01"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined02"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined02='" +
+ dtDetail.Rows[intRow]["userdefined02"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined03"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined03='" +
+ dtDetail.Rows[intRow]["userdefined03"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined04"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined04='" +
+ dtDetail.Rows[intRow]["userdefined04"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined05"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined05='" +
+ dtDetail.Rows[intRow]["userdefined05"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined06"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined06='" +
+ dtDetail.Rows[intRow]["userdefined06"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined07"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined07='" +
+ dtDetail.Rows[intRow]["userdefined07"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined08"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined08='" +
+ dtDetail.Rows[intRow]["userdefined08"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined09"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined09='" +
+ dtDetail.Rows[intRow]["userdefined09"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined10"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined10='" +
+ dtDetail.Rows[intRow]["userdefined10"].ToString().Trim() + "'");
+ }
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine11")) Then
+ // strSQL += ",User_Defined11='" & dtDetail.Rows(intRow)("userdefine11").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine12")) Then
+ // strSQL += ",User_Defined12='" & dtDetail.Rows(intRow)("userdefine12").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine13")) Then
+ // strSQL += ",User_Defined13='" & dtDetail.Rows(intRow)("userdefine13").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine14")) Then
+ // strSQL += ",User_Defined14='" & dtDetail.Rows(intRow)("userdefine14").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine15")) Then
+ // strSQL += ",User_Defined15='" & dtDetail.Rows(intRow)("userdefine15").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine16")) Then
+ // strSQL += ",User_Defined16='" & dtDetail.Rows(intRow)("userdefine16").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine17")) Then
+ // strSQL += ",User_Defined17='" & dtDetail.Rows(intRow)("userdefine17").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine18")) Then
+ // strSQL += ",User_Defined18='" & dtDetail.Rows(intRow)("userdefine18").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine19")) Then
+ // strSQL += ",User_Defined19='" & dtDetail.Rows(intRow)("userdefine19").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine20")) Then
+ // strSQL += ",User_Defined20='" & dtDetail.Rows(intRow)("userdefine20").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine21")) Then
+ // strSQL += ",User_Defined21=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine21")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine22")) Then
+ // strSQL += ",User_Defined22=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine22")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine23")) Then
+ // strSQL += ",User_Defined23=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine23")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine24")) Then
+ // strSQL += ",User_Defined24=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine24")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine25")) Then
+ // strSQL += ",User_Defined25=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine25")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine26")) Then
+ // strSQL += ",User_Defined26=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine26")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine27")) Then
+ // strSQL += ",User_Defined27=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine27")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine28")) Then
+ // strSQL += ",User_Defined28=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine28")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine29")) Then
+ // strSQL += ",User_Defined29=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine29")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine30")) Then
+ // strSQL += ",User_Defined30=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine30")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine31")) Then
+ // strSQL += ",User_Defined31='" + dtDetail.Rows(intRow)("userdefine31").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine32")) Then
+ // strSQL += ",User_Defined32='" + dtDetail.Rows(intRow)("userdefine32").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine33")) Then
+ // strSQL += ",User_Defined33='" + dtDetail.Rows(intRow)("userdefine33").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine34")) Then
+ // strSQL += ",User_Defined34='" + dtDetail.Rows(intRow)("userdefine34").Trim + "'"
+ // End If
+
+ // 2017-05-22, Joe, Add 圖號
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["graph_no"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",GraphNo='" +
+ dtDetail.Rows[intRow]["graph_no"].ToString().Trim() + "'");
+ }
+
+ strSQL += " Where ProductNo='" + strERP_ProductNo + "' And ProductVersion='" + strERP_ProductVersion + "'";
+ colSQL_2MES.Add(strSQL);
+ colSQL_2MES_Rows.Add(1);
+ }
+ drTemp.Close();
+ //cmmTemp.Dispose();
+ break;
+ }
+
+ case "D": // D:刪除
+ {
+
+ if (drTemp.Read())
+ {
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false)))
+ {
+ // -----------------------------------------------------------
+ // 先刪除MES產品相關設定
+ // -----------------------------------------------------------
+ if (ProductIntegration_DelProduct(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0)
+ {
+ exitTry2 = exitTry = true;
+ break; // GoTo lblExitTry_2_NextRow
+ }
+ }
+
+ else
+ {
+ // -----------------------------------------------------------
+ // 作廢MES產品設定
+ // -----------------------------------------------------------
+ strSQL = "Update tblPRDProductBasis Set " + " IssueState=-1" + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'";
+ colSQL_2MES.Add(strSQL);
+ colSQL_2MES_Rows.Add(1);
+
+ }
+ }
+ // aryMES_Message.Add(TranslateMsg("[%PRODUCTNO%](item_no): " & strERP_ProductNo & ", [%PRODUCTVERSION%](item_ver): " & strERP_ProductVersion & ", [%IS NOT EXIST%], [%NOT ALLOW TO DELETE%]!!"))
+
+ // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit;
+ else if (ProductIntegration_DelProduct(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0)
+ {
+ exitTry2 = exitTry = true;
+ break;
+
+ }
+ drTemp.Close();
+ //cmmTemp.Dispose();
+ break;
+ }
+
+ default:
+ {
+ aryMES_Message.Add(TranslateMsg("[%PRODUCTNO%](item_no): " + strERP_ProductNo + ",[%TRANSTATUS%](tran_status):" + strERP_status + " [%INVALID%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir));
+ break;
+ }
+ }
+
+ if (exitTry)
+ {
+ break;
+ }
+ }
+
+ else if (dtDetail.Rows[intRow]["item_category"].Equals("M")) // 處理物料類型
+ {
+
+ // -----------------------------------------------------------
+ // 固定檢查MaterialType='MATERIL'資料,若不存在則自動新增。
+ // -----------------------------------------------------------
+ // If AddMaterialType(cnnMES, colSQL_2MES, colSQL_2MES_Rows, aryMES_Message, strMaterialType, strERPCreator, DateTime.Now, "AutoRun建立") < 0 Then Exit Try
+
+ if (aryMaterialType.IndexOf(strMaterialType) == -1)
+ {
+ if (AddMaterialType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strMaterialType, strERPCreator, DateTime.Now, "AutoRun建立") < 0)
+ {
+ exitTry2 = true;
+ break;
+ }
+ else
+ {
+ aryMaterialType.Add(strMaterialType);
+ }
+ }
+
+ // -----------------------------------------------------------
+ // 取出各欄位資料
+ // -----------------------------------------------------------
+ strERP_MaterialNo = dtDetail.Rows[intRow]["item_no"].ToString().Trim().ToUpper();
+ strErpNo = dtDetail.Rows[intRow]["item_no"].ToString().Trim(); // 記錄原始之ERP編號
+ strERP_ProductVersion = Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["item_ver"])), "1", dtDetail.Rows[intRow]["item_ver"]).ToString().Trim();
+
+ strERP_status = dtDetail.Rows[intRow]["transstatus"].ToString().Trim().ToUpper();
+ // 2022/10/19 Lena, 修正錯誤
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtDetail.Rows[intRow]["production_unit_no"], "", false)))
+ {
+ strERP_UnitNo = "N/A";
+ }
+ else // 單位有傳入才作檢查
+ {
+ string strUnitNo = dtDetail.Rows[intRow]["production_unit_no"].ToString().Trim();
+ strERP_UnitNo = dtDetail.Rows[intRow]["production_unit_no"].ToString().Trim().ToLower();
+ // -----------------------------------------------------------
+ // 檢查UnitNo資料,若不存在則自動新增。
+ // -----------------------------------------------------------
+ if (aryUnitNo.IndexOf(strERP_UnitNo) == -1)
+ {
+ if (AddUnitNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strUnitNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0)
+ {
+ exitTry2 = true;
+ break;
+ }
+ else
+ {
+ aryUnitNo.Add(strERP_UnitNo);
+ }
+ }
+
+ }
+ strERP_ItemName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["item_name"])), "N/A", dtDetail.Rows[intRow]["item_name"]));
+ strERP_SpecNo = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["specno"])), "N/A", dtDetail.Rows[intRow]["specno"]));
+
+ // 2019/07/08 Eric Mantis:59382 Lot_manage 欄位 批號管理 目前 T100 會拋轉 1,2,3 ,但是 MES 目前只有0/1 拋轉時並未轉換
+ // 0(False):不管控物料批號,系統將視物料批號為N/A。
+ // 1(True):管控物料批號,所有之進料、退料、扣料動作都必須輸入物料批號。
+ if (!string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["checklotno"])))
+ {
+ // 91087: [605][CP+FT] E10ICD整合問題_E10ICD拋轉批號查核(lot_manage)欄位值調整,MES須同步對應"是否檢查批號(CheckLotNo)"欄位
+ if (dtDetail.Rows[intRow]["checklotno"].Equals("Y") | dtDetail.Rows[intRow]["checklotno"].Equals("N"))
+ {
+ if (dtDetail.Rows[intRow]["checklotno"].Equals("Y") == true)
+ {
+ strERP_LotManage = "1";
+ }
+ else if (dtDetail.Rows[intRow]["checklotno"].Equals("N") == true)
+ {
+ strERP_LotManage = "0";
+ }
+ }
+ else
+ {
+ strERP_LotManage = "0";
+ }
+ }
+ else
+ {
+ strERP_LotManage = "0";
+ }
+
+ // 檢查是否有此物料設定
+ drChk = GetMaterialBasis(strERP_MaterialNo, cnnMES, aryMES_Message);
+ if (drChk == null)
+ {
+ exitTry2 = true;
+ break;
+ } // GoTo lblExitTry_2_NextRow 'fail
+
+ bool exitTry1 = false;
+ switch (strERP_status ?? "")
+ {
+ case "AU": // 有資料修改沒資料新增
+ {
+ if (drChk["MaterialNo"] is DBNull)
+ {
+ // 2019/10/25 Eric Mantis:60113 調整成物料自動核准
+ intIssueState = 2;
+ // -----------------------------------------------------------
+ // 物料編號合理性檢查
+ // 2019/07/22 Eric 啟用檢查
+ // -----------------------------------------------------------
+ if (ProductIntegration_ChkValid_MaterialNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0)
+ {
+ exitTry2 = exitTry1 = true;
+ break; // GoTo lblExitTry_2_NextRow
+ }
+
+ // -----------------------------------------------------------
+ // 新增MES物料設定
+ // MaterialName,MaterialSpec 必要欄位填"N/A".
+ // -----------------------------------------------------------
+ strSQLCol = "Insert Into tblMTLMaterialBasis " + "(MaterialNo, MaterialName, MaterialSpec, MaterialType," + " PutInPlace, CountWay, CheckLotNo, UnitType, UnitNo, Description," + " IssueState, Creator, CreateDate, ERPNo, QCCategory";
+ strSQLVal = ") Values('" + strERP_MaterialNo + "','" + strERP_ItemName + "','" + strERP_SpecNo + "','" + strMaterialType + "'," + intPutInPlace + "," + intCountWay + "," + strERP_LotManage + ",'" + strERP_UnitNo + "','" + strERP_UnitNo + "','AutoRun建立'," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "', 'N/A'";
+ // 2022/10/19 Lena, 修正欄位名稱的錯誤
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined01"])))
+ {
+ strSQLCol += ",User_Defined01";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined01"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined02"])))
+ {
+ strSQLCol += ",User_Defined02";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined02"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined03"])))
+ {
+ strSQLCol += ",User_Defined03";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined03"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined04"])))
+ {
+ strSQLCol += ",User_Defined04";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined04"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined05"])))
+ {
+ strSQLCol += ",User_Defined05";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined05"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined06"])))
+ {
+ strSQLCol += ",User_Defined06";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined06"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined07"])))
+ {
+ strSQLCol += ",User_Defined07";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined07"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined08"])))
+ {
+ strSQLCol += ",User_Defined08";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined08"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined09"])))
+ {
+ strSQLCol += ",User_Defined09";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined09"].ToString().Trim()), "'"));
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined10"])))
+ {
+ strSQLCol += ",User_Defined10";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined10"].ToString().Trim()), "'"));
+ }
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine11")) Then
+ // strSQLCol += ",User_Defined11"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine11").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine12")) Then
+ // strSQLCol += ",User_Defined12"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine12").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine13")) Then
+ // strSQLCol += ",User_Defined13"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine13").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine14")) Then
+ // strSQLCol += ",User_Defined14"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine14").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine15")) Then
+ // strSQLCol += ",User_Defined15"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine15").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine16")) Then
+ // strSQLCol += ",User_Defined16"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine16").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine17")) Then
+ // strSQLCol += ",User_Defined17"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine17").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine18")) Then
+ // strSQLCol += ",User_Defined18"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine18").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine19")) Then
+ // strSQLCol += ",User_Defined19"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine19").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine20")) Then
+ // strSQLCol += ",User_Defined20"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine20").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine21")) Then
+ // strSQLCol += ",User_Defined21"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine21")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine22")) Then
+ // strSQLCol += ",User_Defined22"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine22")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine23")) Then
+ // strSQLCol += ",User_Defined23"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine23")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine24")) Then
+ // strSQLCol += ",User_Defined24"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine24")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine25")) Then
+ // strSQLCol += ",User_Defined25"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine25")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine26")) Then
+ // strSQLCol += ",User_Defined26"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine26")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine27")) Then
+ // strSQLCol += ",User_Defined27"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine27")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine28")) Then
+ // strSQLCol += ",User_Defined28"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine28")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine29")) Then
+ // strSQLCol += ",User_Defined29"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine29")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine30")) Then
+ // strSQLCol += ",User_Defined30"
+ // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine30")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine31")) Then
+ // strSQLCol += ",User_Defined31"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine31").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine32")) Then
+ // strSQLCol += ",User_Defined32"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine32").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine33")) Then
+ // strSQLCol += ",User_Defined33"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine33").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine34")) Then
+ // strSQLCol += ",User_Defined34"
+ // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine34").Trim + "'"
+ // End If
+
+ // 2017-05-22, Joe, Add 圖號
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["graph_no"])))
+ {
+ strSQLCol += ",GraphNo";
+ strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["graph_no"].ToString().Trim()), "'"));
+ }
+
+ strSQL = strSQLCol + strSQLVal + ")";
+ colSQL_2MES.Add(strSQL);
+ colSQL_2MES_Rows.Add(1);
+ }
+
+ else
+ {
+ // -----------------------------------------------------------
+ // 修改MES物料設定
+ // -----------------------------------------------------------
+ // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChk["IssueState"], -1, false)))
+ {
+ intIssueState = 0;
+ }
+ else
+ {
+ intIssueState = Conversions.ToInteger(drChk["IssueState"]);
+ }
+
+ strSQL = "Update tblMTLMaterialBasis Set " + " IssueState = " + intIssueState + " , MaterialName = '" + strERP_ItemName + "', UnitType = '" + strERP_UnitNo + "', UnitNo = '" + strERP_UnitNo + "'" + ",CHECKLOTNO='" + strERP_LotManage + "',ERPNo='" + strErpNo + "' ";
+
+ // 2022/10/19 Lena, 修正欄位名稱錯誤的問題
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined01"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined01='" +
+ dtDetail.Rows[intRow]["userdefined01"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined02"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined02='" +
+ dtDetail.Rows[intRow]["userdefined02"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined03"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined03='" +
+ dtDetail.Rows[intRow]["userdefined03"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined04"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined04='" +
+ dtDetail.Rows[intRow]["userdefined04"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined05"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined05='" +
+ dtDetail.Rows[intRow]["userdefined05"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined06"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined06='" +
+ dtDetail.Rows[intRow]["userdefined06"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined07"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined07='" +
+ dtDetail.Rows[intRow]["userdefined07"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined08"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined08='" +
+ dtDetail.Rows[intRow]["userdefined08"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined09"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined09='" +
+ dtDetail.Rows[intRow]["userdefined09"].ToString().Trim() + "'");
+ }
+
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined10"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",User_Defined10='" +
+ dtDetail.Rows[intRow]["userdefined10"].ToString().Trim() + "'");
+ }
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine11")) Then
+ // strSQL += ",User_Defined11='" & dtDetail.Rows(intRow)("userdefine11").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine12")) Then
+ // strSQL += ",User_Defined12='" & dtDetail.Rows(intRow)("userdefine12").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine13")) Then
+ // strSQL += ",User_Defined13='" & dtDetail.Rows(intRow)("userdefine13").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine14")) Then
+ // strSQL += ",User_Defined14='" & dtDetail.Rows(intRow)("userdefine14").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine15")) Then
+ // strSQL += ",User_Defined15='" & dtDetail.Rows(intRow)("userdefine15").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine16")) Then
+ // strSQL += ",User_Defined16='" & dtDetail.Rows(intRow)("userdefine16").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine17")) Then
+ // strSQL += ",User_Defined17='" & dtDetail.Rows(intRow)("userdefine17").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine18")) Then
+ // strSQL += ",User_Defined18='" & dtDetail.Rows(intRow)("userdefine18").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine19")) Then
+ // strSQL += ",User_Defined19='" & dtDetail.Rows(intRow)("userdefine19").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine20")) Then
+ // strSQL += ",User_Defined20='" & dtDetail.Rows(intRow)("userdefine20").Trim & "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine21")) Then
+ // strSQL += ",User_Defined21=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine21")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine22")) Then
+ // strSQL += ",User_Defined22=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine22")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine23")) Then
+ // strSQL += ",User_Defined23=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine23")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine24")) Then
+ // strSQL += ",User_Defined24=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine24")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine25")) Then
+ // strSQL += ",User_Defined25=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine25")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine26")) Then
+ // strSQL += ",User_Defined26=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine26")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine27")) Then
+ // strSQL += ",User_Defined27=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine27")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine28")) Then
+ // strSQL += ",User_Defined28=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine28")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine29")) Then
+ // strSQL += ",User_Defined29=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine29")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine30")) Then
+ // strSQL += ",User_Defined30=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine30")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') "
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine31")) Then
+ // strSQL += ",User_Defined31='" + dtDetail.Rows(intRow)("userdefine31").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine32")) Then
+ // strSQL += ",User_Defined32='" + dtDetail.Rows(intRow)("userdefine32").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine33")) Then
+ // strSQL += ",User_Defined33='" + dtDetail.Rows(intRow)("userdefine33").Trim + "'"
+ // End If
+
+ // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine34")) Then
+ // strSQL += ",User_Defined34='" + dtDetail.Rows(intRow)("userdefine34").Trim + "'"
+ // End If
+
+ // 2017-05-22, Joe, Add 圖號
+ if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["graph_no"])))
+ {
+ strSQL = Conversions.ToString(strSQL + ",GraphNo='" +
+ dtDetail.Rows[intRow]["graph_no"].ToString().Trim() + "'");
+ }
+
+ strSQL += " Where MaterialNo='" + strERP_MaterialNo + "'";
+ colSQL_2MES.Add(strSQL);
+ colSQL_2MES_Rows.Add(1);
+ }
+
+ break;
+ }
+
+ case "D": // D:刪除
+ {
+ // 檢查是否有此物料設定
+ drChk = GetMaterialBasis(strERP_MaterialNo, cnnMES, aryMES_Message);
+ if (drChk == null)
+ {
+ exitTry2 = exitTry1 = true;
+ break;
+ } // GoTo lblExitTry_2_NextRow 'fail
+
+ if (!(drChk["MaterialNo"] is DBNull))
+ {
+ // -----------------------------------------------------------
+ // 物料編號使用狀況檢查
+ // -----------------------------------------------------------
+ if (ProductIntegration_ChkforDelMaterialNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0)
+ {
+ exitTry2 = exitTry1 = true;
+ break; // GoTo lblExitTry_2_NextRow
+ }
+
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChk["IssueState"], 0, false)))
+ {
+
+ // -----------------------------------------------------------
+ // 刪除MES物料相關設定
+ // -----------------------------------------------------------
+ if (ProductIntegration_DelMaterial(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0)
+ {
+ exitTry2 = exitTry1 = true;
+ break; // GoTo lblExitTry_2_NextRow
+ }
+ }
+
+ else
+ {
+ // -----------------------------------------------------------
+ // 作廢MES物料設定
+ // -----------------------------------------------------------
+ strSQL = "Update tblMTLMaterialBasis Set " + " IssueState=-1" + " Where MaterialNo='" + strERP_MaterialNo + "'";
+ colSQL_2MES.Add(strSQL);
+ colSQL_2MES_Rows.Add(1);
+ }
+ }
+
+ // aryMES_Message.Add(TranslateMsg("[%MATERIALNO%]item_no): " & strERP_MaterialNo & ", [%IS NOT EXIST%], [%NOT ALLOW TO DELETE%]!!"))
+ // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit;
+ else if (ProductIntegration_DelMaterial(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0)
+ {
+ exitTry2 = exitTry1 = true;
+ break; // GoTo lblExitTry_2_NextRow
+
+ }
+
+ break;
+ }
+
+ default:
+ {
+ aryMES_Message.Add(TranslateMsg("[%MATERIALNO%]item_no): " + strERP_MaterialNo + ",[%TRANSTATUS%](tran_status):" + strERP_status + " [%INVALID%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir));
+ break;
+ }
+ }
+
+ if (exitTry1)
+ {
+ break;
+ }
+
+ }
+ }
+
+ if (exitTry2)
+ {
+ break;
+
+ }
+ }
+ catch (Exception EX_drIF)
+ {
+
+ strMES_Result = "9";
+ aryMES_Message.Add("WriteProductOrMaterailBasis.Exception" + '\n' + EX_drIF.Message);
+ }
+
+ finally
+ {
+ // ===============================================================================
+ // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9).
+ // ===============================================================================
+
+ if (aryMES_Message.Count == 0)
+ {
+ strMES_Result = "1";
+
+ // --------------------------------------------------
+ // MES資料庫異動
+ // --------------------------------------------------
+ if (colSQL_2MES.Count > 0)
+ {
+ ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows);
+ }
+ }
+
+ // 組合執行錯誤字串: Chr(10)分隔
+ strMES_MESSAGE = ArrayList2String(ref aryMES_Message);
+
+ // MES_Message長度4000限制, 截取0-3996碼加"...".
+ if (strMES_MESSAGE.Length > 4000)
+ strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "...";
+
+ // ---取消前面收集SQL---
+ colSQL_2MES.Clear();
+ colSQL_2MES_Rows.Clear();
+
+ // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。
+ if (aryMES_Message.Count > 0)
+ {
+ foreach (string strErr in aryMES_Message)
+ aryReturnMessage.Add(strErr);
+ }
+ }
+ }
+ while (false);
+
+ // //return 0 : Success
+ WriteProductOrMaterailBasis_WFRet = 0;
+ }
+ catch (Exception ex)
+ {
+ aryMES_Message.Add("WriteProductOrMaterailBasis,Finally:" + ex.Message);
+
+ // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。
+ foreach (string strErr in aryMES_Message)
+ aryReturnMessage.Add(strErr);
+
+ throw;
+ }
+ finally
+ {
+ if (drTemp != null)
+ drTemp.Close();
+
+ CloseConnection(cnnMES);
+ }
+
+ return WriteProductOrMaterailBasis_WFRet;
+
+ }
+
+ private void TreatWriteLogTable_WF(Collection colResponseXML, string strType)
+ {
+ Collection colLogSQL = new Collection(), colLogSQL_Rows = new Collection();
+ string lastID = default(string), KeepLog; // 最終請求完成之id
+ ArrayList idList = new ArrayList(), arySQL = new ArrayList(), arySQLParameter = new ArrayList();
+ var CreateDate = new DateTime();
+
+ string strCode = default(string);
+ string strSql_Code = default(string);
+ string strDescription = default(string);
+ foreach (string strOutXML in colResponseXML)
+ {
+
+ XmlDoc.LoadXml(strOutXML);
+ string strKey_Condition = "";
+ string strRequest_Datetime = "";
+ chkExecutionStatus_WF(XmlDoc, ref strCode, ref strSql_Code, ref strDescription, ref strKey_Condition, ref strRequest_Datetime);
+
+ // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid")
+ // Dim strID As String = InitOPSerial()
+ XmlNode nodeID;
+ string strID = string.Empty;
+
+ try
+ {
+ XmlDoc.LoadXml(strOutXML);
+ nodeID = XmlDoc.SelectSingleNode("/response/reqid");
+ }
+ catch (Exception ex)
+ {
+ nodeID = null;
+ }
+
+ if (nodeID == null)
+ {
+ strID = Guid.NewGuid().ToString();
+ }
+ else
+ {
+ strID = nodeID.InnerText;
+ }
+
+ // KeepLog = AppSettings("keepLog")
+
+ // If (KeepLog <> "") AndAlso (IsNumeric(KeepLog)) Then
+ // '----- 清除小於保留天數的 TransactionBasis Log -----
+ // CreateDate = DateAdd(DateInterval.Day, -1 * KeepLog, DateTime.Now)
+ // colLogSQL.Add("delete from TBLERPTRANSACTIONXMLLOG_BASIS where createdate < To_Date('" & Format(CreateDate, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')")
+ // colLogSQL_Rows.Add(-1)
+ // End If
+
+ // 判斷當有LOG資料時,先刪除再新增
+ if (HaveLogData(strID))
+ {
+ colLogSQL.Add("DELETE FROM TBLERPTRANSACTIONXMLLOG_BASIS WHERE ID = '" + strID + "'");
+ colLogSQL_Rows.Add(-1);
+ }
+
+ string pData_Time = string.Empty;
+ if (!string.IsNullOrEmpty(strRequest_Datetime.ToString()))
+ {
+ pData_Time = strRequest_Datetime;
+ }
+
+ int pStatus = -1;
+
+ if (strCode.Equals("0"))
+ {
+ pStatus = 1;
+ }
+ else
+ {
+ pStatus = -1;
+ }
+
+ ComposeERPTransactionXMLLog(strID, strID, strType, strOutXML, pData_Time, pStatus, strDescription, arySQL, arySQLParameter, 1);
+ // Dim strLogSQL As String = ComposeERPTransactionXMLLog(nodeID.InnerText, nodeID.InnerText, strType, strOutXML, pData_Time, pStatus, objResponse.description)
+
+ // colLogSQL.Add(strLogSQL)
+ // colLogSQL_Rows.Add(1)
+
+ lastID = strID;
+ idList.Add(strID);
+ }
+
+ // 將所有請求之BatchID設成最終請求完成之id
+ foreach (string strID in idList)
+ {
+ if ((strID ?? "") != (lastID ?? ""))
+ {
+ colLogSQL.Add("UPDATE TBLERPTRANSACTIONXMLLOG_BASIS SET BATCHID = '" + lastID + "' WHERE ID = '" + strID + "'");
+ colLogSQL_Rows.Add(1);
+ }
+ }
+
+ // 正式寫入log table
+ if (colLogSQL.Count > 0 || arySQL.Count > 0)
+ {
+ // Call ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colLogSQL, colLogSQL_Rows)
+
+ string argstrDatabaseType = Conversions.ToString(DataBaseType);
+ Collection argCollectionSQL_Rows = null;
+ ExecuteSQLNoneQuery_CLOB_Multi(argstrDatabaseType, strConnectionString, colLogSQL, arySQL, arySQLParameter, CollectionSQL_Rows: argCollectionSQL_Rows);
+
+ }
+ }
+
+ #endregion
+
+ #region ---工單用料回拋TP ICD---
+
+ private object funWIPMaterialDeductData_TPICD(Collection colParameters = null)
+ {
+ object funWIPMaterialDeductData_TPICDRet = default(object);
+
+ var cnnTemp = default(IDbConnection);
+ string strSQL;
+
+ string strAccess = string.Empty;
+ string strParameter = string.Empty;
+ string strMaster = string.Empty;
+ string strDetail = string.Empty;
+
+ string strTempField = string.Empty;
+ string strTempRecord = string.Empty;
+
+ var arriveTime = DateTime.Now;
+
+ string strGroupNo = string.Empty; // Mail通知群組
+ string strRowCount = "500"; //拋轉ERP筆數
+ string description = string.Empty; // Response... 錯誤訊息
+ string responseValue = string.Empty; // Request/Response... 收貨單單號, 成功回傳ERP收貨單號起始~截止單號
+
+ // 2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單
+ //var ExcelExp = new Infragistics.Win.UltraWinGrid.ExcelExport.UltraGridExcelExporter();
+ //var workbook = new Infragistics.Documents.Excel.Workbook();
+
+ var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。
+ var dsTemp = new DataSet();
+
+ var datNow = DateTime.Now;
+
+ DataTable MTLDeductTemp = null;
+
+ do
+ {
+ try
+ {
+ cnnTemp = CreateConnection(strConnectionString);
+
+ // Parameter01為參數一(使用者群組), 可以不設定
+ if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))))
+ {
+ strGroupNo = colParameters["Parameter01"].ToString().Trim();
+ //若有設定, 先檢查群組合理性
+ if (!string.IsNullOrEmpty(strGroupNo) && ERP2MES_MailNoticeChk(ref cnnTemp, ref aryReturnMessage, strGroupNo) < 0)
+ {
+ funWIPMaterialDeductData_TPICDRet = Conversions.ToString("fail;" + aryReturnMessage[0]);
+ return funWIPMaterialDeductData_TPICDRet; // 離開 Function。
+ }
+ }
+
+ // 拋轉ERP筆數必須為數值型態
+ if (Information.IsNumeric(colParameters["Parameter02"]))
+ {
+ if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"]))))
+ {
+ strRowCount = colParameters["Parameter02"].ToString().Trim();
+ }
+ }
+
+
+ // ---- InXml -----
+ //
+ // 2023/08/07,Lena, 調整為取出 TipTop ICD 連線資料
+ strAccess = cbXMLAccess_TP(ERPName: "TIPTOPICD");
+
+ //
+ strTempField = "";
+ strTempRecord = cbXMLRecord_TPICD(strTempField);
+ strParameter = cbXMLParameter_TPICD(strTempRecord);
+
+ int intItemNo = 1;
+
+ // 2023/08/09,Lena, 調整為只取2和4的用料拋 ERP
+ if (strDataBaseType != "oracle")
+ {
+ strSQL = "Select TOP " + Conversions.ToInteger(strRowCount) + " * From tblWIPMaterialDeductContent Where ERPFlag = 'N' and PutInPlaceType in (2,4) Order By DeductDate";
+ }
+ else
+ {
+ strSQL = "Select A.* From (Select * From tblWIPMaterialDeductContent Where ERPFlag = 'N' and PutInPlaceType in (2,4) Order By DeductDate) A Where RowNum <= " + Conversions.ToInteger(strRowCount);
+ }
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "MTLDeduct", cnnTemp);
+
+ //目前的ERP Response
+ string strResponse = "";
+
+ if (dsTemp.Tables["MTLDeduct"].Rows.Count > 0)
+ {
+ datNow = DateTime.Now;
+
+ //
+ strTempField = "";
+ strTempRecord = cbXMLRecord_TP(strTempField);
+ strMaster = cbXMLMaster_TP("Master", strTempRecord);
+
+ MTLDeductTemp = dsTemp.Tables["MTLDeduct"].Clone();
+
+ //進行中的DataTypeNo
+ int stateType = Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[0]["DataTypeNo"]);
+
+ for (int i = 0; i < dsTemp.Tables["MTLDeduct"].Rows.Count; i++)
+ {
+ DataRow drAdd = MTLDeductTemp.NewRow();
+ foreach (DataColumn dc in MTLDeductTemp.Columns)
+ {
+ drAdd[dc.ColumnName] = dsTemp.Tables["MTLDeduct"].Rows[i][dc.ColumnName];
+ }
+ MTLDeductTemp.Rows.Add(drAdd);
+
+ //沒有下一筆 或 下一筆與本筆DataTypeNo不相符,進行組成XML拋ERP
+ if (i + 1 == dsTemp.Tables["MTLDeduct"].Rows.Count ||
+ Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i + 1]["DataTypeNo"]) != stateType)
+ {
+ if (MTLDeductTemp != null && MTLDeductTemp.Rows.Count > 0)
+ {
+ string strDataType = "";
+ switch (Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i]["DataTypeNo"]))
+ {
+ case 1: //1:物料扣料
+ strDataType = "[%MaterialDeduct%]";
+ break;
+ case 2: //2:還原物料扣料
+ strDataType = "[%UndoMaterialDeduct%]";
+ break;
+ }
+
+ //
+ strDetail = fuMaterialDeductDataToDetailContent(MTLDeductTemp, cnnTemp);
+ if (!strDetail.StartsWith(" 0)
+ {
+ strResponse = Strings.Mid(strResponse, 1, Strings.Len(strResponse) - 1);
+ }
+ }
+ dsTemp.Dispose();
+
+ //Return success
+ funWIPMaterialDeductData_TPICDRet = "success;" + strResponse + ";";
+
+ }
+
+ catch (Exception ex)
+ {
+ funWIPMaterialDeductData_TPICDRet = CombineFailMsg("0000-999999", ex.Message);
+
+ string argstrException1 = null;
+ modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WIPMaterialDeductData_TPICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), "fail", responseValue, "createasft5icd2", LogClass: "AutoRun", strException: argstrException1);
+ }
+ finally
+ {
+ try
+ {
+ if (funWIPMaterialDeductData_TPICDRet.ToString().Substring(0, 7) != "success")
+ {
+ if (dsTemp.Tables["MTLDeduct"] == null)
+ {
+ //未取出dsTemp.Tables["MTLDeduct"]表示非處理資料產生的錯誤, 以Mail內文的方式寄出
+ string argFileName = "N/A";
+ string argEmailSubject = "[AUT]" + TranslateMsg("[%FAILEDMATERIALDEDUCTCONTENTTOERP%]", strLanguageMode, strResourceDir) + "。";
+ string argEmailBody = Conversions.ToString(funWIPMaterialDeductData_TPICDRet);
+ modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo);
+ }
+ else
+ {
+ //已有取出dsTemp.Tables["MTLDeduct"]表示是處理資料產生的錯誤, 以Excel作為副檔寄送Mail
+ var dtResult = new DataTable("FailResult");
+ DataRow drAdd;
+ dtResult.Columns.Add("WOWorkDate", Type.GetType("System.String")); // 拋轉日期
+ dtResult.Columns.Add("DeductDate", Type.GetType("System.String")); // 扣料日期
+ dtResult.Columns.Add("LotSerial", Type.GetType("System.String")); // 生產批序號
+ dtResult.Columns.Add("LogGroupSerial", Type.GetType("System.String")); // 生產批在作業站的Log序號
+ dtResult.Columns.Add("DataTypeNo", Type.GetType("System.String")); // 1: 扣料 2:倒扣料
+ dtResult.Columns.Add("LotNo", Type.GetType("System.String")); // 生產批編號
+ dtResult.Columns.Add("OPNo", Type.GetType("System.String")); // 作業站編號
+ dtResult.Columns.Add("EquipmentNo", Type.GetType("System.String")); // 設備編號
+ dtResult.Columns.Add("MaterialLevel", Type.GetType("System.String")); // 物料等級
+ dtResult.Columns.Add("MaterialNo", Type.GetType("System.String")); // 物枓編號
+ dtResult.Columns.Add("MaterialLotNo", Type.GetType("System.String")); // 物枓批號
+
+ if (MTLDeductTemp != null)
+ {
+ foreach (DataRow drMTLDeduct in MTLDeductTemp.Rows)
+ {
+ drAdd = dtResult.NewRow();
+ drAdd["WOWorkDate"] = arriveTime.ToString("yyyyMMdd");
+ drAdd["DeductDate"] = Strings.Format(drMTLDeduct["DeductDate"], "yyyy/MM/dd");
+ drAdd["LotSerial"] = drMTLDeduct["LotSerial"].ToString();
+ drAdd["LogGroupSerial"] = drMTLDeduct["LogGroupSerial"].ToString();
+ drAdd["DataTypeNo"] = drMTLDeduct["DataTypeNo"].ToString();
+ drAdd["LotNo"] = drMTLDeduct["LotNo"].ToString();
+ drAdd["OPNo"] = drMTLDeduct["OPNo"].ToString();
+ drAdd["EquipmentNo"] = drMTLDeduct["EquipmentNo"].ToString();
+ drAdd["MaterialLevel"] = drMTLDeduct["MaterialLevel"].ToString();
+ drAdd["MaterialNo"] = drMTLDeduct["MaterialNo"].ToString();
+ drAdd["MaterialLotNo"] = drMTLDeduct["MaterialLotNo"].ToString();
+ dtResult.Rows.Add(drAdd);
+ }
+ }
+
+ string strFillType = "XLS";
+
+ //var iugTemp = new iMESUltraGrid.iMESUltraGridControl();
+ //iugTemp.iMESUltraGrid_InitializeLayOut += iMESUltraGrid_InitializeLayOut;
+
+ //iugTemp.Identity = "iMES";
+ //iugTemp.UserNo = "iMES";
+
+ //var memStream = new MemoryStream();
+ //讓最後一列style生效,新增空列
+ DataRow drEnd = dtResult.NewRow();
+ dtResult.Rows.Add(drEnd);
+ var dsResult = new DataSet();
+ dsResult.Tables.Add(dtResult);
+ //iugTemp.iMESUltraGrid.DataSource = dtResult;
+
+
+ // 0133391: [跨平台]AutoRunLib移除iMESUltraGrid的使用, 2023/4/21
+ String ExcelMode = strFillType.ToString().ToUpper(); //"XLSX" , "XLS"
+ byte[] membyte = modAutoRunLibrary.funExcelToByte(dsResult, ExcelMode, strLanguageMode, strResourceDir);
+ //var memStream = new MemoryStream(membyte);
+ //memStream.Seek(0L, SeekOrigin.Begin);
+
+
+ //// 將欄位翻譯
+ //if (!string.IsNullOrEmpty(modWIN.gLanguageMode))
+ //{
+ // var ColSaveControl = new Collection();
+ // ColSaveControl.Add(iugTemp.iMESUltraGrid);
+ // //ChgTranslateName(ColSaveControl, modWIN.gLanguageMode);
+ //}
+
+ //switch (strFillType.ToString().ToUpper() ?? "")
+ //{
+ // case "XLS":
+ // {
+ // // 匯出Excel再轉Stream
+ // workbook = ExcelExp.Export(iugTemp.iMESUltraGrid); // iugTemp.iMESUltraGrid, Infragistics.Documents.Excel.WorkbookFormat.Excel97To2003
+ // workbook.Save(memStream);
+ // memStream.Seek(0L, SeekOrigin.Begin);
+ // break;
+ // }
+ //}
+
+ // Stream轉成附件檔
+ //var AttachFile = new byte[(int)(memStream.Length - 1L + 1)];
+ //double count = 0d;
+ //while (count < memStream.Length)
+ //{
+ // AttachFile[(int)Math.Round(count)] = Convert.ToByte(memStream.ReadByte());
+ // count += 1d;
+ //}
+ try
+ {
+ dsResult.Dispose();
+ }
+ catch (Exception ex)
+ {
+ }
+
+ // 寄送Mail
+ string argFileName = "ErrorList.xls";
+ string argEmailSubject = "[AUT]" + TranslateMsg("[%FAILEDMATERIALDEDUCTCONTENTTOERP%]", strLanguageMode, strResourceDir) + "。";
+ string argEmailBody = Conversions.ToString(funWIPMaterialDeductData_TPICDRet);
+ modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo, membyte);
+ funWIPMaterialDeductData_TPICDRet = argEmailBody;
+ }
+ }
+ CloseConnection(cnnTemp);
+ dsTemp.Dispose();
+ }
+
+ catch (Exception ex)
+ {
+ funWIPMaterialDeductData_TPICDRet = "fail_Finally;" + ex.Message;
+ }
+ }
+ }
+ while (false);
+ return funWIPMaterialDeductData_TPICDRet;
+
+ }
+
+ private string fuMaterialDeductDataToDetailContent(DataTable MTLDeductData, IDbConnection cnnTemp)
+ {
+ string fuMaterialDeductDataToDetailContentRet = defString;
+ DbDataReader drTemp = default(DbDataReader);
+ string strSQL = "";
+ string strTempField = string.Empty;
+ string strTempRecord = string.Empty;
+ string strDetail = string.Empty;
+
+ try
+ {
+ foreach (DataRow drMTLDeduct in MTLDeductData.Rows)
+ {
+ strTempField = cbXMLField_TP("status", drMTLDeduct["DataTypeNo"].ToString()); // 1:扣料 2:倒扣料
+ strTempField += cbXMLField_TP("sfp01", ""); // 填空值
+ strTempField += cbXMLField_TP("sfp02", Strings.Format(drMTLDeduct["DeductDate"], "yyyy/MM/dd")); // 扣料日期
+ strTempField += cbXMLField_TP("sfp16", "MES"); // 申請人, 固定填MES
+
+ if (!(drMTLDeduct["MONo"] is DBNull))
+ {
+ strTempField += cbXMLField_TP("sfs03", drMTLDeduct["MONo"].ToString()); // 工單編號
+ }
+ else
+ {
+ strSQL = "Select A.MONo From tblWIPLotBasis A, tblWIPLotState B Where A.BaseLotNo = B.BaseLotNo And B.LotNo = '" + drMTLDeduct["LotNo"].ToString() + "'";
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ strTempField += cbXMLField_TP("sfs03", drTemp["MONo"].ToString()); // 工單編號
+ }
+ else
+ {
+ fuMaterialDeductDataToDetailContentRet = TranslateMsg("[%LotNo%] :" + drMTLDeduct["LotNo"].ToString() + ",[%MONONOTEXIST%]", strLanguageMode, strResourceDir);
+ return fuMaterialDeductDataToDetailContentRet;
+ }
+ drTemp.Close();
+ }
+
+ if (drMTLDeduct["MaterialLevel"].ToString() == "0")
+ {
+ strSQL = "Select ERPNo From tblMTLMaterialBasis Where IssueState = 2 And MaterialNo = '" + drMTLDeduct["MaterialNo"].ToString() + "'";
+ }
+ else
+ {
+ strSQL = "Select ERPNo From tblPRDProductBasis Where IssueState = 2 And Curversion = 1 And ProductNo = '" + drMTLDeduct["MaterialNo"].ToString() + "'";
+ }
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ if (drTemp["ERPNo"].ToString() != "")
+ {
+ strTempField += cbXMLField_TP("sfs04", drTemp["ERPNo"].ToString()); // 物料/半成品在ERP的編號
+ }
+ else
+ {
+ strTempField += cbXMLField_TP("sfs04", drMTLDeduct["MaterialNo"].ToString()); // 物料/半成品在ERP的編號, 若ERPNo沒有值, 則拋MaterialNo
+ }
+ }
+ else
+ {
+ fuMaterialDeductDataToDetailContentRet = TranslateMsg("[%MaterialNo%] :" + drMTLDeduct["MaterialNo"].ToString() + " [%IS NOT EXIST%]", strLanguageMode, strResourceDir);
+ return fuMaterialDeductDataToDetailContentRet;
+ }
+ drTemp.Close();
+
+
+ strTempField += cbXMLField_TP("sfs07", drMTLDeduct["PutinPlaceNo"].ToString()); // 扣料點編號 PutinPlaceNo
+ if (drMTLDeduct["LocatorNo"].ToString() == "N/A")
+ {
+ strTempField += cbXMLField_TP("sfs08", ""); // 儲位, 若為N/A則拋空白
+ }
+ else
+ {
+ strTempField += cbXMLField_TP("sfs08", drMTLDeduct["LocatorNo"].ToString()); // 儲位
+ }
+ strTempField += cbXMLField_TP("sfs09", drMTLDeduct["MaterialLotNo"].ToString()); // 物料批號
+ //2023/10/20,Ning,148374: IC一体化测试
+ strTempField += cbXMLField_TP("sfs10", drMTLDeduct["OPNo"].ToString()); // 作業站編號
+
+ if (drMTLDeduct["MaterialLevel"].ToString() == "0")
+ {
+ strSQL = "Select A.UnitNo, B.DefaultValue From tblMTLMaterialBasis A Left Join tblMTLMaterialProperty B On A.MaterialNo = B.Material And B.IssueState = 2 And Upper(B.PropertyNo) = 'ERPUNITNO'" +
+ " Where A.IssueState = 2 And A.MaterialNo = '" + drMTLDeduct["MaterialNo"].ToString() + "'";
+ }
+ else
+ {
+ strSQL = "Select A.UnitNo, B.DefaultValue From tblPRDProductBasis A Left Join tblPRDProductProperty B On A.ProductNo = B.ProductNo And A.ProductVersion = B.ProductVersion And B.IssueState = 2 And Upper(B.PropertyNo) = 'ERPUNITNO'" +
+ " Where A.IssueState = 2 And A.CurVersion = 1 And A.ProductNo = '" + drMTLDeduct["MaterialNo"].ToString() + "'";
+ }
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ if (drTemp["DefaultValue"].ToString() != "")
+ {
+ strTempField += cbXMLField_TP("sfs30", drTemp["DefaultValue"].ToString()); // 取物料屬性ERPUnitNo 的屬性值
+ }
+ else
+ {
+ strTempField += cbXMLField_TP("sfs30", drTemp["UnitNo"].ToString()); // 物料屬性值為空, 則物料主檔的UnitNo
+ }
+ }
+ else
+ {
+ fuMaterialDeductDataToDetailContentRet = TranslateMsg("[%MaterialNo%] :" + drMTLDeduct["MaterialNo"].ToString() + " [%IS NOT EXIST%]", strLanguageMode, strResourceDir);
+ return fuMaterialDeductDataToDetailContentRet;
+ }
+ drTemp.Close();
+
+ strTempField += cbXMLField_TP("sfs05", drMTLDeduct["DeductQty"].ToString()); //扣料數量(DeductQty)
+ strTempField += cbXMLField_TP("sfsiicd028", ""); //DateCode,填空值
+ strTempField += cbXMLField_TP("idb05", ""); //刻號,填空值
+ strTempField += cbXMLField_TP("idb06", ""); //Bin,填空值
+ strTempField += cbXMLField_TP("idb11", ""); //數量,填空值
+ strTempField += cbXMLField_TP("idb16", ""); //die數,填空值
+
+ strTempRecord += cbXMLRecord_TP(strTempField) + '\n';
+ }
+ strDetail = cbXMLDetail_TP("sfs_file", strTempRecord);
+ }
+ catch (Exception ex)
+ {
+ throw;
+ }
+ return strDetail;
+ }
+
+ private Boolean fuMaterialDeductDataThrowTPICD(string InXml, DataTable MTLDeductData, ref string responseValue, ref string description, ref DateTime arriveTime)
+ {
+ Boolean fuMaterialDeductDataThrowTPICDRet = false;
+ string OutXml = "";
+ var XmlDoc = new XmlDocument();
+
+ string code = string.Empty; // Response... code:錯誤碼;非0則為錯誤 (function回傳 success 或 fail)
+ string sqlcode = string.Empty;
+ string responseName = "rva01str";
+
+ string strSQL = "";
+ var CollectionSQL = new Collection();
+
+ try
+ {
+ arriveTime = DateTime.Now;
+ responseValue = string.Empty;
+ description = string.Empty;
+ // ----- Call ERP Web Service -----
+ using (var ws = new wsERP_TP.TIPTOPServiceGateWay())
+ {
+ ws.Url = gERPWSURL;
+ OutXml = ws.createasft5icd2(InXml);
+ }
+ XmlDoc.LoadXml(OutXml);
+
+ // ----- 取得ERP執行結果 code, sqlcode, description -----
+ chkExecutionStatus_TP(XmlDoc, ref code, ref sqlcode, ref description);
+
+ //2023/08/08,Lena, ERP 回拋的格式變更同TP
+ // ----- 取得收貨單號(起始單號~截止單號) -----
+ //chkResponseContent_TPICD(XmlDoc, responseName, ref responseValue);
+ chkResponseContent_TP(XmlDoc, responseName, ref responseValue);
+
+ if (string.IsNullOrEmpty(code) == true)
+ {
+ code = "fail";
+ }
+ else if (code == "0")
+ code = "success";
+ else
+ code = "fail";
+
+ // Edison 2019/03/22 修正log紀錄位置
+ string argstrException1 = null;
+ modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WIPMaterialDeductData_TPICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, responseValue, "createasft5icd2", LogClass: "AutoRun", strException: argstrException1);
+
+ if (code == "success")
+ {
+ foreach (DataRow drMTLDeduct in MTLDeductData.Rows)
+ {
+ strSQL = "Update tblWIPMaterialDeductContent Set ERPFlag = 'Y', ERPNo = '" + responseValue + "'" +
+ " Where LotSerial = '" + drMTLDeduct["LotSerial"].ToString() + "' And LogGroupSerial = '" + drMTLDeduct["LogGroupSerial"].ToString() + "'" +
+ " And DataTypeNo = " + drMTLDeduct["DataTypeNo"] + " And EquipmentNo = '" + drMTLDeduct["EquipmentNo"].ToString() + "'" +
+ " And MaterialLevel = " + drMTLDeduct["MaterialLevel"] + " And MaterialNo = '" + drMTLDeduct["MaterialNo"].ToString() + "' And MaterialLotNo = '" + drMTLDeduct["MaterialLotNo"].ToString() + "'" +
+ " And PutInPlaceType = " + drMTLDeduct["PutInPlaceType"];
+ CollectionSQL.Add(strSQL);
+ }
+ ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL);
+ fuMaterialDeductDataThrowTPICDRet = true;
+ }
+
+ }
+ catch (Exception ex)
+ {
+ fuMaterialDeductDataThrowTPICDRet = false;
+ throw;
+ }
+ return fuMaterialDeductDataThrowTPICDRet;
+ }
+
+ public bool chkResponseContent_TPICD(XmlDocument Xmldoc, string responseName, ref string responseValue)
+ {
+ bool chkResponseContent_TPICDRet = default(bool);
+
+ try
+ {
+ chkResponseContent_TPICDRet = false;
+
+ var de = Xmldoc.DocumentElement["ResponseContent"];
+ if (de == null == true)
+ return chkResponseContent_TPICDRet;
+
+ for (int i = 0, loopTo = de.ChildNodes.Count - 1; i <= loopTo; i++)
+ {
+ if (de.ChildNodes.Item(i).Name == "Parameter")
+ {
+ for (int j = 0, loopTo1 = de.ChildNodes.Item(i).ChildNodes.Count - 1; j <= loopTo1; j++)
+ {
+ if (de.ChildNodes.Item(i).ChildNodes[j].Name == "Field")
+ {
+ responseName = de.ChildNodes.Item(i).ChildNodes[j].Attributes["name"].Value;
+ responseValue = de.ChildNodes.Item(i).ChildNodes[j].Attributes["value"].Value;
+ }
+ }
+ }
+ }
+ chkResponseContent_TPICDRet = true;
+ }
+ catch (Exception ex)
+ {
+ chkResponseContent_TPICDRet = false;
+ }
+
+ return chkResponseContent_TPICDRet;
+ }
+
+ public string cbXMLParameter_TPICD(string strRecord)
+ {
+ string cbXMLParameter_TPICDRet = default(string);
+
+ cbXMLParameter_TPICDRet = "" + '\n';
+ cbXMLParameter_TPICDRet += strRecord + '\n';
+ return cbXMLParameter_TPICDRet;
+
+ }
+
+ public string cbXMLRecord_TPICD(string strField)
+ {
+ string cbXMLRecord_TPICDRet = default(string);
+
+ cbXMLRecord_TPICDRet = "" + '\n';
+ cbXMLRecord_TPICDRet += strField;
+ return cbXMLRecord_TPICDRet;
+
+ }
+
+ public string cbXMLRequest_TPICD(string strAccess, string strParameter, string strMaster, string strDetail)
+ {
+ string cbXMLRequest_TPICDRet = default(string);
+
+ cbXMLRequest_TPICDRet = "" + '\n';
+ cbXMLRequest_TPICDRet += strAccess + '\n';
+ cbXMLRequest_TPICDRet += "" + '\n';
+ cbXMLRequest_TPICDRet += strParameter + '\n';
+ cbXMLRequest_TPICDRet += "" + '\n';
+ cbXMLRequest_TPICDRet += "" + '\n';
+ cbXMLRequest_TPICDRet += strMaster + '\n';
+ cbXMLRequest_TPICDRet += strDetail + '\n';
+ cbXMLRequest_TPICDRet += "" + '\n';
+ cbXMLRequest_TPICDRet += "" + '\n';
+ cbXMLRequest_TPICDRet += "" + '\n';
+ cbXMLRequest_TPICDRet += "" + '\n';
+ cbXMLRequest_TPICDRet += "" + '\n';
+ cbXMLRequest_TPICDRet += "";
+
+ return cbXMLRequest_TPICDRet;
+
+ }
+
+ #endregion
+
+ #region ---工單用料回拋E10 ICD---
+
+ private object funWIPMaterialDeductData_E10ICD(Collection colParameters = null)
+ {
+ object funWIPMaterialDeductData_E10ICDRet = default(object);
+
+ var cnnTemp = default(IDbConnection);
+ string strSQL;
+
+ string strOPGroupError = defString;
+
+ string strCDOError = defString;
+
+ string RequestKey = "";
+
+ string strGroupNo = string.Empty; //Mail通知群組
+ string strRowCount = "500"; //拋轉ERP筆數
+ string strMaterialOut = string.Empty; //領料單單別
+ string strMaterialReturn = string.Empty; //退料單單別
+
+ var arriveTime = DateTime.Now;
+ string description = string.Empty; // Response... 錯誤訊息
+ string responseValue = string.Empty; // Request/Response... 退料單號, 成功回傳ERP退料單號
+
+ var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。
+ var dsTemp = new DataSet();
+
+ DataTable MTLDeductTemp = null;
+ DataRow[] OPGroupMTLDeduct = null;
+
+ do
+ {
+ try
+ {
+ cnnTemp = CreateConnection(strConnectionString);
+
+ //Parameter01:使用者群組,此功能fail時EMAIL通知群組。
+ //Parameter02:拋轉ERP筆數,一次拋給 ERP 的生產批報工用料筆數,預設500筆。
+ //Parameter03:ERP的領料單單別。
+ //Parameter04:ERP的退料單單別。
+
+ // Parameter01:使用者群組, 可以不設定
+ if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))))
+ {
+ strGroupNo = colParameters["Parameter01"].ToString().Trim();
+ //若有設定, 先檢查群組合理性
+ if (!string.IsNullOrEmpty(strGroupNo) && ERP2MES_MailNoticeChk(ref cnnTemp, ref aryReturnMessage, strGroupNo) < 0)
+ {
+ funWIPMaterialDeductData_E10ICDRet = Conversions.ToString("fail;" + aryReturnMessage[0]);
+ return funWIPMaterialDeductData_E10ICDRet; // 離開 Function。
+ }
+ }
+
+ // Parameter02:拋轉ERP筆數必須為數值型態
+ if (Information.IsNumeric(colParameters["Parameter02"]))
+ {
+ if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"]))))
+ {
+ strRowCount = colParameters["Parameter02"].ToString().Trim();
+ }
+ }
+
+ // Parameter03:ERP的領料單單別,若未設定參數值,則回拋錯誤並結束此次作業
+ if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"]))))
+ {
+ strMaterialOut = colParameters["Parameter03"].ToString().Trim();
+ }
+ else
+ {
+ funWIPMaterialDeductData_E10ICDRet = TranslateMsg("[%MATERIALOUTSHEETTYPE%][%NOT SET%]!!", strLanguageMode, strResourceDir);
+ return funWIPMaterialDeductData_E10ICDRet;
+ }
+
+ // Parameter04:ERP的退料單單別,若未設定參數值,則回拋錯誤並結束此次作業
+ if (!(colParameters["Parameter04"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter04"]))))
+ {
+ strMaterialReturn = colParameters["Parameter04"].ToString().Trim();
+ }
+ else
+ {
+ funWIPMaterialDeductData_E10ICDRet = TranslateMsg("[%MATERIALRETURNSHEETTYPE%][%NOT SET%]!!", strLanguageMode, strResourceDir);
+ return funWIPMaterialDeductData_E10ICDRet;
+ }
+
+ // ---- InXml -----
+ // 取得ERP資訊
+ try
+ {
+ if (!GetERPSetting(ref dtERPSetting, "E10ICD", pEAIType: 1, pActiveERP: 1))
+ {
+ if (!GetERPSetting(ref dtERPSetting, "E10ICD", pEAIType: 1))
+ {
+ funWIPMaterialDeductData_E10ICDRet = TranslateMsg("[%ERPWSURL%][%not found%]!", strLanguageMode, strResourceDir);
+ return funWIPMaterialDeductData_E10ICDRet;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ if (!GetERPSetting(ref dtERPSetting, "E10ICD", pEAIType: 1))
+ {
+ funWIPMaterialDeductData_E10ICDRet = TranslateMsg("[%ERPWSURL%][%not found%]!", strLanguageMode, strResourceDir);
+ return funWIPMaterialDeductData_E10ICDRet;
+ }
+ }
+
+ // 2023/08/09,Lena, 調整為只取2和4的用料拋 ERP
+ if (strDataBaseType != "oracle")
+ {
+ strSQL = "Select TOP " + Conversions.ToInteger(strRowCount) + " * From tblWIPMaterialDeductContent Where ERPFlag = 'N' and PutInPlaceType in (2,4) Order By DeductDate";
+ }
+ else
+ {
+ strSQL = "Select A.* From (Select * From tblWIPMaterialDeductContent Where ERPFlag = 'N' and PutInPlaceType in (2,4) Order By DeductDate) A Where RowNum <= " + Conversions.ToInteger(strRowCount);
+ }
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "MTLDeduct", cnnTemp);
+
+ //目前的ERP Response
+ string strResponse = "";
+
+ if (dsTemp.Tables["MTLDeduct"].Rows.Count > 0)
+ {
+ arriveTime = DateTime.Now;
+
+ MTLDeductTemp = dsTemp.Tables["MTLDeduct"].Clone();
+
+ //進行中的DataTypeNo
+ int stateType = Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[0]["DataTypeNo"]);
+
+ for (int i = 0; i < dsTemp.Tables["MTLDeduct"].Rows.Count; i++)
+ {
+ DataRow drAdd = MTLDeductTemp.NewRow();
+ foreach (DataColumn dc in MTLDeductTemp.Columns)
+ {
+ drAdd[dc.ColumnName] = dsTemp.Tables["MTLDeduct"].Rows[i][dc.ColumnName];
+ }
+ MTLDeductTemp.Rows.Add(drAdd);
+
+ //沒有下一筆 或 下一筆與本筆DataTypeNo不相符,進行組成XML拋ERP
+ if (i + 1 == dsTemp.Tables["MTLDeduct"].Rows.Count ||
+ Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i + 1]["DataTypeNo"]) != stateType)
+ {
+ if (MTLDeductTemp != null && MTLDeductTemp.Rows.Count > 0)
+ {
+ int DataTypeNo = Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i]["DataTypeNo"]);
+ string SheetType = "";
+ string strErrorDataType = "";
+ switch (DataTypeNo)
+ {
+ case 1: //1:物料扣料
+ SheetType = strMaterialOut; //領料單單別
+ strErrorDataType = "[%MaterialDeduct%]";
+ break;
+ case 2: //2:還原物料扣料
+ SheetType = strMaterialReturn; //退料單單別
+ strErrorDataType = "[%UndoMaterialDeduct%]";
+ break;
+ }
+
+ //得到作業站群組
+ HashSet OPGroupHs = new HashSet();
+ DataTable OPGroupMTLDeductTemp = MTLDeductTemp.Copy();
+ strOPGroupError = fuGetOPGroupNoAndOPGroups(ref OPGroupHs, ref OPGroupMTLDeductTemp, cnnTemp);
+ if (strOPGroupError != defString)
+ {
+ funWIPMaterialDeductData_E10ICDRet = TranslateMsg(strErrorDataType + strOPGroupError, strLanguageMode, strResourceDir);
+ return funWIPMaterialDeductData_E10ICDRet;
+ }
+
+ foreach (string OPGroupNo in OPGroupHs)
+ {
+ //作業站群組的用料
+ OPGroupMTLDeduct = OPGroupMTLDeductTemp.Select("OPGroupNo= '" + OPGroupNo + "'");
+
+ if (OPGroupMTLDeduct != null && OPGroupMTLDeduct.Length > 0)
+ {
+ // CDO object
+ var objERPrequest = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_issue_wo_inverted();
+ strCDOError = fuMaterialDeductDataToCDOobject(DataTypeNo, SheetType, OPGroupNo, OPGroupMTLDeduct, ref objERPrequest, ref arriveTime, cnnTemp);
+ if (strCDOError != defString)
+ {
+ funWIPMaterialDeductData_E10ICDRet = TranslateMsg(strErrorDataType + strCDOError, strLanguageMode, strResourceDir);
+ return funWIPMaterialDeductData_E10ICDRet;
+ }
+
+ object argCDO_Object = objERPrequest;
+ InXml = "";
+ InXml = CombineRequestXMLbyCDO(ref argCDO_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "issue.wo.inverted.e10icd", pRequestKey: RequestKey);
+ objERPrequest = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_issue_wo_inverted)argCDO_Object;
+
+ // ----- Call ERP Web Service -----
+ if (!fuMaterialDeductDataThrowE10ICD(InXml, OPGroupMTLDeduct, ref responseValue, ref description, ref arriveTime))
+ {
+ funWIPMaterialDeductData_E10ICDRet = TranslateMsg("fail;" + strErrorDataType + " [%ERP Return Message%]:" + description, strLanguageMode, strResourceDir);
+ return funWIPMaterialDeductData_E10ICDRet;
+ }
+ else
+ {
+ //ERP成功單號
+ strResponse += responseValue + ",";
+ }
+
+ //清除已拋ERP扣料資料
+ OPGroupMTLDeduct = null;
+ }
+ }
+
+ if (i + 1 != dsTemp.Tables["MTLDeduct"].Rows.Count)
+ {
+ //更新進行中的DataTypeNo
+ stateType = Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i + 1]["DataTypeNo"]);
+ }
+ //清除已拋ERP扣料資料
+ MTLDeductTemp.Clear();
+ }
+ }
+ }
+ if (strResponse.Length > 0)
+ {
+ strResponse = Strings.Mid(strResponse, 1, Strings.Len(strResponse) - 1);
+ }
+ }
+ dsTemp.Dispose();
+
+ //Return success
+ funWIPMaterialDeductData_E10ICDRet = "success;" + strResponse + ";";
+
+ }
+
+ catch (Exception ex)
+ {
+ funWIPMaterialDeductData_E10ICDRet = CombineFailMsg("0000-999999", ex.Message);
+
+ string argstrException1 = null;
+ modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WIPMaterialDeductData_E10ICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), "fail", responseValue, "issue.wo.inverted.e10icd", LogClass: "AutoRun", strException: argstrException1);
+ }
+ finally
+ {
+ try
+ {
+ if (funWIPMaterialDeductData_E10ICDRet.ToString().Substring(0, 7) != "success")
+ {
+ if (dsTemp.Tables["MTLDeduct"] == null)
+ {
+ //未取出dsTemp.Tables["MTLDeduct"]表示非處理資料產生的錯誤, 以Mail內文的方式寄出
+ string argFileName = "N/A";
+ string argEmailSubject = "[AUT]"+ TranslateMsg("[%FAILEDMATERIALDEDUCTCONTENTTOERP%]", strLanguageMode, strResourceDir)+"。";
+ string argEmailBody = Conversions.ToString(funWIPMaterialDeductData_E10ICDRet);
+ modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo);
+ }
+ else
+ {
+ //已有取出dsTemp.Tables["MTLDeduct"]表示是處理資料產生的錯誤, 以Excel作為副檔寄送Mail
+ var dtResult = new DataTable("FailResult");
+ DataRow drAdd;
+ dtResult.Columns.Add("WOWorkDate", Type.GetType("System.String")); // 拋轉日期
+ dtResult.Columns.Add("DeductDate", Type.GetType("System.String")); // 扣料日期
+ dtResult.Columns.Add("LotSerial", Type.GetType("System.String")); // 生產批序號
+ dtResult.Columns.Add("LogGroupSerial", Type.GetType("System.String")); // 生產批在作業站的Log序號
+ dtResult.Columns.Add("DataTypeNo", Type.GetType("System.String")); // 1: 扣料 2:倒扣料
+ dtResult.Columns.Add("LotNo", Type.GetType("System.String")); // 生產批編號
+ dtResult.Columns.Add("OPNo", Type.GetType("System.String")); // 作業站編號
+ dtResult.Columns.Add("EquipmentNo", Type.GetType("System.String")); // 設備編號
+ dtResult.Columns.Add("MaterialLevel", Type.GetType("System.String")); // 物料等級
+ dtResult.Columns.Add("MaterialNo", Type.GetType("System.String")); // 物枓編號
+ dtResult.Columns.Add("MaterialLotNo", Type.GetType("System.String")); // 物枓批號
+
+ DataRow[] MTLDataTemp = null;
+ if (OPGroupMTLDeduct != null)
+ {
+ MTLDataTemp = OPGroupMTLDeduct;
+ }
+ else if (MTLDeductTemp != null)
+ {
+ MTLDataTemp = MTLDeductTemp.Select();
+ }
+ else
+ {
+ MTLDataTemp = dsTemp.Tables["MTLDeduct"].Select();
+ }
+
+ if (MTLDataTemp != null)
+ {
+ foreach (DataRow drMTLDeduct in MTLDataTemp)
+ {
+ drAdd = dtResult.NewRow();
+ drAdd["WOWorkDate"] = arriveTime.ToString("yyyyMMdd");
+ drAdd["DeductDate"] = Strings.Format(drMTLDeduct["DeductDate"], "yyyy/MM/dd");
+ drAdd["LotSerial"] = drMTLDeduct["LotSerial"].ToString();
+ drAdd["LogGroupSerial"] = drMTLDeduct["LogGroupSerial"].ToString();
+ drAdd["DataTypeNo"] = drMTLDeduct["DataTypeNo"].ToString();
+ drAdd["LotNo"] = drMTLDeduct["LotNo"].ToString();
+ drAdd["OPNo"] = drMTLDeduct["OPNo"].ToString();
+ drAdd["EquipmentNo"] = drMTLDeduct["EquipmentNo"].ToString();
+ drAdd["MaterialLevel"] = drMTLDeduct["MaterialLevel"].ToString();
+ drAdd["MaterialNo"] = drMTLDeduct["MaterialNo"].ToString();
+ drAdd["MaterialLotNo"] = drMTLDeduct["MaterialLotNo"].ToString();
+ dtResult.Rows.Add(drAdd);
+ }
+ }
+
+ string strFillType = "XLS";
+
+ //讓最後一列style生效,新增空列
+ DataRow drEnd = dtResult.NewRow();
+ dtResult.Rows.Add(drEnd);
+ var dsResult = new DataSet();
+ dsResult.Tables.Add(dtResult);
+
+ // 0133391: [跨平台]AutoRunLib移除iMESUltraGrid的使用, 2023/4/21
+ String ExcelMode = strFillType.ToString().ToUpper(); //"XLSX" , "XLS"
+ byte[] membyte = modAutoRunLibrary.funExcelToByte(dsResult, ExcelMode, strLanguageMode, strResourceDir);
+
+ try
+ {
+ dsResult.Dispose();
+ }
+ catch (Exception ex)
+ {
+ }
+
+ // 寄送Mail
+ string argFileName = "ErrorList.xls";
+ string argEmailSubject = "[AUT]"+ TranslateMsg("[%FAILEDMATERIALDEDUCTCONTENTTOERP%]", strLanguageMode, strResourceDir) + "。";
+ string argEmailBody = Conversions.ToString(funWIPMaterialDeductData_E10ICDRet);
+ modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo, membyte);
+ funWIPMaterialDeductData_E10ICDRet = argEmailBody;
+ }
+ }
+ CloseConnection(cnnTemp);
+ dsTemp.Dispose();
+ }
+
+ catch (Exception ex)
+ {
+ funWIPMaterialDeductData_E10ICDRet = "fail_Finally;" + ex.Message;
+ }
+ }
+ }
+ while (false);
+ return funWIPMaterialDeductData_E10ICDRet;
+ }
+
+ private string fuGetOPGroupNoAndOPGroups(ref HashSet OPGroupHs, ref DataTable MTLDeductDataTemp, IDbConnection cnnTemp)
+ {
+ string fuGetOPGroupNoAndOPGroupsRet = defString;
+ DbDataReader drTemp = default(DbDataReader);
+ string strSQL = "";
+
+ try
+ {
+ if (!MTLDeductDataTemp.Columns.Contains("OPGroupNo"))
+ {
+ MTLDeductDataTemp.Columns.Add("OPGroupNo", Type.GetType("System.String")); //作業站群組
+ }
+
+ foreach (DataRow drMTLDeduct in MTLDeductDataTemp.Rows)
+ {
+ strSQL = "Select OPGroupNo,OPNo From tblOPGroupDetail Where OPNo = '" + drMTLDeduct["OPNo"] + "'";
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ drMTLDeduct["OPGroupNo"] = drTemp["OPGroupNo"].ToString();
+ OPGroupHs.Add(drTemp["OPGroupNo"].ToString());
+ }
+ else
+ {
+ fuGetOPGroupNoAndOPGroupsRet = TranslateMsg("[%OPNo%] :" + drMTLDeduct["OPNo"].ToString() + ",[%OPGROUPNO%][%IS NOT EXIST%]", strLanguageMode, strResourceDir);
+ return fuGetOPGroupNoAndOPGroupsRet;
+ }
+ drTemp.Close();
+ }
+ }
+ catch (Exception ex)
+ {
+ throw;
+ }
+ return fuGetOPGroupNoAndOPGroupsRet;
+ }
+
+ private string fuMaterialDeductDataToCDOobject(int DataTypeNo, string SheetType, string OPGroupNo, DataRow[] OPGroupMTLDeduct, ref iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_issue_wo_inverted objERPrequest, ref DateTime arriveTime, IDbConnection cnnTemp)
+ {
+ string fuMaterialDeductDataToCDOobjectRet = defString;
+ DbDataReader drTemp = default(DbDataReader);
+ string strSQL = "";
+
+ var objERPrequest_Detail = new List();
+
+ try
+ {
+ arriveTime = DateTime.Now;
+ //Master
+ objERPrequest.doc_type_no = SheetType; //單別
+ objERPrequest.doc_no = ""; //單據編號,填空值
+ objERPrequest.create_date = Strings.Format(arriveTime, "yyyyMMdd"); //單據時間,目前時間
+ //DataTypeNo= 1:物料扣料,2:還原物料扣料
+ objERPrequest.status = (DataTypeNo == 2) ? "3" : Conversions.ToString(DataTypeNo); //1:扣料(發料)、3:倒扣料(退料)
+ objERPrequest.remark = ""; //備註,填空值
+ objERPrequest.applicant_no = ""; //領退料人員,填空值
+ objERPrequest.workstation_no = OPGroupNo; //作業站群組
+
+ //Detail
+ for (int i = 0; i < OPGroupMTLDeduct.Length; i++)
+ {
+ var objDetail = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_detail_issue_wo_inverted();
+
+ objDetail.seq = Conversions.ToString(i + 1); //序號,從1開始的流水號
+
+ //工單編號
+ if (!(OPGroupMTLDeduct[i]["MONo"] is DBNull))
+ {
+ objDetail.wo_no = OPGroupMTLDeduct[i]["MONo"].ToString(); //工單單號
+ }
+ else
+ {
+ strSQL = "Select A.MONo From tblWIPLotBasis A, tblWIPLotState B Where A.BaseLotNo = B.BaseLotNo And B.LotNo = '" + OPGroupMTLDeduct[i]["LotNo"].ToString() + "'";
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ objDetail.wo_no = drTemp["MONo"].ToString(); // 工單編號
+ }
+ else
+ {
+ fuMaterialDeductDataToCDOobjectRet = TranslateMsg("[%LotNo%] :" + OPGroupMTLDeduct[i]["LotNo"].ToString() + ",[%MONONOTEXIST%]", strLanguageMode, strResourceDir);
+ return fuMaterialDeductDataToCDOobjectRet;
+ }
+ drTemp.Close();
+ }
+
+ //物料編號
+ if (OPGroupMTLDeduct[i]["MaterialLevel"].ToString() == "0")
+ {
+ strSQL = "Select ERPNo From tblMTLMaterialBasis Where IssueState = 2 And MaterialNo = '" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + "'";
+ }
+ else
+ {
+ strSQL = "Select ERPNo From tblPRDProductBasis Where IssueState = 2 And Curversion = 1 And ProductNo = '" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + "'";
+ }
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ if (drTemp["ERPNo"].ToString() != "")
+ {
+ objDetail.item_no = drTemp["ERPNo"].ToString(); //物料/半成品在ERP的編號
+ }
+ else
+ {
+ objDetail.item_no = OPGroupMTLDeduct[i]["MaterialNo"].ToString(); //物料/半成品在ERP的編號,若ERPNo沒有值,則拋MaterialNo
+ }
+ }
+ else
+ {
+ fuMaterialDeductDataToCDOobjectRet = TranslateMsg("[%MaterialNo%] :" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + " [%IS NOT EXIST%]", strLanguageMode, strResourceDir);
+ return fuMaterialDeductDataToCDOobjectRet;
+ }
+ drTemp.Close();
+
+ objDetail.qty = OPGroupMTLDeduct[i]["DeductQty"].ToString(); //扣料數量
+
+ //物料單位
+ if (OPGroupMTLDeduct[i]["MaterialLevel"].ToString() == "0")
+ {
+ strSQL = "Select A.UnitNo, B.DefaultValue From tblMTLMaterialBasis A Left Join tblMTLMaterialProperty B On A.MaterialNo = B.Material And B.IssueState = 2 And Upper(B.PropertyNo) = 'ERPUNITNO'" +
+ " Where A.IssueState = 2 And A.MaterialNo = '" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + "'";
+ }
+ else
+ {
+ strSQL = "Select A.UnitNo, B.DefaultValue From tblPRDProductBasis A Left Join tblPRDProductProperty B On A.ProductNo = B.ProductNo And A.ProductVersion = B.ProductVersion And B.IssueState = 2 And Upper(B.PropertyNo) = 'ERPUNITNO'" +
+ " Where A.IssueState = 2 And A.CurVersion = 1 And A.ProductNo = '" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + "'";
+ }
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ if (drTemp["DefaultValue"].ToString() != "")
+ {
+ objDetail.unit_no = drTemp["DefaultValue"].ToString(); //取物料屬性ERPUnitNo 的屬性值
+ }
+ else
+ {
+ objDetail.unit_no = drTemp["UnitNo"].ToString(); //物料屬性值為空,則物料主檔的UnitNo
+ }
+ }
+ else
+ {
+ fuMaterialDeductDataToCDOobjectRet = TranslateMsg("[%MaterialNo%] :" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + " [%IS NOT EXIST%]", strLanguageMode, strResourceDir);
+ return fuMaterialDeductDataToCDOobjectRet;
+ }
+ drTemp.Close();
+
+ objDetail.item_type = ""; //物料等級,填空值
+ objDetail.input_datetime = Strings.Format(OPGroupMTLDeduct[i]["DeductDate"], "yyyyMMdd"); //扣料日期
+ objDetail.warehouse_no = OPGroupMTLDeduct[i]["PutinPlaceNo"].ToString(); //扣料點編號
+
+ //儲位
+ if (OPGroupMTLDeduct[i]["LocatorNo"].ToString() == "N/A")
+ {
+ objDetail.location_no = ""; //儲位,若為N/A則拋空白
+ }
+ else
+ {
+ objDetail.location_no = OPGroupMTLDeduct[i]["LocatorNo"].ToString(); //儲位
+ }
+
+ objDetail.lot_no = OPGroupMTLDeduct[i]["MaterialLotNo"].ToString(); //物料批號
+ objDetail.expiry_date = ""; //有效日期,填空值
+ objDetail.item_feature_no = ""; //物徵碼,填空值
+ objDetail.remark = ""; //備註,填空值
+ objDetail.positive_negative = ""; //正負,填空值
+ objDetail.replaced_item_no = ""; //被替代的物料編號,若未傳入則以物料編號為默認值,填空值
+ objDetail.replaced_qty = ""; //被替代的物料數量,填空值
+ objDetail.replaced_type = ""; //替代料等級,填空值
+ objDetail.issue_to_type = "3"; //3:MO (工單,Default)
+ objDetail.sub_type = "0"; //0:主料 1:取代 2:替代
+ objDetail.replaced_item_feature_no = ""; //替代品號特徵碼,填空值
+ objDetail.op_no = OPGroupMTLDeduct[i]["OPNo"].ToString(); //作業站編號
+
+ objERPrequest_Detail.Add(objDetail);
+ }
+ objERPrequest.wo_item_detail = objERPrequest_Detail;
+ }
+ catch (Exception ex)
+ {
+ throw;
+ }
+ return fuMaterialDeductDataToCDOobjectRet;
+ }
+
+ private Boolean fuMaterialDeductDataThrowE10ICD(string InXml, DataRow[] OPGroupMTLDeduct, ref string responseValue, ref string description, ref DateTime arriveTime)
+ {
+ Boolean fuMaterialDeductDataThrowE10ICDRet = false;
+ string OutXml = "";
+ var objERPresponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_issue_wo_inverted();
+
+ string code = string.Empty; // Response... code:錯誤碼;非0則為錯誤 (function回傳 success 或 fail)
+
+ string strSQL = "";
+ var CollectionSQL = new Collection();
+
+ try
+ {
+ arriveTime = DateTime.Now;
+ responseValue = string.Empty;
+ description = string.Empty;
+ // ----- Call ERP Web Service -----
+ using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry())
+ {
+ ws.Url = ERP_URL;
+ OutXml = ws.invokeSrv(InXml);
+ }
+
+ objERPresponse.ParseXmlToObject(OutXml);
+ // ----- 取得ERP執行結果 code,responseValue,description -----
+ code = objERPresponse.code;
+ responseValue = objERPresponse.return_no;
+ description = objERPresponse.description;
+
+ if (string.IsNullOrEmpty(code) == true)
+ {
+ code = "fail";
+ }
+ else if (code == "0")
+ code = "success";
+ else
+ code = "fail";
+
+ // Edison 2019/03/22 修正log紀錄位置
+ string argstrException1 = null;
+ modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WIPMaterialDeductData_E10ICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, responseValue, "issue.wo.inverted.e10icd", LogClass: "AutoRun", strException: argstrException1);
+
+ if (code == "success")
+ {
+ foreach (DataRow drMTLDeduct in OPGroupMTLDeduct)
+ {
+ strSQL = "Update tblWIPMaterialDeductContent Set ERPFlag = 'Y', ERPNo = '" + responseValue + "'" +
+ " Where LotSerial = '" + drMTLDeduct["LotSerial"].ToString() + "' And LogGroupSerial = '" + drMTLDeduct["LogGroupSerial"].ToString() + "'" +
+ " And DataTypeNo = " + drMTLDeduct["DataTypeNo"] + " And EquipmentNo = '" + drMTLDeduct["EquipmentNo"].ToString() + "'" +
+ " And MaterialLevel = " + drMTLDeduct["MaterialLevel"] + " And MaterialNo = '" + drMTLDeduct["MaterialNo"].ToString() + "' And MaterialLotNo = '" + drMTLDeduct["MaterialLotNo"].ToString() + "'" +
+ " And PutInPlaceType = " + drMTLDeduct["PutInPlaceType"];
+ CollectionSQL.Add(strSQL);
+ }
+ ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL);
+ fuMaterialDeductDataThrowE10ICDRet = true;
+ }
+
+ }
+ catch (Exception ex)
+ {
+ fuMaterialDeductDataThrowE10ICDRet = false;
+ throw;
+ }
+ return fuMaterialDeductDataThrowE10ICDRet;
+ }
+
+ #endregion
+
+ #region 工单自动结单
+ private object funProcessERPPendingTrans(Collection colParameters = null)
+ {
+ object funProcessERPPendingTransRet = default(object);
+
+ var cnnTemp = default(IDbConnection);
+ string strSQL;
+
+ string strAccess = string.Empty;
+ string strParameter = string.Empty;
+ string strMaster = string.Empty;
+ string strDetail = string.Empty;
+
+ string strTempField = string.Empty;
+ string strTempRecord = string.Empty;
+
+ var arriveTime = DateTime.Now;
+
+ string strGroupNo = string.Empty; // Mail通知群組
+ string strERPName = string.Empty; //设定的ERP名称
+ string closeMORet = string.Empty; // Request/Response... 收貨單單號, 成功回傳ERP收貨單號起始~截止單號
+
+ // 2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單
+ //var ExcelExp = new Infragistics.Win.UltraWinGrid.ExcelExport.UltraGridExcelExporter();
+ //var workbook = new Infragistics.Documents.Excel.Workbook();
+
+ var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。
+ var dsTemp = new DataSet();
+
+ var datNow = DateTime.Now;
+
+ var dtResult = new DataTable("FailResult");
+ DataRow drAdd;
+
+ do
+ {
+ try
+ {
+ cnnTemp = CreateConnection(strConnectionString);
+
+ dtResult.Columns.Add("TransactionID", Type.GetType("System.String")); // 交易編號
+ dtResult.Columns.Add("TransactionType", Type.GetType("System.String")); // 交易類型
+ dtResult.Columns.Add("TicketNo", Type.GetType("System.String")); // 單據編號
+ dtResult.Columns.Add("ERPType", Type.GetType("System.String")); // ERP類型
+ dtResult.Columns.Add("Creator", Type.GetType("System.String")); // 建立人
+ dtResult.Columns.Add("CreateDate", Type.GetType("System.String")); // 建立日
+ dtResult.Columns.Add("FailReason", Type.GetType("System.String")); // 錯誤訊息
+
+ // Parameter01為參數一(使用者群組), 可以不設定
+ if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))))
+ {
+ strGroupNo = colParameters["Parameter01"].ToString().Trim();
+ //若有設定, 先檢查群組合理性
+ if (!string.IsNullOrEmpty(strGroupNo) && ERP2MES_MailNoticeChk(ref cnnTemp, ref aryReturnMessage, strGroupNo) < 0)
+ {
+ funProcessERPPendingTransRet = Conversions.ToString("fail;" + aryReturnMessage[0]);
+ goto exitfun;
+ }
+ }
+
+ //查询系统当前设置的ERP系统名称,只有workflow才會執行此自動結單功能
+ strSQL = "select ERP_NAME from TBLSYSERPSETTING where ACTIVEERP = 1";
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ERPName", cnnTemp);
+ if (dsTemp.Tables["ERPName"].Rows.Count > 0)
+ {
+ strERPName = dsTemp.Tables["ERPName"].Rows[0]["ERP_NAME"].ToString().Trim();
+ }
+ if (strERPName != "Workflow")
+ {
+ funProcessERPPendingTransRet = Conversions.ToString("fail;" + TranslateMsg("ERP[%IS NOT%]WorkFlow,[%NOTALLOWTOUSEFUNCTION%]", strLanguageMode, strResourceDir));
+ goto exitfun;
+ }
+
+ //查询出tblERPPendingTrans表中数据并处理工单结案
+ strSQL = " select * from tblERPPendingTrans order by CreateDate ";
+ ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ERPPending", cnnTemp);
+ for (int i = 0; i < dsTemp.Tables["ERPPending"].Rows.Count; i++)
+ {
+ string ERPType = string.Empty;
+ string transactionType = string.Empty;
+ ERPType = dsTemp.Tables["ERPPending"].Rows[i]["ERPType"].ToString();
+ transactionType = dsTemp.Tables["ERPPending"].Rows[i]["TransactionType"].ToString();
+ if (ERPType == "TP" && transactionType == "1")
+ {
+ try
+ {
+ closeMORet = funMOPendingClose(dsTemp.Tables["ERPPending"].Rows[i]["TicketNo"].ToString());
+ }
+ catch (Exception ex)
+ {
+ closeMORet = ex.Message;
+ }
+ if (closeMORet != "success")
+ {
+ drAdd = dtResult.NewRow();
+ drAdd["TransactionID"] = dsTemp.Tables["ERPPending"].Rows[i]["TransactionID"].ToString();
+ drAdd["TransactionType"] = dsTemp.Tables["ERPPending"].Rows[i]["TransactionType"].ToString();
+ drAdd["TicketNo"] = dsTemp.Tables["ERPPending"].Rows[i]["TicketNo"].ToString();
+ drAdd["ERPType"] = dsTemp.Tables["ERPPending"].Rows[i]["ERPType"].ToString();
+ drAdd["Creator"] = dsTemp.Tables["ERPPending"].Rows[i]["Creator"].ToString();
+ drAdd["CreateDate"] = Strings.Format(dsTemp.Tables["ERPPending"].Rows[i]["CreateDate"], "yyyy/MM/dd HH:mm:ss");
+ drAdd["FailReason"] = closeMORet;
+ dtResult.Rows.Add(drAdd);
+ }
+ }
+ }
+ if (dtResult.Rows.Count > 0)
+ {
+ funProcessERPPendingTransRet = "fail;";
+ foreach (DataRow r in dtResult.Rows)
+ funProcessERPPendingTransRet += Conversions.ToString(TranslateMsg("[%TransactionID%]: " + r["TransactionID"].ToString() +
+ ", [%TicketNo%]: " + r["TicketNo"].ToString() + ", " +
+ r["FailReason"].ToString() + "\r\n", strLanguageMode, strResourceDir));
+ goto exitfun;
+ }
+ funProcessERPPendingTransRet = "success";
+ exitfun:;
+ }
+
+ catch (Exception ex)
+ {
+ funProcessERPPendingTransRet = Conversions.ToString("fail;" + ex.Message);
+ }
+ finally
+ {
+ try
+ {
+ if (strGroupNo != string.Empty)
+ {
+ if (funProcessERPPendingTransRet.ToString().Substring(0, 7) != "success" || dtResult.Rows.Count > 0)
+ {
+ if (dtResult.Rows.Count == 0)
+ {
+ //未取出dsTemp.Tables["MTLDeduct"]表示非處理資料產生的錯誤, 以Mail內文的方式寄出
+ string argFileName = "N/A";
+ string argEmailSubject = "[AUT]" + TranslateMsg("[%PROCESSINGERPPENDINGTRANSFAIL%]", strLanguageMode, strResourceDir);
+ string argEmailBody = Conversions.ToString(funProcessERPPendingTransRet);
+ modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo);
+ }
+ else
+ {
+ //已有取出dsTemp.Tables["MTLDeduct"]表示是處理資料產生的錯誤, 以Excel作為副檔寄送Mail
+ string strFillType = "XLS";
+ //讓最後一列style生效,新增空列
+ DataRow drEnd = dtResult.NewRow();
+ dtResult.Rows.Add(drEnd);
+ var dsResult = new DataSet();
+ dsResult.Tables.Add(dtResult);
+ //iugTemp.iMESUltraGrid.DataSource = dtResult;
+
+ // 0133391: [跨平台]AutoRunLib移除iMESUltraGrid的使用, 2023/4/21
+ String ExcelMode = strFillType.ToString().ToUpper(); //"XLSX" , "XLS"
+ byte[] membyte = modAutoRunLibrary.funExcelToByte(dsResult, ExcelMode, strLanguageMode, strResourceDir);
+
+ try
+ {
+ dsResult.Dispose();
+ }
+ catch (Exception ex)
+ {
+ }
+
+ // 寄送Mail
+ string argFileName = "ErrorList.xls";
+ string argEmailSubject = "[AUT]" + TranslateMsg("[%PROCESSINGERPPENDINGTRANSFAIL%]", strLanguageMode, strResourceDir);
+ string argEmailBody = TranslateMsg("[%SOMEMOAUTOCLOSEFAIL%]", strLanguageMode, strResourceDir);
+ modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo, membyte);
+ funProcessERPPendingTransRet = argEmailBody;
+ }
+ }
+ }
+ CloseConnection(cnnTemp);
+ dsTemp.Dispose();
+ dtResult.Dispose();
+ }
+ catch (Exception ex)
+ {
+ funProcessERPPendingTransRet = "fail_Finally;" + ex.Message;
+ }
+ }
+ }
+ while (false);
+ return funProcessERPPendingTransRet;
+
+ }
+
+ // 工單結案
+ public string funMOPendingClose(string MONo = defString)
+ {
+ DbDataReader drTemp = null;
+ IDbConnection cnnTemp = null;
+ // Dim cmd As OleDb.OleDbCommand
+ string strSQL = string.Empty;
+ string chkMOState_CloseRet = string.Empty;
+
+ var CollectionSQL = new Collection();
+ var CollectionRows = new Collection();
+ DateTime EventTime = DateTime.Now;
+ try
+ {
+ cnnTemp = CreateConnection(strConnectionString);
+ //查询工单是否存在
+ strSQL = "Select MONO,FromERP,IssueState,MOState From tblOEMOBasis Where MONo = '" + MONo + "'";
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drTemp["IssueState"], 2, false)))
+ {
+ chkMOState_CloseRet = TranslateMsg("[%MONONOTAPPROVED%]", strLanguageMode, strResourceDir);
+ goto exitfun;
+ }
+ if (drTemp["MOState"].ToString() == "99")
+ {
+ chkMOState_CloseRet = TranslateMsg("[%MONOCLOSED%]", strLanguageMode, strResourceDir);
+ goto exitfun;
+ //工單已結案
+ }
+ }
+ else
+ {
+ chkMOState_CloseRet = TranslateMsg("[%MONONOTEXIST%]", strLanguageMode, strResourceDir);
+ goto exitfun;
+ }
+ // 2016/09/08 YF, 因入庫動作並不會將生產批壓成99, 故工單永遠無法結單, 若壓成99又會有重上線問題
+ // 故能否結工單調整為只判斷是否還有線上的生產批
+ // 2018/06/07 OwenLiu, Mantis:46288, 增加數量需大於0的檢核
+ // 2019/12/11 Eric Mantis:65384 排除tblWIPLotBasis.LotStatus=0(未下線)的資料 (為已開立生產批的未下線資料與設定面檢核失敗而未下線成功的資料)
+ strSQL = " SELECT Count(A.LotNo) " + " FROM tblWIPLotState A, " + " (select C.* from tblwiplotbasis C where C.LOTSTATE<>0) B " + " WHERE A.BaseLotNo = B.BaseLotNo " + " AND B.MONo = '" + MONo + "' " + " AND A.Status In (0,1,2,3,4,5) " + " AND A.CurQty > 0 ";
+
+ // cmd.CommandText = strSQL
+
+ if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false))
+ {
+ chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir);
+ goto exitfun;
+ }
+
+ // 82671: [6.0.3]在製品庫仍有數量,ERP仍可執行工單結案 Edison 2020/11/25
+ strSQL = " SELECT Count(A.LotNo) FROM tblINVWIPInventory_Semi A, tblWIPLotBasis B " + " WHERE A.BaseLotNo = B.BaseLotNo " + " And B.MONo = '" + MONo + "' ";
+
+ // cmd.CommandText = strSQL
+
+ if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false))
+ {
+ chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir);
+ goto exitfun;
+ }
+ // cmmTemp.Dispose()
+
+ //0130980: [6.0.7]0129989: [萬達]工單結案條件確認
+ strSQL = " SELECT Count(A.BaseLotNo) FROM tblWIPLotBasis A, tblINVWIP_Scrap B WHERE A.BaseLotNo = B.LotNo AND B.SCRAPQTY > 0 AND A.MONo = '" + MONo + "' ";
+
+ if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false))
+ {
+ chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir);
+ goto exitfun;
+ }
+
+ strSQL = "SELECT Count(A.BaseLotNo) FROM tblWIPLotBasis A, tblINVWIP_FailBin B WHERE A.BaseLotNo = B.LotNo AND A.MONo = '" + MONo + "' ";
+
+ if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false))
+ {
+ chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir);
+ goto exitfun;
+ }
+ strSQL = "SELECT Count(A.BaseLotNo) FROM tblWIPLotBasis A, tblINVWIP_ComponentScrap B WHERE A.BaseLotNo = B.LotNo AND B.SCRAPQTY > 0 AND A.MONo = '" + MONo + "' ";
+
+ if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false))
+ {
+ chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir);
+ goto exitfun;
+ }
+ strSQL = "Update tblOEMOBasis Set MOState = 99, MOCloseDate = To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ";
+ strSQL += " ,OrgMOState = " + drTemp["MOState"].ToString() + " Where MONo = '" + MONo + "'";
+ CollectionSQL.Add(strSQL);
+ CollectionRows.Add(1);
+
+ strSQL = "Insert into tblERPPendingTransLog Select TRANSACTIONID, TRANSACTIONTYPE, TICKETNO, ERPType, Creator, CreateDate ,sysdate as EventTime from tblERPPendingTrans where TRANSACTIONTYPE = 1 And TICKETNO = '" + MONo + "' ";
+ CollectionSQL.Add(strSQL);
+ CollectionRows.Add(1);
+
+ strSQL = " Delete from tblERPPendingTrans Where TRANSACTIONTYPE = 1 And TICKETNO = '" + MONo + "' ";
+ CollectionSQL.Add(strSQL);
+ CollectionRows.Add(1);
+
+ // 0151198: [6.0.7] SDD231107_01-02_ERP 工單結案接口調整, 19245, 2023/12/11
+ // 1.找出ERPCloseMOClearMTLQty參數值, 是否要清除工單上的還有數量的物料 0:否,不清除 ; 1:是,要清除工單上有剩餘數量的物料。
+ string strMOClearMTLQty = defString;
+ Double dblMOMTLQty_MIN = 1;
+ strSQL = "Select ParameterValue From tblSYSParameter Where ParameterNo = 'ERPCloseMOClearMTLQty'";
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ strMOClearMTLQty = drTemp["ParameterValue"].ToString();
+ drTemp.Close();
+
+ if (strMOClearMTLQty == "1") // 要清除
+ {
+ Decimal decNumber = 0;
+ // 2.找出MOMTLQty_MIN (最低工單物料數量(用於ERP工單結案清除剩餘物料))參數值
+ strSQL = "Select ParameterValue From tblSYSParameter Where ParameterNo = 'MOMTLQty_MIN'";
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ if (drTemp.Read())
+ {
+ //判斷MOMTLQty_MIN是否為數值
+ if (decimal.TryParse(drTemp["ParameterValue"].ToString(), out decNumber))
+ dblMOMTLQty_MIN = Convert.ToDouble(drTemp["ParameterValue"]);
+ else
+ {
+ chkMOState_CloseRet = TranslateMsg("[%MOMTLQty_MIN%] [%IS NOT NUMERIC%]", strLanguageMode, strResourceDir);
+ goto exitfun;
+ }
+ }
+ drTemp.Close();
+
+ // 取出目前工單的物料數量
+ strSQL = "Select * From tblOEMOMaterialState Where MONo='" + MONo + "'";
+ drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp);
+ while (drTemp.Read())
+ {
+ // 小於最低工單物料數量時,就必須要將該物料做清除
+ if (Convert.ToDouble(drTemp["Qty"]) < dblMOMTLQty_MIN)
+ {
+ strSQL = "Update tblOEMOMaterialState set Qty = 0 Where MONo ='" + drTemp["MONo"].ToString() + "'" +
+ " And MaterialNo = '" + drTemp["MaterialNo"] + "'" +
+ " And MaterialLotNo = '" + drTemp["MaterialLotNo"] + "'" +
+ " And SubstituteMaterialNo = '" + drTemp["SubstituteMaterialNo"] + "'";
+ CollectionSQL.Add(strSQL);
+ CollectionRows.Add(1);
+
+ // 將清除前的物料紀錄回tblERPMOMTLStateClearLog
+ strSQL = "Insert Into tblERPMOMTLStateClearLog " +
+ "(MONo, MaterialNo, MaterialLotNo, UnitNo, Qty, MaterialLevel, MaterialType, InputDate, " +
+ "SubstituteMaterialNo, SubstituteMaterialLevel, SubstituteMaterialQty, Description, ExpireDate," +
+ " OpenDate, ManufactureDate, GraceDate, EventDate)";
+ strSQL += " (Select MONo, MaterialNo, MaterialLotNo, UnitNo, " + drTemp["Qty"] + ", MaterialLevel, MaterialType, InputDate " +
+ ", SubstituteMaterialNo, SubstituteMaterialLevel, SubstituteMaterialQty, Description" +
+ ", ExpireDate, OpenDate, ManufactureDate, GraceDate" +
+ ", To_Date('" + Strings.Format(EventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; // 紀錄資料產生時間(EventTime)
+ strSQL += " From tblOEMOMaterialState";
+ strSQL += " Where MONo='" + drTemp["MONo"].ToString() + "'" +
+ " And MaterialNo = '" + drTemp["MaterialNo"] + "'" +
+ " And MaterialLotNo = '" + drTemp["MaterialLotNo"] + "'" +
+ " And SubstituteMaterialNo = '" + drTemp["SubstituteMaterialNo"] + "')";
+
+ CollectionSQL.Add(strSQL);
+ CollectionRows.Add(1);
+ }
+ }
+ drTemp.Close();
+ }
+
+ ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, CollectionSQL, CollectionRows);
+ chkMOState_CloseRet = "success";
+ exitfun:;
+ }
+ catch (Exception e1)
+ {
+ throw;
+ }
+ finally
+ {
+ drTemp.Close();
+ CloseConnection(cnnTemp);
+ // cmd = Nothing
+ }
+ return chkMOState_CloseRet;
+ }
+ #endregion
+
+ private string funGetRequestKey(ref object SCI_Object, string pService, string pUserNo, string pServiceName, string pCalledID = defString, string pRequestKey = defString)
+ {
+ string funGetRequestKeyRet = default(string);
+
+ DataRow[] drERPSetting;
+ string strFilter = "";
+
+ do
+ {
+ try
+ {
+ strFilter = "ERP_Name ='" + pService + "' ";
+ if ((pCalledID ?? "") != defString && string.IsNullOrEmpty(pCalledID) == false)
+ strFilter += " And CalledID ='" + pCalledID + "' ";
+ // 取得服務資訊
+ drERPSetting = dtERPSetting.Select(strFilter);
+ if (drERPSetting == null)
+ break;
+ if (drERPSetting.Length != 1)
+ break;
+ if ((pCalledID ?? "") == defString)
+ {
+ pCalledID = drERPSetting[0]["CalledID"].ToString();
+ }
+
+ // 2017-03-17, Joe, 加Parameter for E10
+ (SCI_Object as iMESCIO.SCI.ERP.ERPRequestBase).enterprise_no = drERPSetting[0]["ERP_ENTID"].ToString();
+ (SCI_Object as iMESCIO.SCI.ERP.ERPRequestBase).site_no = drERPSetting[0]["ERP_ORG"].ToString();
+
+ // 轉XML
+ string RequestHead = "";
+ RequestHead += "";
+ string RequestDataKey = "" + drERPSetting[0]["ERP_ENTID"].ToString() + "" + drERPSetting[0]["ERP_ORG"].ToString() + "";
+ string RequestXML_Body = Conversions.ToString((SCI_Object as iMESCIO.SCI.ERP.ERPRequestBase).ParseXml());
+ pRequestKey = modAutoRunLibrary.GetRequestKey(RequestHead);
+
+ funGetRequestKeyRet = pRequestKey;
+ }
+
+ catch (Exception ex)
+ {
+ throw;
+ }
+ }
+ while (false);
+ return funGetRequestKeyRet;
+
+ }
+ }
+}
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunLib/modAutoRunLibrary.cs b/SRC/MESAgent/MESAutoRun_STD/AutoRunLib/modAutoRunLibrary.cs
new file mode 100644
index 0000000..b467841
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunLib/modAutoRunLibrary.cs
@@ -0,0 +1,899 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.IO;
+using System.Linq;
+using System.Resources;
+using System.Runtime.InteropServices;
+using System.Security.Cryptography;
+using System.Text;
+using System.Xml;
+using Microsoft.VisualBasic;
+using Microsoft.VisualBasic.CompilerServices;
+using static iMESCore.Base.iMESComXML;
+using static iMESCore.Base.iMESConst;
+using NPOI.SS.UserModel;
+using NPOI.SS.Util;
+using NPOI.XSSF.UserModel;
+using NPOI.HSSF.UserModel;
+using static iMESCore.Base.iMESComSubroutine;
+
+namespace AutoRunLib
+{
+
+ static class modAutoRunLibrary
+ {
+ public enum GroupType
+ {
+ UserGroup = 0, // 使用者群組
+ IssueGroup = 1, // 簽核群組
+ EquipmentGroup = 2, // 設備工程師群組
+ InventoryGroup = 3, // 庫房工程師群組
+ ReportGroup = 4, // 報表使用群組
+ ERFDispositionGroup = 5, // 異常處理群組
+ ERFMailccGroup = 6 // 附件收件人群組
+ }
+
+ private static string InXml, OutXml, strIdentity, strParameter, XmlData, XmlSchema;
+
+
+ #region Invoke
+
+ ///
+ /// 叫用Web Service, 並回傳Response XML
+ ///
+ /// 要呼叫哪一個WebService的方法, ex: wsWIP.LoadLotBasis
+ /// InXml
+ /// 是否客製的WebService
+ ///
+ ///
+ /// 2019/08/22 OwenLiu, Mantis:0061402, 修正WS加上CI/CO執行時間紀錄 運作邏輯後AutoRun Servive呼叫WS失敗的問題
+ ///
+ public static string InvokeSrv(string Method, string InXml, bool Customize = false, int TimeOut = defInteger, bool LogOn = false)
+ {
+
+ object result;
+
+ try
+ {
+
+ using (var ws = new iMESCore.Base.Invoke.wsInvoke.wsInvoke())
+ {
+ ws.Url = modWIN.LocalizeWebService(ws.Url.ToString(), Customize);
+ ws.EnableDecompression = true;
+
+ if (TimeOut != defInteger)
+ {
+ ws.Timeout = TimeOut;
+ }
+
+ result = ws.invokeSrv(Method, new object[] { InXml, LogOn });
+ }
+ }
+
+ catch (Exception ex)
+ {
+ throw;
+ }
+
+ return Conversions.ToString(result);
+
+ }
+
+ ///
+ /// 叫用Web Service, 回傳Response XML
+ ///
+ /// 要呼叫哪一個WebService的方法, ex: wsWIP.LoadLotBasis
+ /// InXml
+ /// 用來取回byte資料或傳入byte資料
+ /// 是否客製的WebService
+ ///
+ /// 2019/08/22 OwenLiu, Mantis:0061402, 修正WS加上CI/CO執行時間紀錄 運作邏輯後AutoRun Servive呼叫WS失敗的問題
+ ///
+ public static string InvokeSrv(string Method, string InXml, byte[] buffer, bool Customize = false, int TimeOut = defInteger, bool LogOn = false)
+ {
+
+ object result;
+
+ try
+ {
+
+ using (var ws = new iMESCore.Base.Invoke.wsInvoke.wsInvoke())
+ {
+ ws.Url = modWIN.LocalizeWebService(ws.Url.ToString(), Customize);
+ ws.EnableDecompression = true;
+
+ if (TimeOut != defInteger)
+ {
+ ws.Timeout = TimeOut;
+ }
+
+ result = ws.invokeSrv(Method, new object[] { InXml, buffer, LogOn });
+ }
+ }
+
+ catch (Exception ex)
+ {
+ throw;
+ }
+
+ return Conversions.ToString(result);
+
+ }
+
+ ///
+ /// 叫用Web Service, 並回傳Response XML
+ ///
+ /// 要呼叫哪一個WebService的方法, ex: wsWIP.LoadLotBasis
+ /// InXml
+ /// 接收結果的DataSet
+ /// 是否客製的WebService
+ ///
+ public static string InvokeSrv(string Method, string InXml, ref DataSet pDataSet, bool Customize = false)
+ {
+
+ object result;
+
+ try
+ {
+
+ using (var ws = new iMESCore.Base.Invoke.wsInvoke.wsInvoke())
+ {
+ ws.Url = modWIN.LocalizeWebService(ws.Url.ToString(), Customize);
+ ws.EnableDecompression = true;
+ result = ws.invokeSrv_DataSet(Method, InXml, ref pDataSet);
+ }
+ }
+
+ catch (Exception ex)
+ {
+ throw;
+ }
+
+ return Conversions.ToString(result);
+
+ }
+
+ public static string InvokeSrv_GuardServer(bool Customize = false)
+ {
+ object result;
+
+ try
+ {
+
+ using (var ws = new iMESCore.Base.Invoke.wsInvoke.wsInvoke())
+ {
+ ws.Url = modWIN.LocalizeWebService(ws.Url.ToString(), Customize);
+ ws.EnableDecompression = true;
+ result = ws.Invoke_GuardServer_Process();
+
+ }
+ }
+
+ catch (Exception ex)
+ {
+ throw;
+ }
+
+ return Conversions.ToString(result);
+ }
+
+ #endregion
+
+
+ ///
+ /// EAI 檢核編碼(MD5)
+ ///
+ ///
+ ///
+ public static string GetRequestKey(string input)
+ {
+
+ const string ID = "28682266"; // 鼎新統編
+
+ string key = "";
+ var md5Hasher = MD5.Create(); // 建立MD5物件
+
+ try
+ {
+
+ input += ID;
+
+ // 將input轉換成MD5,並且以Bytes傳回,由於ComputeHash只接受Bytes型別參數,所以要先轉型別為Bytes
+ byte[] data = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(input));
+
+ // 建立StringBuilder物件
+ var sb = new StringBuilder();
+
+ // 將Bytes轉型別為String,並且以16進位存放
+ for (int i = 0, loopTo = data.Length - 1; i <= loopTo; i++)
+ sb.Append(data[i].ToString("x2"));
+
+ key = sb.ToString();
+ }
+
+ catch (Exception ex)
+ {
+ throw;
+ }
+ finally
+ {
+ md5Hasher = null;
+ }
+
+ return key;
+
+ }
+
+
+ ///
+ /// 紀錄Transaction
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static bool addTransactionLog(string InXml, string OutXml, string TransactionID, string ModuleID, string FunctionID, string ComputerName, string CurUserNo, string SendTime, string Result, string KeyValue, string ExceptionFun, string strException = null)
+ {
+ bool addTransactionLogRet = default(bool);
+ try
+ {
+ using (var wsERP = new iMESCore.Base.Invoke.wsMES.wsMES())
+ {
+ wsERP.Url = modWIN.LocalizeWebService_ERP(wsERP.Url.ToString());
+ wsERP.EnableDecompression = true;
+ if (wsERP.addTransactionLog(InXml, OutXml, TransactionID, ModuleID, FunctionID, ComputerName, CurUserNo, SendTime, Result, KeyValue, ExceptionFun, ref strException) == true)
+ {
+ addTransactionLogRet = true;
+ }
+ else
+ {
+ addTransactionLogRet = false;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ addTransactionLogRet = false;
+ }
+
+ return addTransactionLogRet;
+ }
+ ///
+ /// 紀錄Transaction
+ ///
+ public static bool addTransactionLog_ErrorCode(string InXml, string OutXml, string TransactionID, string ModuleID, string FunctionID, string ComputerName, string CurUserNo, string SendTime, string Result, string KeyValue, string ExceptionFun, string strException = null, string ErrorCode = "0000-999999", string LogClass = null)
+ {
+ bool addTransactionLog_ErrorCodeRet = default(bool);
+ try
+ {
+ using (var wsERP = new iMESCore.Base.Invoke.wsMES.wsMES())
+ {
+ wsERP.Url = modWIN.LocalizeWebService_ERP(wsERP.Url.ToString());
+ wsERP.EnableDecompression = true;
+ if (wsERP.addTransactionLog_ErrorCode(InXml, OutXml, TransactionID, ModuleID, FunctionID, ComputerName, CurUserNo, SendTime, Result, KeyValue, ExceptionFun, ref strException, ErrorCode, LogClass) == true)
+ {
+ addTransactionLog_ErrorCodeRet = true;
+ }
+ else
+ {
+ addTransactionLog_ErrorCodeRet = false;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ addTransactionLog_ErrorCodeRet = false;
+ }
+
+ return addTransactionLog_ErrorCodeRet;
+ }
+
+
+ // =====Elvis ,0091128: [605][CP+FT] E10ICD整合問題_AutoRun主檔拋轉的ERP交易紀錄exception時紀錄不正確
+ #region --- Combine (Exception, Message) ---
+
+ public static bool ChgTranslateException(ref List Exception, ref string strExceptionSysmsg, ref string strExceptionMesmsg, ref string strExceptionStack)
+ {
+ bool ChgTranslateExceptionRet = default(bool);
+
+ try
+ {
+ foreach (ArrayList al in Exception)
+ {
+ // If strExceptionSysmsg <> String.Empty Then strExceptionSysmsg += Chr(10)
+ if (string.IsNullOrEmpty(Conversions.ToString(al[1])) == false)
+ strExceptionSysmsg += al[1].ToString();
+ // If String.IsNullOrEmpty(strExceptionMesmsg) = False Then strExceptionMesmsg += Chr(10)
+ if (string.IsNullOrEmpty(Conversions.ToString(al[2])) == false)
+ {
+ // 翻譯錯誤訊息
+ string strErrName_Rep = "";
+ string ErrorName = al[2].ToString();
+ if (Strings.InStr(ErrorName, "[%", CompareMethod.Text) > 0)
+ {
+ string strKey, strKeyValue;
+ int intStart, j, k, l;
+
+ intStart = 1;
+ j = 1;
+
+ while (j != 0)
+ {
+ j = Strings.InStr(intStart, ErrorName, "[%", CompareMethod.Text);
+ if (j == 0)
+ {
+ strErrName_Rep += Strings.Mid(ErrorName, intStart);
+ }
+ else
+ {
+ k = Strings.InStr(j + 2, ErrorName, "%]", CompareMethod.Text);
+ if (k == 0)
+ {
+ // 找不到對應的結束字元.
+ strErrName_Rep += Strings.Mid(ErrorName, intStart);
+ j = 0;
+ }
+ else
+ {
+ // 檢查是否有不對稱的情況.
+ l = Strings.InStr(j + 2, ErrorName, "[%", CompareMethod.Text);
+ if (l == 0 || l > k)
+ {
+ strErrName_Rep += Strings.Mid(ErrorName, intStart, j - intStart);
+ strKey = Strings.Mid(ErrorName, j + 2, k - j - 2);
+ // 將Key執行語系轉換
+ try
+ {
+ strKeyValue = "";
+ }
+ // strKeyValue = Resources.Resource.ResourceManager.GetString(strKey)
+ catch (Exception ex)
+ {
+ strKeyValue = strKey;
+ }
+ if (string.IsNullOrEmpty(strKeyValue))
+ {
+ strErrName_Rep += strKey;
+ }
+ else
+ {
+ strErrName_Rep += strKeyValue;
+ } // & "(" & strKey & ")"
+ // 下次截取字串的起始位置
+ intStart = k + 2;
+ }
+ else
+ {
+ // 不對稱,找到最內層的[%%]
+ int m;
+ // 在前面的條件下,一定找得到.
+ m = Strings.InStrRev(ErrorName, "[%", k, CompareMethod.Text);
+ // 擷出不轉換的字串.
+ strErrName_Rep += Strings.Mid(ErrorName, intStart, m - intStart);
+ strKey = Strings.Mid(ErrorName, m + 2, k - m - 2);
+ // 將Key執行語系轉換
+ try
+ {
+ strKeyValue = "";
+ }
+ // strKeyValue = Resources.Resource.ResourceManager.GetString(strKey)
+ catch (Exception ex)
+ {
+ strKeyValue = strKey;
+ }
+ if (string.IsNullOrEmpty(strKeyValue))
+ {
+ strErrName_Rep += strKey;
+ }
+ else
+ {
+ strErrName_Rep += strKeyValue;
+ } // & "(" & strKey & ")"
+ // 下次截取字串的起始位置
+ intStart = k + 2;
+ }
+ }
+ }
+ }
+ }
+ // strExceptionMesmsg += Chr(9) & Chr(9) & Chr(9) & Resources.Resource.ResourceManager.GetString(al.Item(2).ToString) & "(" & al.Item(2).ToString & ")"
+ strExceptionMesmsg += strErrName_Rep;
+ }
+
+ // If strExceptionStack <> String.Empty Then strExceptionStack += Chr(10)
+ if (string.IsNullOrEmpty(Conversions.ToString(al[3])) == false)
+ strExceptionStack += al[3].ToString();
+ }
+
+ ChgTranslateExceptionRet = true;
+ }
+
+ catch (Exception e1)
+ {
+ throw;
+ ChgTranslateExceptionRet = false;
+ }
+
+ return ChgTranslateExceptionRet;
+
+ }
+
+
+ public static string CombineXMLResponse(string Identity, string ReturnValue = null, List Exception = null, string Result = null, List Message = null)
+ {
+ string CombineXMLResponseRet = default(string);
+
+ try
+ {
+ //
+ CombineXMLResponseRet = "";
+
+ //
+ if (string.IsNullOrEmpty(Identity))
+ {
+ CombineXMLResponseRet += "";
+ }
+ else
+ {
+ CombineXMLResponseRet += "";
+ CombineXMLResponseRet += Identity;
+ CombineXMLResponseRet += "";
+ }
+
+ //
+ if (string.IsNullOrEmpty(ReturnValue))
+ {
+ CombineXMLResponseRet += "";
+ }
+ else
+ {
+ CombineXMLResponseRet += "";
+ CombineXMLResponseRet += ReturnValue;
+ CombineXMLResponseRet += "";
+ }
+
+ //
+ if (string.IsNullOrEmpty(Result))
+ {
+ CombineXMLResponseRet += "";
+ }
+ else
+ {
+ CombineXMLResponseRet += "" + Result + "";
+ }
+
+ //
+ string strExceptionSysmsg = string.Empty;
+ string strExceptionMesmsg = string.Empty;
+ string strExceptionStack = string.Empty;
+
+ if (Exception.Count == 0)
+ {
+ CombineXMLResponseRet += "";
+ }
+ else
+ {
+ // 2016-12-01, Joe, Exception轉語系
+ ChgTranslateException(ref Exception, ref strExceptionSysmsg, ref strExceptionMesmsg, ref strExceptionStack);
+
+ CombineXMLResponseRet += "";
+ CombineXMLResponseRet += "
";
+ if (string.IsNullOrEmpty(strExceptionSysmsg) == true)
+ {
+ CombineXMLResponseRet += "";
+ }
+ else
+ {
+ CombineXMLResponseRet += "" + strExceptionSysmsg + '\n' + "" + '\n';
+ }
+ if (string.IsNullOrEmpty(strExceptionMesmsg) == true)
+ {
+ CombineXMLResponseRet += "" + strExceptionMesmsg + "" + '\n';
+ }
+ else
+ {
+ CombineXMLResponseRet += "" + strExceptionMesmsg + "" + '\n';
+ }
+ if (string.IsNullOrEmpty(strExceptionStack))
+ {
+ CombineXMLResponseRet += "";
+ }
+ else
+ {
+ // CombineXMLResponse += Chr(9) & Chr(9) & "" & Chr(10) & strExceptionStack & Chr(10) & Chr(9) & Chr(9) & "" & Chr(10)
+ CombineXMLResponseRet += "";
+ }
+ 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' + "" + '\n';
+ CombineXMLResponseRet += Conversions.ToString('\t') + '\t' + "" + '\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 bool combineException(ref List arrException, string code = null, string sysmsg = null, string mesmsg = null, string stack = null)
+ {
+ bool result = false;
+ try
+ {
+ var al = new ArrayList();
+
+ al.Add(code);
+ al.Add(sysmsg);
+ al.Add(mesmsg);
+ al.Add(stack);
+ arrException.Add(al);
+ result = true;
+ }
+ catch (Exception ex)
+ {
+ result = false;
+ }
+
+ return default(Boolean);
+
+ }
+
+ // Public Function combineMessage(
+ // ByRef strMessage As List(Of ArrayList),
+ // Optional ByVal mcode As String = Nothing,
+ // Optional ByVal mtype As String = Nothing,
+ // Optional ByVal mmsg As String = Nothing
+ // ) As Boolean
+ // Dim result As Boolean = False
+ // Try
+ // Dim al As New ArrayList
+ // al.Add(mcode)
+ // al.Add(mtype)
+ // al.Add(mmsg)
+ // strMessage.Add(al)
+ // result = True
+ // Catch ex As Exception
+ // result = False
+ // End Try
+ // End Function
+
+ #endregion
+ // =====
+
+ // 發Mail功能 非群組與群組發送
+ public static string SendMultiEmail(ref string FileName, ref string EmailSubject, string EmailBody = defString, string GroupNo = defString, byte[] AttachFile = null, GroupType GroupType = GroupType.UserGroup)
+ {
+ string SendMultiEmailRet = default(string);
+ // GroupType
+ // 0:User Group (使用者群組)
+ // 1:Issue Group (簽核群組)
+ // 2:Equipment Group(設備工程師群組)
+ // 3:Inventory Group(庫房工程師群組)
+ // 4:Report Group(報表使用群組)
+ // 5:ERF Disposition Group(異常處理群組)
+ // 6:ERF Mail ccGroup(附件收件人群組)
+
+ try
+ {
+
+ strIdentity = CombineXMLIdentity(modWIN.gComputerName, "AUTORUN", DateTime.Now.ToString());
+ strParameter = CombineXMLParameter("groupno", "GroupNo", "String", CInput(GroupNo), "");
+ strParameter = strParameter + CombineXMLParameter("emailsubject", "EmailSubject", "String", EmailSubject, "");
+ strParameter = strParameter + CombineXMLParameter("emailbody", "EmailBody", "String", EmailBody, "");
+ strParameter = strParameter + CombineXMLParameter("grouptype", "GroupType", "Integer", ((int)GroupType).ToString(), "");
+ strParameter = strParameter + CombineXMLParameter("attachfilename", "AttachFileName", "String", FileName, "");
+
+ var XmlDoc = new XmlDocument();
+
+ InXml = CombineXMLRequest(strIdentity, strParameter);
+
+ // OutXml = wsWIP.SendEmailAndAttachFileToGroup(InXml, AttachFile)
+ OutXml = InvokeSrv("wsWIP.SendEmailAndAttachFileToGroup", InXml, AttachFile);
+
+ XmlDoc.LoadXml(OutXml);
+
+ if (chkExecutionSuccess(XmlDoc)) // 找出Exception訊並顯示出來
+ {
+ SendMultiEmailRet = "success";
+ }
+ else
+ {
+ SendMultiEmailRet = "fail";
+ }
+
+ XmlDoc = null;
+ }
+
+ catch (Exception ex)
+ {
+ SendMultiEmailRet = "fail;" + ex.Message;
+ }
+
+ return SendMultiEmailRet;
+
+ }
+
+ #region --- 數值查核 ---
+
+ public static bool funChkNumericIsValid(string pSourceText, bool AllowFloat = true, bool AllowContainsDot = true, bool AllowZeroValue = true, bool AllowMinus = true)
+ {
+
+ bool blnExecResult = false;
+ decimal decInputValue = 0m;
+
+ try
+ {
+
+ if (!Information.IsNumeric(pSourceText))
+ {
+ blnExecResult = false;
+ return blnExecResult;
+ }
+ decInputValue = Convert.ToDecimal(pSourceText);
+
+ if (!AllowMinus && decInputValue < 0m)
+ {
+ blnExecResult = false;
+ return blnExecResult;
+ }
+ if (!AllowZeroValue && decInputValue == 0m)
+ {
+ blnExecResult = false;
+ return blnExecResult;
+ }
+ if (!AllowFloat)
+ {
+ if (decInputValue % 1m > 0m)
+ {
+ blnExecResult = false;
+ return blnExecResult;
+ }
+ }
+
+ if (!AllowContainsDot && !pSourceText.IndexOf(".").Equals(-1))
+ {
+ blnExecResult = false;
+ return blnExecResult;
+ }
+
+ blnExecResult = true;
+ }
+ catch (Exception ex)
+ {
+ throw;
+ }
+
+ return blnExecResult;
+
+ }
+
+ #endregion
+
+
+ public static byte[] funExcelToByte(DataSet dsResult, String ExcelMode, String strLanguageMode, String strResourceDir)
+ {
+ var memStream = new MemoryStream();
+ IWorkbook workbook = null;
+ int title = 0;
+ byte[] membyte;
+ try
+ {
+ // 匯出Excel再轉Stream
+ if (ExcelMode == "XLSX")
+ {
+ workbook = new XSSFWorkbook();
+ }
+ else
+ {
+ workbook = new HSSFWorkbook();
+ }
+
+ // Add a new worksheet
+ ISheet worksheet = workbook.CreateSheet("Sheet1");
+
+ // Add the TSSAVE data table to the worksheet
+ IRow headerRow = worksheet.CreateRow(0);
+
+
+ for (int i = 0; i <= dsResult.Tables[0].Columns.Count - 1; i++)
+ {
+ string strLanguage = dsResult.Tables[0].Columns[i].ToString();
+ strLanguage = TranslateMsg("[%" + strLanguage + "%]", strLanguageMode, strResourceDir); //語系翻譯
+ headerRow.CreateCell(i).SetCellValue(strLanguage);
+ }
+
+ for (int i = 0; i <= dsResult.Tables[0].Rows.Count - 1; i++)
+ {
+ IRow dataRow = worksheet.CreateRow(i + 1);
+
+
+ for (int j = 0; j <= dsResult.Tables[0].Columns.Count - 1; j++)
+ {
+ var objdsResultType = dsResult.Tables[0].Rows[i][j].GetType();
+ dataRow.CreateCell(j);
+ if (!Convert.IsDBNull(dsResult.Tables[0].Rows[i][j]))
+ {
+ dataRow.CreateCell(j).SetCellValue(dsResult.Tables[0].Rows[i][j].ToString());
+ }
+ else if (objdsResultType.Name == "DateTime")
+ {
+ DateTime datedsTemp = DateTime.Parse(dsResult.Tables[0].Rows[i][j].ToString());
+ dataRow.CreateCell(j).SetCellValue(datedsTemp);
+ }
+ else if (objdsResultType.Name == "Decimal")
+ {
+ decimal amount;
+ amount = Convert.ToDecimal(dsResult.Tables[0].Rows[i][j].ToString());
+ dataRow.CreateCell(j).SetCellValue((double)amount);
+ }
+ else
+ {
+ dataRow.CreateCell(j).SetCellValue(dsResult.Tables[0].Rows[i][j].ToString());
+ }
+
+ //.抓取值
+ IRow SelectRow = worksheet.GetRow(i);
+ ICell SelectCell = SelectRow.GetCell(j);
+ //Style處理
+ if (i == 0)
+ title = 1;
+ else
+ title = 0;
+ funCellStyleClone(workbook, SelectCell, title, ExcelMode);
+ }
+ }
+ //Columns 寬度
+ for (int i = 0; i <= dsResult.Tables[0].Columns.Count - 1; i++)
+ {
+ worksheet.AutoSizeColumn(i);
+ }
+ ////debug 用
+ //var fileStream = File.Create($"{DateTime.Now.ToString("HHmmss")}.xlsx");
+ //FileStream fs = new FileStream(@"c:\test.xlsx", FileMode.Create);
+ //workbook.Write(fs);
+ //fs.Close();
+ ////
+
+ workbook.Write(memStream);
+ membyte = memStream.ToArray();
+ return membyte;
+ }
+ catch (Exception ex)
+ {
+ throw;
+ }
+ finally
+ {
+ workbook?.Close();
+ memStream.Close();
+ memStream.Dispose();
+ }
+
+ }
+ public static void funCellStyleClone(IWorkbook Workbook, ICell SourceCell, int title, String ExcelMode)
+ {
+ try
+ {
+ ICellStyle CellStyle = Workbook.CreateCellStyle();
+ IFont CellFont = Workbook.CreateFont();
+ if (title == 1)
+ {
+ CellStyle.BorderLeft = BorderStyle.None;
+ CellStyle.BorderRight = BorderStyle.None;
+ CellStyle.BorderTop = BorderStyle.None;
+ if (ExcelMode == "XLSX")
+ {
+ XSSFColor xssfColor = new XSSFColor();
+ byte[] colorRgb = { (byte)192, (byte)192, (byte)255 };
+ xssfColor.SetRgb(colorRgb);
+ ((XSSFCellStyle)CellStyle).FillForegroundColorColor = xssfColor;
+ ((XSSFCellStyle)CellStyle).FillPattern = FillPattern.SolidForeground;
+ }
+ else
+ {
+ CellStyle.FillForegroundColor = (((HSSFWorkbook)Workbook).GetCustomPalette().FindSimilarColor((byte)192, (byte)192, (byte)255)).Indexed;
+ CellStyle.FillBackgroundColor = (((HSSFWorkbook)Workbook).GetCustomPalette().FindSimilarColor((byte)192, (byte)192, (byte)255)).Indexed;
+
+ }
+ CellStyle.FillPattern = FillPattern.SolidForeground;
+ CellStyle.BorderBottom = BorderStyle.None;
+ CellStyle.Alignment = HorizontalAlignment.Center;
+ SourceCell.CellStyle = CellStyle;
+ }
+ else
+ {
+ CellStyle.BorderLeft = BorderStyle.Thin;
+ CellStyle.BorderRight = BorderStyle.Thin;
+ CellStyle.BorderTop = BorderStyle.Thin;
+ CellStyle.BorderBottom = BorderStyle.Thin;
+ if (ExcelMode == "XLSX")
+ {
+ XSSFColor xssfColor = new XSSFColor();
+ byte[] colorRgb = { (byte)192, (byte)192, (byte)255 };
+ xssfColor.SetRgb(colorRgb);
+ ((XSSFCellStyle)CellStyle).SetTopBorderColor(xssfColor);
+ ((XSSFCellStyle)CellStyle).SetRightBorderColor(xssfColor);
+ ((XSSFCellStyle)CellStyle).SetLeftBorderColor(xssfColor);
+ ((XSSFCellStyle)CellStyle).SetBottomBorderColor(xssfColor);
+ }
+ else
+ {
+ CellStyle.LeftBorderColor = (((HSSFWorkbook)Workbook).GetCustomPalette().FindSimilarColor((byte)192, (byte)192, (byte)255)).Indexed;
+ CellStyle.RightBorderColor = (((HSSFWorkbook)Workbook).GetCustomPalette().FindSimilarColor((byte)192, (byte)192, (byte)255)).Indexed;
+ CellStyle.TopBorderColor = (((HSSFWorkbook)Workbook).GetCustomPalette().FindSimilarColor((byte)192, (byte)192, (byte)255)).Indexed;
+ CellStyle.BottomBorderColor = (((HSSFWorkbook)Workbook).GetCustomPalette().FindSimilarColor((byte)192, (byte)192, (byte)255)).Indexed;
+
+ }
+
+ CellStyle.FillPattern = FillPattern.SolidForeground;
+ CellStyle.Alignment = HorizontalAlignment.Left;
+ SourceCell.CellStyle = CellStyle;
+ }
+
+ // 文字
+
+ CellFont.FontHeightInPoints = 9;
+ //CellFont.Boldweight = StyleFon.Boldweight;
+ //CellFont.Charset = StyleFon.Charset;
+ //CellFont.Color = StyleFon.Color;
+ //CellFont.FontHeight = 9;
+ //CellFont.FontHeightInPoints = StyleFon.FontHeightInPoints;
+ //CellFont.FontName = StyleFon.FontName;
+ //CellFont.IsItalic = StyleFon.IsItalic;
+ //CellFont.IsStrikeout = StyleFon.IsStrikeout;
+ //CellFont.Underline = StyleFon.Underline;
+
+ CellStyle.SetFont(CellFont);
+ }
+ catch (Exception ex)
+ {
+ throw;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunLib/modWIN.cs b/SRC/MESAgent/MESAutoRun_STD/AutoRunLib/modWIN.cs
new file mode 100644
index 0000000..2e9b5ee
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunLib/modWIN.cs
@@ -0,0 +1,234 @@
+using System;
+using System.Collections;
+using static System.Configuration.ConfigurationSettings;
+using System.Data;
+using System.Runtime.InteropServices;
+using System.Xml;
+using Microsoft.VisualBasic;
+using Microsoft.VisualBasic.CompilerServices;
+
+namespace AutoRunLib
+{
+
+ static class modWIN
+ {
+
+ // ReviseDate : 2003/08/07,修改處理AdditionalXML
+ // ReviseDate : 2003/08/05,新增Public gReturnArray
+ // ReviseDate : 2003/07/01,更改AddFlow產生的Error(CInput)
+ // ReviseDate : 2002/11/04,新增CUnInput function
+
+ public static string gComputerName = System.Environment.MachineName;
+ public static string gUserNo = "AUTService";
+ public static string gMESWebServiceHost = GetAppSettings("MesWebServiceHost");
+ public static string gCUSWebServiceHost = GetAppSettings("CusWebServiceHost");
+ public static string gERPWebServiceHost = GetAppSettings("ERPWebServiceHost");
+ public static string gLanguageMode = GetAppSettings("LanguageMode");
+
+ //新增gEnableSSL配置参数
+ public static bool gEnableSSL = Convert.ToBoolean(GetAppSettings("EnableSSL"));
+
+ // Add By Peter 2005/6/20
+ public static string gSettingMode = "";
+
+
+ public static string PasswordEncoding(ref string Password)
+ {
+ string PasswordEncodingRet = default(string);
+ // 此 Function 將傳入值加以編碼後傳出,編碼後長度不變
+ // 傳入值: 密碼
+ // 傳回值: 編碼後密碼
+
+ // Vernam密碼是由Gilbert Vernam在1918年發明的
+ string g_Key = "xNDFz6LH67LOv7xKbWFpbMu1wejrM7SzvV4tLRvq3X47m708O1xMHLoaMNCqGhoaEN";
+ string strChar, iCryptChar, strEncrypted = default(string);
+ int i, iKeyChar, iStringChar;
+
+ var loopTo = Strings.Len(Password);
+ for (i = 1; i <= loopTo; i++)
+ {
+ iKeyChar = Strings.Asc(Strings.Mid(g_Key, i, 1));
+ iStringChar = Strings.Asc(Strings.Mid(Password, i, 1));
+ iCryptChar = (iKeyChar ^ iStringChar).ToString();
+ strEncrypted = strEncrypted + Strings.Chr(Conversions.ToInteger(iCryptChar));
+ }
+
+ PasswordEncodingRet = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(strEncrypted));
+ return PasswordEncodingRet;
+
+ }
+
+
+ // 2017-06-05, Joe, 依XML標準定義轉換特殊字元
+ public static string CInputWithXMLStandard(ref string strInput)
+ {
+ string CInputWithXMLStandardRet = default(string);
+
+ // 轉換 ' 為 '
+ CInputWithXMLStandardRet = Strings.Replace(strInput, "'", "'");
+
+ // 轉換 & 為 &
+ CInputWithXMLStandardRet = Strings.Replace(CInputWithXMLStandardRet, "&", "&");
+
+ // 轉換 " 為 quot;
+ CInputWithXMLStandardRet = Strings.Replace(CInputWithXMLStandardRet, "\"", """);
+
+ // 轉換 > 為 >
+ CInputWithXMLStandardRet = Strings.Replace(CInputWithXMLStandardRet, ">", ">");
+
+ // 轉換 < 為 <
+ CInputWithXMLStandardRet = Strings.Replace(CInputWithXMLStandardRet, "<", "<");
+ return CInputWithXMLStandardRet;
+
+ }
+
+ // 2017-06-05, Joe, 依XML標準定義反轉換特殊字元
+ public static string CUnInputWithXMLStandard(ref string strInput)
+ {
+ string CUnInputWithXMLStandardRet = default(string);
+
+ // 轉換 ' 為 "'"
+ CUnInputWithXMLStandardRet = Strings.Replace(strInput, "'", "'");
+
+ // 轉換 " 為 quot;
+ CUnInputWithXMLStandardRet = Strings.Replace(CUnInputWithXMLStandardRet, """, "\"");
+
+ // 轉換 & 為 &
+ CUnInputWithXMLStandardRet = Strings.Replace(CUnInputWithXMLStandardRet, "&", "&");
+
+ // 轉換 > 為 >
+ CUnInputWithXMLStandardRet = Strings.Replace(CUnInputWithXMLStandardRet, ">", ">");
+
+ // 轉換 < 為 <
+ CUnInputWithXMLStandardRet = Strings.Replace(CUnInputWithXMLStandardRet, "<", "<");
+ return CUnInputWithXMLStandardRet;
+
+ }
+
+ // **Add by py 2003/12/04,Gary Lu 20120911:以MESWin1~Win4的版本進行替換
+ public static string LocalizeWebService(string wsUrl, bool Customize = false)
+ {
+
+ string[] tmpString;
+ int i;
+ tmpString = wsUrl.Split('/');
+ if (Customize == true)
+ {
+ if (!string.IsNullOrEmpty(Strings.Trim(gCUSWebServiceHost)))
+ {
+ if (tmpString.Length == 6)
+ {
+ wsUrl = tmpString[0].ToString() + "/" + tmpString[1].ToString() + "/" + gCUSWebServiceHost + "/" + tmpString[4].ToString() + "/" + tmpString[5].ToString();
+ }
+ else if (tmpString.Length == 5)
+ {
+ wsUrl = "http://" + gCUSWebServiceHost + "/" + tmpString[tmpString.Length - 1].ToString();
+ }
+ }
+ }
+ else if (!string.IsNullOrEmpty(Strings.Trim(gMESWebServiceHost)))
+ {
+ if (tmpString.Length == 6)
+ {
+ // wsUrl = "http://" & gMESWebServiceHost & "/" & tmpString(tmpString.Length - 2).ToString & "/" & tmpString(tmpString.Length - 1).ToString
+ wsUrl = tmpString[0].ToString() + "/" + tmpString[1].ToString() + "/" + gMESWebServiceHost + "/" + tmpString[4].ToString() + "/" + tmpString[5].ToString();
+ }
+ else if (tmpString.Length == 5)
+ {
+ wsUrl = "http://" + gMESWebServiceHost + "/" + tmpString[tmpString.Length - 1].ToString();
+ }
+ }
+ if (gEnableSSL)
+ {
+ wsUrl = wsUrl.Replace("http://", "https://");
+ }
+ return wsUrl;
+ // Have to assume the web service is on the machine that this application came from
+ } // LocalizeWebService
+
+ public static string LocalizeWebService_ERP(string wsUrl)
+ {
+
+ string[] tmpString;
+ int i;
+ tmpString = wsUrl.Split('/');
+
+ if (!string.IsNullOrEmpty(Strings.Trim(gERPWebServiceHost)))
+ {
+ wsUrl = tmpString[0].ToString() + "/" + tmpString[1].ToString() + "/" + gERPWebServiceHost + "/" + tmpString[4].ToString();
+ }
+ if (gEnableSSL)
+ {
+ wsUrl = wsUrl.Replace("http://", "https://");
+ }
+ return wsUrl;
+
+ }
+
+ // Add By Peter 2005/6/20
+ public static string GetAppSettings(string key, string section = "")
+ {
+ string result = string.Empty;
+
+ try
+ {
+
+ if (!string.IsNullOrEmpty(section))
+ {
+ result = Conversions.ToString(((Hashtable)GetConfig(section))[key]);
+ }
+ else if (string.IsNullOrEmpty(gSettingMode) || string.IsNullOrEmpty(gSettingMode) || gSettingMode.Length == 0)
+ {
+ result = AppSettings[key];
+ }
+ else
+ {
+ Hashtable ht = (Hashtable)GetConfig(gSettingMode);
+ if (ht != null)
+ {
+ result = Conversions.ToString(ht[key]);
+ if (string.IsNullOrEmpty(result))
+ {
+ result = AppSettings[key];
+ if (string.IsNullOrEmpty(result))
+ {
+ result = "";
+ }
+ }
+ }
+ else
+ {
+ result = AppSettings[key];
+ }
+ }
+ }
+
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+
+ return result;
+
+ }
+
+
+ public static string GetSubString(string strValue, int intLength)
+ {
+ int intLen;
+ string strReturn;
+
+ // Dim byteValue As Byte() = System.Text.Encoding.UTF8.GetBytes(strValue)
+ // If intLength > byteValue.Length - 1 Then
+ // intLen = byteValue.Length - 1
+ // End If
+ // Dim strReturn As String = System.Text.Encoding.UTF8.GetString(byteValue, 0, intLen)
+ intLen = (int)Math.Round(Conversion.Int(intLength / 3d));
+ strReturn = Strings.Left(strValue, intLen);
+
+ return strReturn;
+
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.Designer.cs b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.Designer.cs
new file mode 100644
index 0000000..f452fa8
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.Designer.cs
@@ -0,0 +1,104 @@
+using System;
+using System.Diagnostics;
+using System.ServiceProcess;
+
+namespace AutoRunService
+{
+
+ [Microsoft.VisualBasic.CompilerServices.DesignerGenerated()]
+ public partial class AutoRunService : ServiceBase
+ {
+
+ // UserService 覆寫 Dispose 以清除元件清單。
+ [DebuggerNonUserCode()]
+ protected override void Dispose(bool disposing)
+ {
+ try
+ {
+ if (disposing && components != null)
+ {
+ components.Dispose();
+ }
+ }
+ finally
+ {
+ base.Dispose(disposing);
+ }
+ }
+
+ // 處理序的主要進入點
+ [MTAThread()]
+ [DebuggerNonUserCode()]
+ public static void Main()
+ {
+ ServiceBase[] ServicesToRun;
+
+ // 在同一個處理序中可以執行多個 NT 服務。若要在這個處理序中
+ // 加入另一項服務,請修改下行程式碼,
+ // 以建立第二個服務物件。例如,
+ //
+ // ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService}
+ //
+ ServicesToRun = new ServiceBase[] { new AutoRunService() };
+ //RunInteractive(ServicesToRun); //debug
+ Run(ServicesToRun);
+ }
+ private static void RunInteractive(ServiceBase[] servicesToRun)
+ {
+ var onStartMethod = typeof(ServiceBase).GetMethod("OnStart", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
+
+ foreach (ServiceBase service in servicesToRun)
+ {
+ Console.Write("Starting {0}...", service.ServiceName);
+ onStartMethod.Invoke(service, new object[] { new string[] { } });
+ Console.Write("Started");
+ }
+
+ Console.WriteLine("Press any key to stop the services");
+ Console.ReadKey();
+ var onStopMethod = typeof(ServiceBase).GetMethod("OnStop", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
+
+ foreach (ServiceBase service in servicesToRun)
+ {
+ Console.Write("Stopping {0}...", service.ServiceName);
+ onStopMethod.Invoke(service, null);
+ Console.WriteLine("Stopped");
+ }
+ }
+
+ // 為元件設計工具的必要項
+ private System.ComponentModel.IContainer components;
+
+ // 注意: 以下為元件設計工具的所需的程序
+ // 您可以使用元件設計工具進行修改。
+ // 請不要使用程式碼編輯器進行修改。
+ [DebuggerStepThrough()]
+ private void InitializeComponent()
+ {
+ TimerCheckJobList = new System.Timers.Timer();
+ TimerCheckJobList.Elapsed += new System.Timers.ElapsedEventHandler(TimerCheckJobList_Elapsed);
+ TimerCheckQueue = new System.Timers.Timer();
+ TimerCheckQueue.Elapsed += new System.Timers.ElapsedEventHandler(TimerCheckQueue_Elapsed);
+ ((System.ComponentModel.ISupportInitialize)TimerCheckJobList).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)TimerCheckQueue).BeginInit();
+ //
+ // TimerCheckJobList
+ //
+ TimerCheckJobList.Interval = 300000.0d;
+ //
+ // TimerCheckQueue
+ //
+ TimerCheckQueue.Interval = 60000.0d;
+ //
+ // AutoRunService
+ //
+ ServiceName = "MES AutoRun Service";
+ ((System.ComponentModel.ISupportInitialize)TimerCheckJobList).EndInit();
+ ((System.ComponentModel.ISupportInitialize)TimerCheckQueue).EndInit();
+
+ }
+ internal System.Timers.Timer TimerCheckJobList;
+ internal System.Timers.Timer TimerCheckQueue;
+
+ }
+}
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.cs b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.cs
new file mode 100644
index 0000000..b694af4
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.cs
@@ -0,0 +1,1204 @@
+using System;
+using System.Data;
+using System.Deployment.Application;
+using System.Diagnostics;
+using System.IO;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.ServiceProcess;
+using System.Xml;
+using Microsoft.VisualBasic;
+using Microsoft.VisualBasic.CompilerServices;
+using static iMESCore.Base.iMESConst;
+using static iMESCore.Base.iMESComXML;
+using static iMESCore.Base.iMESComSubroutine;
+
+namespace AutoRunService
+{
+
+ public partial class AutoRunService : ServiceBase
+ {
+
+ // 2016/06/23 YF, 改呼叫wsInvoke
+
+ private string tblJobQueue, tblJob;
+ private int intMaxRunningJobCount = modAutoRun.gIntMaxRunningJobCount;
+
+ // 2017/12/26 OwenLiu, mantis:0043439, AutoRunService 問題調整
+ // 2014/06/25 YF, 記錄JOB的執行狀況
+ private Collection CollectionJob = new Collection();
+
+ // 取回JOB LIST 到 JOB QUEUE的時間間隔(單位:秒) '20211015 13871,修正為*1000才是秒
+ private int MonitorjoblistDuration = (int)Math.Round(Conversions.ToDouble(modWIN.GetAppSettings("MonitorjoblistDuration")) * 1000d);
+ // 到JOB QUEUE 檢查是否有要執行的job的時間間隔(單位:秒) '20211015 13871,修正為*1000才是秒
+ private int MonitorQueueDuration = (int)Math.Round(Conversions.ToDouble(modWIN.GetAppSettings("MonitorQueueDuration")) * 1000d);
+
+ public AutoRunService()
+ {
+ InitializeComponent();
+ }
+
+ protected override void OnStart(string[] args)
+ {
+
+ var currentDomain = AppDomain.CurrentDomain;
+ currentDomain.UnhandledException += CurrentDomain_UnhandledException;
+
+ // 在此加入啟動服務的程式碼。這個方法必須設定已啟動的
+ // 事項,否則可能導致服務無法工作。
+ funWriteTxtFile("Service Starting.");
+
+ // 2012/10/05, Aaron, 啟動時先刪除資料庫中上次執行的殘留JobQueue
+ funDelMesAutoRunQueue();
+
+ // 啟動時先載入Job List及Table架構
+ funLoadAutoRunJob_All();
+
+ // 每隔n秒鐘, 取回一次JOB LIST 到 JOB QUEUE
+ TimerCheckJobList.Interval = MonitorjoblistDuration;
+ TimerCheckJobList.Enabled = true;
+
+ // 每隔n秒鐘,到 JOB QUEUE 檢查是否有要執行的
+ TimerCheckQueue.Interval = MonitorQueueDuration;
+ TimerCheckQueue.Enabled = true;
+
+ modAutoRun.gIntCurrentJobCount = 0;
+
+ funWriteTxtFile("Service Started.");
+
+ }
+
+ protected override void OnStop()
+ {
+ // 在此加入停止服務所需執行的終止程式碼。
+ modAutoRun.dsJob.Dispose();
+ modAutoRun.dsJobQueue.Dispose();
+ TimerCheckJobList.Enabled = false;
+ TimerCheckQueue.Enabled = false;
+ funWriteTxtFile("Service Stopped.");
+ }
+
+
+ ///
+ /// 取出近期的Job放入JobQueue中,
+ ///
+ ///
+ ///
+ ///
+ private void TimerCheckJobList_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
+ {
+
+ // funWriteTxtFile("Running CheckJobList...")
+
+ TimerCheckJobList.Enabled = false;
+
+ // *****取回最近要執行的Jobs, 放入JobQueue中
+ funGetJob2Queue();
+
+ // *****平分近8分的工作
+ TimerCheckJobList.Enabled = true;
+
+ }
+
+
+ ///
+ /// 定期檢查JobQueue是否有工作預定執行之動作,
+ ///
+ ///
+ ///
+ ///
+ private void TimerCheckQueue_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
+ {
+
+ // funWriteTxtFile("Running CheckQueue...")
+
+ // 若未達到最大同時執行工作數目之限制時
+ if (modAutoRun.gIntCurrentJobCount < intMaxRunningJobCount)
+ {
+ TimerCheckQueue.Enabled = false;
+
+ do
+ {
+ try
+ {
+
+ int intTmp;
+ var strJOB = new string[3];
+ DateTime dateTmp;
+ int intTmp2;
+ string strServerName;
+
+ // *****從JobQueue中取回資料,存成 DataSet
+ funReBind();
+
+ // 2017/12/26 OwenLiu, mantis:0043439, AutoRunService 問題調整
+ // 2014/06/25 YF, JobQueue物件不存在則跳離
+ if (modAutoRun.dsJobQueue.Tables[tblJobQueue] == null)
+ {
+ break;
+ }
+
+ // 2014/06/25 YF, 將tblJobQueue內Running的Job與CollectionJob做比對, 來判斷Job是否已死在Queue內
+ // CollectionJob內若還有此JobNo, 則表示該Job還在執行中, 若沒有則表示Job已死
+ CheckJobIsDead();
+
+
+ // '*****檢查是否有需要執行的job, 包含沒有設定ServiceStation或ServiceStation為ME的Job
+ DataRow[] dr = modAutoRun.dsJobQueue.Tables[tblJobQueue].Select("(ServerName is null Or ServerName='' Or ServerName='" + System.Windows.Forms.SystemInformation.ComputerName.ToString().ToUpper() + "') and STATUS='Standby'");
+
+
+ // 如果有則處理它們
+ var loopTo = dr.Length - 1;
+ for (intTmp = 0; intTmp <= loopTo; intTmp++)
+ {
+ // 若未達到最大同時執行工作數目之限制時
+ if (modAutoRun.gIntCurrentJobCount < intMaxRunningJobCount)
+ {
+ dateTmp = Conversions.ToDate(dr[intTmp][2]);
+
+ // ..........判斷此job是否執行時間到
+ if (dateTmp <= DateTime.Now)
+ {
+ strJOB[0] = Conversions.ToString(dr[intTmp][0]);
+ strJOB[1] = Conversions.ToString(dr[intTmp][5]);
+
+ // ..............再檢查一次,判斷此job是否尚未有人執行
+ strServerName = funLoadAutoRunServerName(strJOB[0]);
+ if ((strServerName ?? "") != defString)
+ {
+ if (string.IsNullOrEmpty(strServerName) || string.IsNullOrEmpty(strServerName.Trim()))
+ {
+ intTmp2 = 1; // 尚未有主機登記要執行
+ }
+ else if ((strServerName ?? "") == (System.Windows.Forms.SystemInformation.ComputerName ?? ""))
+ {
+ intTmp2 = 1; // 本主機自行登記要執行
+ }
+ else
+ {
+ intTmp2 = 0;
+ } // 已經有其他機器登記要執行
+
+ // 尚未有主機登記要執行或本主機自行登記要執行
+ if (intTmp2 == 1)
+ {
+
+ // 寫入註明自己正要執行
+ funUpdateAutoRunQueue(System.Windows.Forms.SystemInformation.ComputerName, strJOB[0], defString);
+
+ // ..........再取一次,判斷ServerName是否為自己
+ strServerName = funLoadAutoRunServerName(strJOB[0]);
+ if ((strServerName ?? "") != defString)
+ {
+ if ((strServerName ?? "") == (System.Windows.Forms.SystemInformation.ComputerName ?? ""))
+ {
+ modAutoRun.gIntCurrentJobCount = modAutoRun.gIntCurrentJobCount + 1;
+
+ // 建立傳入執行緒之參數物件
+ var objJobData = new modAutoRun.SomeStateType();
+ objJobData.SomeState(strJOB[0], strJOB[1]);
+ // 開始執行
+ if (System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(funProcessJob), objJobData) == false)
+ {
+ // MsgBox("Thread fail.")
+ }
+
+ }
+ } // ...........If DataReader.Read Then
+
+ } // .............If intTmp2 = 1 Then
+
+ } // ...............判斷是否尚未有人執行 If DataReader.Read Then
+
+ } // .........判斷是否執行時間到 If dateTmp <= Now Then
+
+ } // ...........If gIntCurrentJobCount <= intMaxRunningJobCount Then
+
+ }
+ }
+
+ catch (Exception e1)
+ {
+ funWriteTxtFile("TimerCheckQueue Error : " + e1.Message);
+ funWriteToAnEventLog("TimerCheckQueue Error : " + e1.Message, EventLogEntryType.Error, 9000);
+ }
+ finally
+ {
+ }
+ }
+
+ while (false);
+ TimerCheckQueue.Enabled = true;
+ }
+
+ // 'Call funReBind()
+
+ }
+
+
+ ///
+ /// 將執行的Log紀錄在文字檔(AutoRunWS_Log.txt)中
+ ///
+ ///
+ ///
+ ///
+ private int funWriteTxtFile(string WriteTxt)
+ {
+ int funWriteTxtFileRet = default(int);
+
+ funWriteTxtFileRet = -1;
+
+ try
+ {
+ if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + @"\Log"))
+ {
+ Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + @"\Log");
+ }
+
+ var fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + @"\Log\AutoRunWS_Log_" + Strings.Format(DateTime.Now, "yyyyMMdd") + ".txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
+ var w = new StreamWriter(fs);
+
+ w.BaseStream.Seek(0L, SeekOrigin.End);
+ w.WriteLine(Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + " " + WriteTxt);
+ w.Close();
+ fs.Close();
+
+ funWriteTxtFileRet = 0;
+ }
+
+ catch (Exception e1)
+ {
+
+ }
+
+ return funWriteTxtFileRet;
+
+ }
+
+ private void funWriteToAnEventLog(string sEvent, EventLogEntryType sEventType = EventLogEntryType.Information, int sEventID = 0)
+ {
+ string sSource = "MES AutoRun Service";
+ string sLog = "Application";
+
+ try
+ {
+ if (!EventLog.SourceExists(sSource))
+ EventLog.CreateEventSource(sSource, sLog);
+ EventLog.WriteEntry(sSource, sEvent, sEventType, sEventID);
+ }
+ catch (Exception ex)
+ {
+
+ }
+
+ }
+
+ ///
+ /// 重新載入JobQueue資料
+ ///
+ ///
+ ///
+ private int funReBind()
+ {
+
+ // //Web Service相關變數
+ var XmlDoc = new XmlDocument();
+ StringReader tmpStringReader;
+ string InXml, OutXml, strIdentity, strParameter, XmlData, XmlSchema;
+
+ // 先判斷是否dataset中已有equipmenttype之datatable,若有,需先remove否則會有錯誤
+ if (!(modAutoRun.dsJobQueue.Tables[tblJobQueue] == null))
+ {
+ modAutoRun.dsJobQueue.Tables.Remove(tblJobQueue);
+ }
+
+ // 組InXml的字串
+ string argSendTime = Conversions.ToString(DateTime.Now);
+ strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime);
+ strParameter = "";
+ InXml = CombineXMLRequest(strIdentity, strParameter);
+
+ try
+ {
+ // OutXml = wsAUT.LoadMesAutoRunQueue(InXml)
+ OutXml = modAutoRun.InvokeSrv("wsAUT.LoadMesAutoRunQueue", InXml);
+
+ XmlDoc = new XmlDocument();
+ // 利用XmlDoc物件處理ReturnValue
+ XmlDoc.LoadXml(OutXml);
+ if (chkExecutionSuccess(XmlDoc))
+ {
+ tblJobQueue = XmlDoc.GetElementsByTagName("returnvalue").Item(0).SelectNodes("loadmesautorunqueue").Item(0).SelectNodes("name").Item(0).InnerXml;
+
+ // 取出Schema,dataset讀取Schema可防止Null Field及DateTime的問題
+ XmlSchema = XmlDoc.DocumentElement.GetElementsByTagName("loadmesautorunqueue").Item(0).SelectNodes("schema").Item(0).InnerXml;
+ if (!string.IsNullOrEmpty(XmlSchema))
+ {
+ // 將XML讀入String Reader object中,因為Dataset讀入XML時必須透過String Reader物件
+ tmpStringReader = new StringReader(XmlSchema);
+ modAutoRun.dsJobQueue.ReadXmlSchema(tmpStringReader);
+ tmpStringReader.Close();
+ }
+
+ // 取出Data
+ XmlData = XmlDoc.DocumentElement.GetElementsByTagName("loadmesautorunqueue").Item(0).SelectNodes("value").Item(0).InnerXml;
+ if (!string.IsNullOrEmpty(XmlData))
+ {
+ tmpStringReader = new StringReader(XmlData);
+ modAutoRun.dsJobQueue.ReadXml(tmpStringReader);
+ tmpStringReader.Close();
+ }
+ }
+
+ else
+ {
+ throw new Exception(GetExceptionSysMsg(XmlDoc) + '\r' + GetExceptionMesMsg(XmlDoc));
+ }
+ }
+
+ catch (Exception e1)
+ {
+ funWriteTxtFile("funReBind Error : " + e1.Message);
+ funWriteToAnEventLog("funReBind Error : " + e1.Message, EventLogEntryType.Error, 9000);
+ }
+
+ return default(int);
+
+ }
+
+
+ ///
+ /// 取出近期的Job放入JobQueue中
+ ///
+ ///
+ public void funGetJob2Queue()
+ {
+
+ // //Web Service相關變數
+ var XmlDoc = new XmlDocument();
+ string InXml, OutXml, strIdentity, strParameter;
+
+ // 組InXml的字串
+ string argSendTime = Conversions.ToString(DateTime.Now);
+ strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime);
+ strParameter = "";
+ InXml = CombineXMLRequest(strIdentity, strParameter);
+
+ try
+ {
+ // OutXml = wsAUT.GetJob2Queue(InXml)
+ OutXml = modAutoRun.InvokeSrv("wsAUT.GetJob2Queue", InXml);
+
+ // 利用XmlDoc物件處理ReturnValue
+ XmlDoc.LoadXml(OutXml);
+ if (!chkExecutionSuccess(XmlDoc))
+ {
+ throw new Exception(GetExceptionSysMsg(XmlDoc) + '\r' + GetExceptionMesMsg(XmlDoc));
+ }
+ }
+
+ catch (Exception e1)
+ {
+ funWriteTxtFile("funGetJob2Queue Error : " + e1.Message);
+ funWriteToAnEventLog("funGetJob2Queue Error : " + e1.Message, EventLogEntryType.Error, 9000);
+ }
+
+ }
+
+
+ ///
+ /// 取出ServerName
+ ///
+ ///
+ ///
+ ///
+ private string funLoadAutoRunServerName(string JobNo)
+ {
+ string funLoadAutoRunServerNameRet = default(string);
+ // 判斷此job是否尚未有人執行
+ // 判斷ServerName是否為自己(本機)
+
+ funLoadAutoRunServerNameRet = defString;
+
+ // //Web Service相關變數
+ var XmlDoc = new XmlDocument();
+ string InXml, OutXml, strIdentity, strParameter;
+
+ // 組InXml的字串
+ strParameter = "";
+ string argSendTime = Conversions.ToString(DateTime.Now);
+ strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime);
+ string argvalue_name = "jobno";
+ string argname = "JobNo";
+ string argtype = "String";
+ string argdesc = "";
+ strParameter = CombineXMLParameter(argvalue_name, argname, argtype, JobNo, argdesc);
+ InXml = CombineXMLRequest(strIdentity, strParameter);
+
+ try
+ {
+ // OutXml = wsAUT.LoadMesAutoRunQueue(InXml)
+ OutXml = modAutoRun.InvokeSrv("wsAUT.LoadMesAutoRunQueue", InXml);
+
+ XmlDoc.LoadXml(OutXml);
+ if (chkExecutionSuccess(XmlDoc))
+ {
+ // 取出CPN
+ if (XmlDoc.GetElementsByTagName("ServerName".ToUpper()).Count > 0)
+ {
+ string serverNameTmp = XmlDoc.GetElementsByTagName("ServerName".ToUpper()).Item(0).InnerXml.ToString();
+ funLoadAutoRunServerNameRet = CUnInput(serverNameTmp);
+ }
+ else
+ {
+ funLoadAutoRunServerNameRet = "";
+ }
+ }
+ else
+ {
+ throw new Exception(GetExceptionSysMsg(XmlDoc) + '\r' + GetExceptionMesMsg(XmlDoc));
+ }
+
+ XmlDoc = null;
+ }
+
+ catch (Exception e1)
+ {
+ funWriteTxtFile("funLoadAutoRunServerName (JobNo : " + JobNo + ") Error : " + e1.Message);
+ funWriteToAnEventLog("funLoadAutoRunServerName (JobNo : " + JobNo + ") Error : " + e1.Message, EventLogEntryType.Error, 9000);
+ }
+
+ return funLoadAutoRunServerNameRet;
+
+ }
+
+ private int funUpdateAutoRunQueue(string ServerName, string JobNo, string Status)
+ {
+ int funUpdateAutoRunQueueRet = default(int);
+
+ // 寫入註明自己(本機)正要執行
+ funUpdateAutoRunQueueRet = -1;
+
+ // //Web Service相關變數
+ var XmlDoc = new XmlDocument();
+ string InXml, OutXml, strIdentity, strParameter;
+
+ try
+ {
+
+ // 將傳入參數組成XML字串
+ // 定義Identity
+ string argSendTime = Conversions.ToString(DateTime.Now);
+ strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime);
+
+ // 定義Parameter
+ strParameter = string.Empty;
+ strParameter = "";
+ if ((ServerName ?? "") != defString)
+ {
+ string argvalue_name = "servername";
+ string argname = "ServerName";
+ string argtype = "String";
+ string argdesc = "";
+ strParameter += CombineXMLParameter(argvalue_name, argname, argtype, ServerName, argdesc);
+ }
+ if ((JobNo ?? "") != defString)
+ {
+ string argvalue_name1 = "jobno";
+ string argname1 = "JobNo";
+ string argtype1 = "String";
+ string argdesc1 = "";
+ strParameter += CombineXMLParameter(argvalue_name1, argname1, argtype1, JobNo, argdesc1);
+ }
+ if ((Status ?? "") != defString)
+ {
+ string argvalue_name2 = "status";
+ string argname2 = "Status";
+ string argtype2 = "String";
+ string argdesc2 = "";
+ strParameter += CombineXMLParameter(argvalue_name2, argname2, argtype2, Status, argdesc2);
+ }
+
+ // request XML字串
+ InXml = CombineXMLRequest(strIdentity, strParameter);
+
+ // OutXml = wsAUT.EditMesAutoRunQueue(InXml)
+ OutXml = modAutoRun.InvokeSrv("wsAUT.EditMesAutoRunQueue", InXml);
+
+ XmlDoc.LoadXml(OutXml);
+ if (!chkExecutionSuccess(XmlDoc))
+ {
+ throw new Exception(GetExceptionSysMsg(XmlDoc) + '\r' + GetExceptionMesMsg(XmlDoc));
+ }
+
+ funUpdateAutoRunQueueRet = 0;
+ }
+
+ catch (Exception e1)
+ {
+ // Throw New Exception("Unexpected Error. Update auto-run queue fails. " & e1.Message)
+ funWriteTxtFile("funUpdateAutoRunQueue (JobNo : " + JobNo + ") Error : " + e1.Message);
+ funWriteToAnEventLog("funUpdateAutoRunQueue (JobNo : " + JobNo + ") Error : " + e1.Message, EventLogEntryType.Error, 9000);
+ }
+
+ return funUpdateAutoRunQueueRet;
+
+ }
+
+ ///
+ /// 取出Job參數設定
+ ///
+ ///
+ ///
+ /// 2016/04/26 YF, 此Function的目的在取出要執行的JOB的參數, 故不要使用dsJob物件, 以避免各執行緒異動dsJob, 而造成 "DataTable 内部索引已损坏" 的錯誤
+ ///
+ private int funLoadAutoRunJob(string JobNo, ref Collection colParameters)
+ {
+
+ // Dim dr As DataRow
+ // //Web Service相關變數
+ var XmlDoc = new XmlDocument();
+ StringReader tmpStringReader;
+ string InXml, OutXml, strIdentity, strParameter, XmlData, XmlSchema;
+
+ // 先判斷是否dataset中已有datatable,若有,需先remove否則會有錯誤
+ // If Not IsNothing(dsJobQueue.Tables(tblJob)) Then
+ // dsJobQueue.Tables.Remove(tblJob)
+ // End If
+
+ // 組InXml的字串
+ strParameter = "";
+ string argSendTime = Conversions.ToString(DateTime.Now);
+ strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime);
+ string argvalue_name = "jobno";
+ string argname = "JobNo";
+ string argtype = "String";
+ string argdesc = "";
+ strParameter = CombineXMLParameter(argvalue_name, argname, argtype, JobNo, argdesc);
+ InXml = CombineXMLRequest(strIdentity, strParameter);
+
+ try
+ {
+ // OutXml = wsAUT.LoadMesAutoRunJob(InXml)
+ OutXml = modAutoRun.InvokeSrv("wsAUT.LoadMesAutoRunJob", InXml);
+
+ // 利用XmlDoc物件處理ReturnValue
+ XmlDoc.LoadXml(OutXml);
+
+ if (chkExecutionSuccess(XmlDoc))
+ {
+ // 2017/12/26 OwenLiu, mantis:0043439, AutoRunService 問題調整
+ tblJob = XmlDoc.GetElementsByTagName("returnvalue").Item(0).SelectNodes("loadmesautorunjob").Item(0).SelectNodes("name").Item(0).InnerXml;
+
+ // 2017/12/26 OwenLiu, mantis:0043439, AutoRunService 問題調整
+ lock (this)
+ {
+ if (modAutoRun.dsJob.Tables[tblJob] == null)
+ {
+ // 取出Schema,dataset讀取Schema可防止Null Field及DateTime的問題
+ XmlSchema = XmlDoc.DocumentElement.GetElementsByTagName("loadmesautorunjob").Item(0).SelectNodes("schema").Item(0).InnerXml;
+ if (!string.IsNullOrEmpty(XmlSchema))
+ {
+ // 將XML讀入String Reader object中,因為Dataset讀入XML時必須透過String Reader物件
+ tmpStringReader = new StringReader(XmlSchema);
+ modAutoRun.dsJob.ReadXmlSchema(tmpStringReader);
+ tmpStringReader.Close();
+ }
+ }
+
+ // 先刪除舊資料
+ DataRow[] drSel;
+ drSel = modAutoRun.dsJob.Tables[tblJob].Select("JobNo = '" + JobNo + "'");
+ if (drSel.Length > 0)
+ drSel[0].Delete();
+
+ // 取出Data
+ XmlData = XmlDoc.DocumentElement.GetElementsByTagName("loadmesautorunjob").Item(0).SelectNodes("value").Item(0).InnerXml;
+ if (!string.IsNullOrEmpty(XmlData))
+ {
+ tmpStringReader = new StringReader(XmlData);
+ modAutoRun.dsJob.ReadXml(tmpStringReader);
+ tmpStringReader.Close();
+ }
+
+ drSel = modAutoRun.dsJob.Tables[tblJob].Select("JobNo = '" + JobNo + "'");
+ if (drSel.Length > 0)
+ {
+ colParameters.Add(drSel[0]["Parameter01"].ToString(), "Parameter01");
+ colParameters.Add(drSel[0]["Parameter02"].ToString(), "Parameter02");
+ colParameters.Add(drSel[0]["Parameter03"].ToString(), "Parameter03");
+ colParameters.Add(drSel[0]["Parameter04"].ToString(), "Parameter04");
+ colParameters.Add(drSel[0]["Parameter05"].ToString(), "Parameter05");
+ colParameters.Add(drSel[0]["Parameter06"].ToString(), "Parameter06");
+ colParameters.Add(drSel[0]["Parameter07"].ToString(), "Parameter07");
+ colParameters.Add(drSel[0]["Parameter08"].ToString(), "Parameter08");
+ colParameters.Add(drSel[0]["Parameter09"].ToString(), "Parameter09");
+ colParameters.Add(drSel[0]["Parameter10"].ToString(), "Parameter10");
+ colParameters.Add(drSel[0]["EmailAddress"].ToString(), "EmailAddress");
+ }
+
+ }
+ }
+
+ else
+ {
+ throw new Exception(GetExceptionSysMsg(XmlDoc) + '\r' + GetExceptionMesMsg(XmlDoc));
+ }
+ }
+
+ catch (Exception e1)
+ {
+ funWriteTxtFile("funLoadAutoRunJob (JobNo : " + JobNo + ") Error : " + e1.Message);
+ funWriteToAnEventLog("funLoadAutoRunJob (JobNo : " + JobNo + ") Error : " + e1.Message, EventLogEntryType.Error, 9000);
+ }
+
+ return default(int);
+
+ }
+
+ private void funLoadAutoRunJob_All()
+ {
+
+ // Dim dr As DataRow
+ // //Web Service相關變數
+ var XmlDoc = new XmlDocument();
+ StringReader tmpStringReader;
+ string InXml, OutXml, strIdentity, strParameter, XmlData, XmlSchema;
+
+ // 先判斷是否dataset中已有datatable,若有,需先remove否則會有錯誤
+ if (!(modAutoRun.dsJob.Tables[tblJob] == null))
+ {
+ modAutoRun.dsJob.Tables.Remove(tblJob);
+ }
+
+ // 組InXml的字串
+ string argSendTime = Conversions.ToString(DateTime.Now);
+ strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime);
+ strParameter = "";
+ InXml = CombineXMLRequest(strIdentity, strParameter);
+
+ try
+ {
+ // OutXml = wsAUT.LoadMesAutoRunJob(InXml)
+ OutXml = modAutoRun.InvokeSrv("wsAUT.LoadMesAutoRunJob", InXml);
+
+ // 利用XmlDoc物件處理ReturnValue
+ XmlDoc.LoadXml(OutXml);
+ if (chkExecutionSuccess(XmlDoc))
+ {
+ tblJob = XmlDoc.GetElementsByTagName("returnvalue").Item(0).SelectNodes("loadmesautorunjob").Item(0).SelectNodes("name").Item(0).InnerXml;
+
+ // 取出Schema,dataset讀取Schema可防止Null Field及DateTime的問題
+ XmlSchema = XmlDoc.DocumentElement.GetElementsByTagName("loadmesautorunjob").Item(0).SelectNodes("schema").Item(0).InnerXml;
+ if (!string.IsNullOrEmpty(XmlSchema))
+ {
+ // 將XML讀入String Reader object中,因為Dataset讀入XML時必須透過String Reader物件
+ tmpStringReader = new StringReader(XmlSchema);
+ modAutoRun.dsJob.ReadXmlSchema(tmpStringReader);
+ tmpStringReader.Close();
+ }
+ // 取出Data
+ XmlData = XmlDoc.DocumentElement.GetElementsByTagName("loadmesautorunjob").Item(0).SelectNodes("value").Item(0).InnerXml;
+ if (!string.IsNullOrEmpty(XmlData))
+ {
+ tmpStringReader = new StringReader(XmlData);
+ modAutoRun.dsJob.ReadXml(tmpStringReader);
+ tmpStringReader.Close();
+ }
+ }
+
+ else
+ {
+ throw new Exception(GetExceptionSysMsg(XmlDoc) + '\r' + GetExceptionMesMsg(XmlDoc));
+ }
+ }
+
+ catch (Exception e1)
+ {
+ funWriteTxtFile("funLoadAutoRunJob_All Error : " + e1.Message);
+ funWriteToAnEventLog("funLoadAutoRunJob_All Error : " + e1.Message, EventLogEntryType.Error, 9000);
+ }
+
+ }
+
+
+ ///
+ /// 執行設定的Job
+ ///
+ ///
+ ///
+ public void funProcessJob(object State)
+ {
+
+ modAutoRun.SomeStateType strJob = (modAutoRun.SomeStateType)State;
+ string strJobNo = strJob.strJobNo;
+ string strJobName = strJob.strCommandName;
+ var StartTime = DateTime.Now;
+ string strStatus = "Fail"; // 回傳狀況先設定為Fail
+ string strReturnMsg = "";
+ string strMemo = "";
+ string errorCode = "0000-999999";
+
+ try
+ {
+
+ funWriteTxtFile("JobNo : " + strJobNo + ", Running.");
+
+ // 2017/12/26 OwenLiu, mantis:0043439, AutoRunService 問題調整
+ // 2014/06/25 YF, Job Running
+ if (CollectionJob.Contains(strJobNo))
+ {
+ CollectionJob.Remove(strJobNo);
+ }
+ CollectionJob.Add(1, strJobNo);
+
+ // 1. 註明正在執行
+ funUpdateAutoRunQueue(defString, strJobNo, "Running");
+
+ // 2. 取出tblMESAutoRunJob的參數(Parameter1~Parameter5)
+ var colParameters = new Collection();
+ colParameters.Add(strJobNo, "JobNo");
+ funLoadAutoRunJob(strJobNo, ref colParameters);
+
+ // 3. 引用AutoRunLib.dll, 不加入參考 ----
+ string strAppBase = AppDomain.CurrentDomain.BaseDirectory;
+ string strFilePath;
+
+ // 判斷是否是使用ClickOnce
+ if (ApplicationDeployment.IsNetworkDeployed)
+ {
+ // ClickOnce架構下將strAppBase改指回Smart Client
+ var tempUri = ApplicationDeployment.CurrentDeployment.UpdateLocation;
+ strAppBase = tempUri.ToString().Replace("/ClickOnce/MESSeries.application", "");
+ }
+
+ if (Strings.Mid(strAppBase, 1, 4) == "http")
+ {
+ strFilePath = strAppBase + "/AutoRunLib.dll";
+ }
+ else
+ {
+ strFilePath = strAppBase + "AutoRunLib.dll";
+ }
+
+ // 本機執行:將DLL放在執行檔編譯後的位置底下
+ var mainAssembly = System.Reflection.Assembly.LoadFrom(strFilePath);
+ // 建立Type物件
+ var hashType = mainAssembly.GetType("AutoRunLib.clsAutoRunLibrary");
+ // 使用ConstructorInfo建立物件
+ Type[] argumentTypes = Type.EmptyTypes;
+ var ctor = hashType.GetConstructor(argumentTypes);
+ // 因AutoRunLib.clsAutoRunLibrary會叫用到iMESLicxManager.dll,所以AutoRunLib.dll和iMESLicxManager.dll要放在同一個路徑底下,且app.config要設連線字串
+ var newHash = ctor.Invoke(new object[] { });
+ // 使用MethodInfo.Invoke執行
+ var meth = hashType.GetMethod("ExecuteFunction");
+
+ // 執行設定的Job
+ strReturnMsg = Conversions.ToString(meth.Invoke(newHash, new object[] { strJobName, colParameters }));
+
+ // 若對應的程式回傳為success, 則本程序也回傳Success
+ // If strReturnMsg = "success" Then strStatus = "Success"
+ if (Strings.Mid(strReturnMsg, 1, 7).ToLower() == "success")
+ {
+ strStatus = "Success"; // 2012/08/20,Even,需判斷若回傳值 =Success (第一字碼大寫時,造成 strStatus無判斷),因此故意不回傳值
+ strReturnMsg = ""; // 成功不顯示msg
+ }
+ else if (Strings.Mid(strReturnMsg, 1, 5) == "fail;") // 2013/01/14,Hank,狀態已是fail,故Msg不show
+ {
+ // 取ErrorCode
+ string[] tmp = Strings.Split(strReturnMsg, ";");
+ if (tmp.Length >= 3)
+ {
+ if (tmp[1].Length == 11)
+ {
+ errorCode = tmp[1];
+ }
+ }
+
+ strReturnMsg = Strings.Replace(strReturnMsg, "fail;", "", 1, 1, CompareMethod.Text); // 拿掉前面的fail;
+ }
+
+ funWriteTxtFile("JobNo : " + strJobNo + ", Complete. " + strReturnMsg);
+ }
+
+ catch (Exception E2)
+ {
+ strMemo = "funProcessJob Error : " + E2.Message;
+ funWriteTxtFile(strMemo);
+ funWriteToAnEventLog(strMemo, EventLogEntryType.Error, 9000);
+ }
+ finally
+ {
+ try
+ {
+
+ // Job完成後的後續動作:
+ // 刪除已經執行完畢之工作 (最先做, 減少執行完畢而未刪的情形)
+ // 註記最後執行時間
+ // 增加log
+ if (strStatus == "Success")
+ {
+ funEndProcessJob(strJobNo, strStatus, CInput(strReturnMsg),
+ CInput(System.Windows.Forms.SystemInformation.ComputerName),
+ StartTime, DateTime.Now, Convert.ToInt32(DateAndTime.DateDiff(DateInterval.Second, StartTime, DateTime.Now)), strMemo);
+ }
+ else
+ {
+ funEndProcessJob_ErrorCode(strJobNo, strStatus, CInput(strReturnMsg),
+ CInput(System.Windows.Forms.SystemInformation.ComputerName), StartTime, DateTime.Now,
+ Convert.ToInt32(DateAndTime.DateDiff(DateInterval.Second, StartTime, DateTime.Now)), strMemo, errorCode, "AutoRun");
+ }
+ }
+
+ catch (Exception E1)
+ {
+ strMemo = "funProcessJob (JobNo : " + strJobNo + ") Error : " + E1.Message;
+ funWriteTxtFile(strMemo);
+ funWriteToAnEventLog(strMemo, EventLogEntryType.Error, 9000);
+ }
+ finally
+ {
+ modAutoRun.gIntCurrentJobCount = modAutoRun.gIntCurrentJobCount - 1;
+ }
+
+ // 2017/12/26 OwenLiu, mantis:0043439, AutoRunService 問題調整
+ // 2014/06/25 YF, Job End
+ if (CollectionJob.Contains(strJobNo))
+ {
+ CollectionJob.Remove(strJobNo);
+ }
+
+ }
+
+ }
+
+ ///
+ /// 執行Job完成後的後續動作
+ ///
+ private int funEndProcessJob(string JobNo, string Status = defString, string ReturnMsg = defString, string ServerName = defString, DateTime StartTime = default(DateTime), DateTime EndTime = default(DateTime), int RunTime = defInteger, string Memo = defString)
+ {
+ int funEndProcessJobRet = default(int);
+ // 刪除已經執行完畢之工作 (最先做, 減少執行完畢而未刪的情形)
+ // 註記最後執行時間
+ // 增加log
+
+ funEndProcessJobRet = -1;
+
+ // //Web Service相關變數
+ var XmlDoc = new XmlDocument();
+ string InXml, OutXml, strIdentity, strParameter;
+
+ try
+ {
+
+ // 將傳入參數組成XML字串
+ // 定義Identity
+ string argSendTime = Conversions.ToString(DateTime.Now);
+ strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime);
+
+ // 定義Parameter
+ strParameter = string.Empty;
+ string argvalue_name = "jobno";
+ string argname = "JobNo";
+ string argtype = "String";
+ string argdesc = "";
+ strParameter = CombineXMLParameter(argvalue_name, argname, argtype, JobNo, argdesc);
+ if ((Status ?? "") != defString)
+ {
+ string argvalue_name1 = "status";
+ string argname1 = "Status";
+ string argtype1 = "String";
+ string argdesc1 = "";
+ strParameter += CombineXMLParameter(argvalue_name1, argname1, argtype1, Status, argdesc1);
+ }
+ if ((ReturnMsg ?? "") != defString)
+ {
+ string argvalue_name2 = "returnmsg";
+ string argname2 = "ReturnMsg";
+ string argtype2 = "String";
+ string argdesc2 = "";
+ strParameter += CombineXMLParameter(argvalue_name2, argname2, argtype2, ReturnMsg, argdesc2);
+ }
+ if ((ServerName ?? "") != defString)
+ {
+ string argvalue_name3 = "servername";
+ string argname3 = "ServerName";
+ string argtype3 = "String";
+ string argdesc3 = "";
+ strParameter += CombineXMLParameter(argvalue_name3, argname3, argtype3, ServerName, argdesc3);
+ }
+ if (StartTime != defDateTime)
+ {
+ string argvalue_name4 = "starttime";
+ string argname4 = "StartTime";
+ string argtype4 = "DateTime";
+ string argvalue = Strings.Format(StartTime, "yyyy/MM/dd HH:mm:ss");
+ string argdesc4 = "";
+ strParameter += CombineXMLParameter(argvalue_name4, argname4, argtype4, argvalue, argdesc4);
+ } // 2016-11-09, Joe, Format日期格式
+ if (EndTime != defDateTime)
+ {
+ string argvalue_name5 = "endtime";
+ string argname5 = "EndTime";
+ string argtype5 = "DateTime";
+ string argvalue1 = Strings.Format(EndTime, "yyyy/MM/dd HH:mm:ss");
+ string argdesc5 = "";
+ strParameter += CombineXMLParameter(argvalue_name5, argname5, argtype5, argvalue1, argdesc5);
+ } // 2016-11-09, Joe, Format日期格式
+ if (RunTime != defInteger)
+ {
+ string argvalue_name6 = "runtime";
+ string argname6 = "RunTime";
+ string argtype6 = "Integer";
+ string argvalue2 = RunTime.ToString();
+ string argdesc6 = "";
+ strParameter += CombineXMLParameter(argvalue_name6, argname6, argtype6, argvalue2, argdesc6);
+ RunTime = Conversions.ToInteger(argvalue2);
+ }
+ if ((Memo ?? "") != defString)
+ {
+ string argvalue_name7 = "memo";
+ string argname7 = "Memo";
+ string argtype7 = "String";
+ string argdesc7 = "";
+ strParameter += CombineXMLParameter(argvalue_name7, argname7, argtype7, Memo, argdesc7);
+ }
+
+ // request XML字串
+ InXml = CombineXMLRequest(strIdentity, strParameter);
+
+ OutXml = modAutoRun.InvokeSrv("wsAUT.funEndProcessJob", InXml);
+
+ XmlDoc.LoadXml(OutXml);
+ if (!chkExecutionSuccess(XmlDoc))
+ {
+ throw new Exception(GetExceptionSysMsg(XmlDoc) + '\r' + GetExceptionMesMsg(XmlDoc));
+ }
+
+ funEndProcessJobRet = 0;
+ }
+
+ catch (Exception e1)
+ {
+ funWriteTxtFile("funEndProcessJob (JobNo : " + JobNo + ") Error : " + e1.Message);
+ funWriteToAnEventLog("funEndProcessJob (JobNo : " + JobNo + ") Error : " + e1.Message, EventLogEntryType.Error, 9000);
+ }
+
+ return funEndProcessJobRet;
+
+ }
+ ///
+ /// 執行Job完成後的後續動作
+ ///
+ private int funEndProcessJob_ErrorCode(string JobNo, string Status = defString, string ReturnMsg = defString, string ServerName = defString, DateTime StartTime = default(DateTime), DateTime EndTime = default(DateTime), int RunTime = defInteger, string Memo = defString, string ErrorCode = "0000-999999", string LogClass = defString)
+ {
+ int funEndProcessJob_ErrorCodeRet = default(int);
+ // 刪除已經執行完畢之工作 (最先做, 減少執行完畢而未刪的情形)
+ // 註記最後執行時間
+ // 增加log
+
+ funEndProcessJob_ErrorCodeRet = -1;
+
+ // //Web Service相關變數
+ var XmlDoc = new XmlDocument();
+ string InXml, OutXml, strIdentity, strParameter;
+
+ try
+ {
+
+ // 將傳入參數組成XML字串
+ // 定義Identity
+ string argSendTime = Conversions.ToString(DateTime.Now);
+ strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime);
+
+ // 定義Parameter
+ strParameter = string.Empty;
+ string argvalue_name = "jobno";
+ string argname = "JobNo";
+ string argtype = "String";
+ string argdesc = "";
+ strParameter = CombineXMLParameter(argvalue_name, argname, argtype, JobNo, argdesc);
+ if ((Status ?? "") != defString)
+ {
+ string argvalue_name1 = "status";
+ string argname1 = "Status";
+ string argtype1 = "String";
+ string argdesc1 = "";
+ strParameter += CombineXMLParameter(argvalue_name1, argname1, argtype1, Status, argdesc1);
+ }
+ if ((ReturnMsg ?? "") != defString)
+ {
+ string argvalue_name2 = "returnmsg";
+ string argname2 = "ReturnMsg";
+ string argtype2 = "String";
+ string argdesc2 = "";
+ strParameter += CombineXMLParameter(argvalue_name2, argname2, argtype2, ReturnMsg, argdesc2);
+ }
+ if ((ServerName ?? "") != defString)
+ {
+ string argvalue_name3 = "servername";
+ string argname3 = "ServerName";
+ string argtype3 = "String";
+ string argdesc3 = "";
+ strParameter += CombineXMLParameter(argvalue_name3, argname3, argtype3, ServerName, argdesc3);
+ }
+ if (StartTime != defDateTime)
+ {
+ string argvalue_name4 = "starttime";
+ string argname4 = "StartTime";
+ string argtype4 = "DateTime";
+ string argvalue = Strings.Format(StartTime, "yyyy/MM/dd HH:mm:ss");
+ string argdesc4 = "";
+ strParameter += CombineXMLParameter(argvalue_name4, argname4, argtype4, argvalue, argdesc4);
+ } // 2016-11-09, Joe, Format日期格式
+ if (EndTime != defDateTime)
+ {
+ string argvalue_name5 = "endtime";
+ string argname5 = "EndTime";
+ string argtype5 = "DateTime";
+ string argvalue1 = Strings.Format(EndTime, "yyyy/MM/dd HH:mm:ss");
+ string argdesc5 = "";
+ strParameter += CombineXMLParameter(argvalue_name5, argname5, argtype5, argvalue1, argdesc5);
+ } // 2016-11-09, Joe, Format日期格式
+ if (RunTime != defInteger)
+ {
+ string argvalue_name6 = "runtime";
+ string argname6 = "RunTime";
+ string argtype6 = "Integer";
+ string argvalue2 = RunTime.ToString();
+ string argdesc6 = "";
+ strParameter += CombineXMLParameter(argvalue_name6, argname6, argtype6, argvalue2, argdesc6);
+ RunTime = Conversions.ToInteger(argvalue2);
+ }
+ if ((Memo ?? "") != defString)
+ {
+ string argvalue_name7 = "memo";
+ string argname7 = "Memo";
+ string argtype7 = "String";
+ string argdesc7 = "";
+ strParameter += CombineXMLParameter(argvalue_name7, argname7, argtype7, Memo, argdesc7);
+ }
+ if ((LogClass ?? "") != defString)
+ {
+ string argvalue_name8 = "logclass";
+ string argname8 = "LogClass";
+ string argtype8 = "String";
+ string argdesc8 = "";
+ strParameter += CombineXMLParameter(argvalue_name8, argname8, argtype8, LogClass, argdesc8);
+ }
+ string argvalue_name9 = "errorcode";
+ string argname9 = "ErrorCode";
+ string argtype9 = "String";
+ string argdesc9 = "";
+ strParameter += CombineXMLParameter(argvalue_name9, argname9, argtype9, ErrorCode, argdesc9);
+
+ // request XML字串
+ InXml = CombineXMLRequest(strIdentity, strParameter);
+
+ OutXml = modAutoRun.InvokeSrv("wsAUT.funEndProcessJob_ErrorCode", InXml);
+
+ XmlDoc.LoadXml(OutXml);
+ if (!chkExecutionSuccess(XmlDoc))
+ {
+ throw new Exception(GetExceptionSysMsg(XmlDoc) + '\r' + GetExceptionMesMsg(XmlDoc));
+ }
+
+ funEndProcessJob_ErrorCodeRet = 0;
+ }
+
+ catch (Exception e1)
+ {
+ funWriteTxtFile("funEndProcessJob (JobNo : " + JobNo + ") Error : " + e1.Message);
+ funWriteToAnEventLog("funEndProcessJob (JobNo : " + JobNo + ") Error : " + e1.Message, EventLogEntryType.Error, 9000);
+ }
+
+ return funEndProcessJob_ErrorCodeRet;
+
+ }
+ ///
+ /// 啟動時先刪除資料庫中上次執行的殘留JobQueue
+ ///
+ ///
+ public void funDelMesAutoRunQueue()
+ {
+
+ // //Web Service相關變數
+ var XmlDoc = new XmlDocument();
+ string InXml, OutXml, strIdentity, strParameter;
+
+ // 組InXml的字串
+ string argSendTime = Conversions.ToString(DateTime.Now);
+ strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime);
+ string argvalue_name = "servername";
+ string argname = "ServerName";
+ string argtype = "String";
+ string argdesc = "";
+ strParameter = CombineXMLParameter(argvalue_name, argname, argtype, System.Windows.Forms.SystemInformation.ComputerName.ToString().ToUpper(), argdesc);
+ InXml = CombineXMLRequest(strIdentity, strParameter);
+
+ try
+ {
+ // OutXml = wsAUT.DelMesAutoRunQueue(InXml)
+ OutXml = modAutoRun.InvokeSrv("wsAUT.DelMesAutoRunQueue", InXml);
+
+ // 利用XmlDoc物件處理ReturnValue
+ XmlDoc.LoadXml(OutXml);
+ if (!chkExecutionSuccess(XmlDoc))
+ {
+ throw new Exception(GetExceptionSysMsg(XmlDoc) + '\r' + GetExceptionMesMsg(XmlDoc));
+ }
+ }
+
+ catch (Exception e1)
+ {
+ funWriteTxtFile("funDelMesAutoRunQueue Error : " + e1.Message);
+ funWriteToAnEventLog("funDelMesAutoRunQueue Error : " + e1.Message, EventLogEntryType.Error, 9000);
+ }
+
+ }
+
+ private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs args)
+ {
+ try
+ {
+ Exception e = (Exception)args.ExceptionObject;
+ funWriteTxtFile(e.Message);
+ funWriteToAnEventLog(e.Message, EventLogEntryType.Error, 9000);
+ }
+
+ catch (Exception ex)
+ {
+
+ }
+ }
+
+ // 2017/12/26 OwenLiu, mantis:0043439, AutoRunService 問題調整
+ // 2014/06/25 YF, 將tblJobQueue內Running的Job與CollectionJob做比對, 來判斷Job是否已死在Queue內
+ // 若CollectionJob沒有此JobNo, 則表示Job已死, 將Job狀態改為Standby, 即可再繼續執行
+ private void CheckJobIsDead()
+ {
+
+ try
+ {
+
+ foreach (DataRow row in modAutoRun.dsJobQueue.Tables[tblJobQueue].Select("(ServerName is null Or ServerName='' Or ServerName='" + System.Windows.Forms.SystemInformation.ComputerName.ToString().ToUpper() + "') and STATUS='Running'"))
+ {
+
+ if (!CollectionJob.Contains(Conversions.ToString(row["JobNo"])))
+ {
+ row["Status"] = "Standby";
+ }
+
+ }
+ }
+
+ catch (Exception ex)
+ {
+ funWriteTxtFile("CheckJobIsDead Error: " + ex.Message);
+ funWriteToAnEventLog(ex.Message, EventLogEntryType.Error, 9000);
+ }
+
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.csproj b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.csproj
new file mode 100644
index 0000000..8e632c1
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.csproj
@@ -0,0 +1,272 @@
+
+
+
+ Debug
+ AnyCPU
+ 8.0.50727
+ 2.0
+ {1D8229EF-DEED-0C6F-1A45-76DD01FBF457}
+ WinExe
+ AutoRunService.AutoRunService
+ AutoRunService
+ AutoRunService
+ Console
+ SAK
+ SAK
+ SAK
+ SAK
+ v4.6.2
+
+
+ 2.0
+
+
+ false
+ D:\Temp\MESSeries6\AutoRunService\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 1
+ 1.0.0.%2a
+ false
+ true
+ true
+ $(DefaultItemExcludes);$(ProjectDir)**\*.vb
+
+
+ true
+ full
+ true
+ true
+ ..\..\..\MESClient\AutoRunServiceInstall\
+ ..\..\..\MESClient\AutoRunServiceInstall\AutoRunService.xml
+ 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355
+ false
+
+
+ pdbonly
+ false
+ true
+ true
+ ..\..\..\MESClient\AutoRunServiceInstall\
+ ..\..\..\MESClient\AutoRunServiceInstall\
+
+ 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355
+ false
+
+
+ BB1E0A6C038D360CE4BE9723ABC415D99A432E73
+
+
+
+
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+
+ False
+ ..\..\..\MES_C_DLL\AutoRunLib.dll
+
+
+ ..\..\..\MES_S_DLL\data_access_service.dll
+
+
+ ..\..\..\MES_S_DLL\iMESAppSetting.dll
+
+
+ ..\..\..\MES_S_DLL\iMESChart_HtmlHandler.dll
+
+
+ ..\..\..\MES_S_DLL\iMESComInvoke.dll
+
+
+ ..\..\..\MES_S_DLL\iMESComSubroutine.dll
+ True
+
+
+ ..\..\..\MES_S_DLL\iMESComXML.dll
+ True
+
+
+ ..\..\..\MES_S_DLL\iMESConst.dll
+ True
+
+
+ False
+ ..\..\..\MES_C_DLL\Ionic.Zip.dll
+
+
+
+ ..\..\..\MES_S_DLL\GuardServerProvider.dll
+
+
+ False
+ ..\..\..\MES_S_DLL\iMESCIO.dll
+
+
+ ..\..\..\MES_S_DLL\iMESDAO.dll
+
+
+ ..\..\..\MES_S_DLL\iMESDataObject.dll
+
+
+ ..\..\..\MES_S_DLL\iMESProjectBase.dll
+
+
+ ..\..\..\MES_S_DLL\iMESLicxManager.dll
+ True
+
+
+ False
+ ..\..\..\MES_C_DLL\NPOI.dll
+
+
+ False
+ ..\..\..\MES_C_DLL\NPOI.OOXML.dll
+
+
+ False
+ ..\..\..\MES_C_DLL\NPOI.OpenXml4Net.dll
+
+
+ False
+ ..\..\..\MES_C_DLL\NPOI.OpenXmlFormats.dll
+
+
+ False
+ ..\..\..\MES_S_DLL\Oracle.ManagedDataAccess.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ Application.myapp
+
+
+ Component
+
+
+ AutoRunService.cs
+
+
+
+ True
+ Settings.settings
+ True
+
+
+ ProjectInstaller.cs
+
+
+ Component
+
+
+
+
+ Designer
+ AutoRunService.cs
+
+
+ Designer
+ ProjectInstaller.cs
+
+
+
+
+
+ Always
+
+
+ Always
+
+
+ MyApplicationCodeGenerator
+ Application.Designer.cs
+
+
+ SettingsSingleFileGenerator
+ AutoRunService.My
+ Settings.Designer.cs
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+
+
+
+
+
+
+
+
+ Always
+
+
+
+
+ False
+ Microsoft .NET Framework 4 %28x86 和 x64%29
+ true
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+ False
+ Windows Installer 4.5
+ true
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.csproj.vspscc b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.csproj.vspscc
new file mode 100644
index 0000000..b6d3289
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = ""
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.resx b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.resx
new file mode 100644
index 0000000..548ef71
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService.resx
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 56
+
+
+ 17, 17
+
+
+ False
+
+
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService_TemporaryKey.pfx b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/AutoRunService_TemporaryKey.pfx
new file mode 100644
index 0000000000000000000000000000000000000000..36becd92fd02ae95b2a5236777cd479ef182993a
GIT binary patch
literal 1645
zcmbVMc{r6>96sOO>_)lwTD#F=qLJ^zb#D_zN}`KwbupnUxmmN+pkds}wNFx(v2P_y
z=#pf#AVj4+qD?i(7MU2^EolzVjA@={{+j1|-gAEMd(Q8Czu$Sj_d|IkE)Kz?Jkmyz
zmhF4whrO41S
z6a4|R*x+ev|BE`=2XkIWSIv1@%(YH2pDUeLcI{k>%5*;Fti{P@)W7f>~)xidE%7CG%4@UV@pmiJ;|?)
zV-VFJbn&!kL6dBHPIJ!=>5ERYZd;o~KBt%>PY#I6(I_+ahDqqxm6znT_ixvU^D)Vu
zt}Ah3w!Hf26{*%AGafnoL7n^Aer-cv<vSI)FJ${$s+pAdN#*W1F(X*a864%AwQsf;TdjyR%=cmwFH@sXgL@^B&st%BJ
zW!3E)srzDEZz&QdqH%T6l}{Jd2L-iN#@Mu6vUYUdov;x;nZIx>CgjQb_;jggmxkLP
z#8wk_AZrxYZ4PQSs-;oq**z?$`kq4_m}^#NQK*fQ$ixF3wp`$@DpyT?lMinUZp~5f
z@k$TKG^@02R{89JpTvVYzZc|eUz0U`j355_=6oxm@bJS1Lw)2o>Uq8VtA!f^Wd!wI
zwU3OQyOZPQ)W(^oK2RovEY2n?zNpG@10|M$SSpM&=U;F;D$=f)C=5pE|}fBFWs-m
zDIA%XIjVJhHvH;9?c-juPl(}HsS3(g=b9Mhr<3oh&lhi+SGDQy?Iv4~dIwbw`f}6R
z?m{)S1X7_E|9GZI@~g9wi~G$>j9Qa?bnfl27h{hF_?mL-IDU7{JM@Xpp4^hpT;T@!
zvpcViwD({Uov7@}XD&v;NCW}`06-o85y_YZZ662)JHc+i1Q?(LBZ%EV6VBSe7>=4i
z7e-65Cfub5(B()M&RZdvfB_#}n6nFJVc-Y!JCfLD5<)MgONtLT3YjsCgMlB^d?EJ-t}ymk&QbwZ%ll41<_3-cf9OQ3mFkyFjWdGQ
zGl23|2>O@K#luA@D2lE4R*VW05Fvqw%%D7E62c)Dk3(=c8TtAY`L3Cl7g+hFG3D-U
zY*cFHB?yrSPzFXvbx3$S0-pBGa;G-H9M}R&Se_^|V!9_%X;R^TFS)=5ZJc)$8
zuM4Ud6EY`O8BE@OA24lp8KDLIa_)DDq2>bZsKntuzoekjM`44#-VWt@H@eih8K;l`
zhz)Mx5jVrOfMXarMn
z&0Rm$W`KW2i&zl&$G7VT(hOS5yM@30Fqc+SOK=v=~_mFzd@|?C??a^t_U%@2DVk&3Wh`^IfTRW((`KN7$yHqd8&Y#odvyGNTyf
zzx}WcU5kp4h?}MHI7I?kyFM!B)4A6A;=UI;ZwiO4Z#g|!M
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+// ------------------------------------------------------------------------------
+
+
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/Application.myapp b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/Application.myapp
new file mode 100644
index 0000000..602de37
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/Application.myapp
@@ -0,0 +1,10 @@
+
+
+ false
+ false
+ 0
+ true
+ 0
+ 3
+ true
+
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/AssemblyInfo.cs b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/AssemblyInfo.cs
new file mode 100644
index 0000000..ac06c1c
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/AssemblyInfo.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// 一般的組件資訊是由下列這組屬性所控制。
+// 變更這些屬性的值即可修改組件的相關資訊。
+// 檢閱組件屬性的值
+
+[assembly: AssemblyTitle("AutoRunService")]
+[assembly: AssemblyDescription("AutoRunService for MESSeries")]
+[assembly: AssemblyCompany("iMES Technology Inc.")]
+[assembly: AssemblyProduct("MESSeries 6")]
+[assembly: AssemblyCopyright("Copyright © iMES Technology Inc.")]
+[assembly: AssemblyTrademark("")]
+[assembly: ComVisible(true)]
+
+// 下列 GUID 為專案公開 (Expose) 至 COM 時所要使用的 typelib ID
+[assembly: Guid("88779103-B613-42AE-9368-24C38D3E131A")]
+
+// 組件的版本資訊由下列四個值所組成:
+//
+// 主要版本
+// 次要版本
+// 組建編號
+// 修訂
+//
+// 您可以自行指定所有的值,也可以依照以下的方式,使用 '*' 將修訂和組建編號
+// 指定為預設值:
+
+[assembly: AssemblyVersion("6.0.0.0")]
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/BuildIncrementVersionInfo.cs b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/BuildIncrementVersionInfo.cs
new file mode 100644
index 0000000..af1c995
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/BuildIncrementVersionInfo.cs
@@ -0,0 +1,2 @@
+
+[assembly: System.Reflection.AssemblyFileVersion("6.0.7.30207")]
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/Resources.resx b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/Resources.resx
new file mode 100644
index 0000000..25a6121
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/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/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/Settings.Designer.cs b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/Settings.Designer.cs
new file mode 100644
index 0000000..fe34b13
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/Settings.Designer.cs
@@ -0,0 +1,101 @@
+// ------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+// ------------------------------------------------------------------------------
+
+using System.Diagnostics;
+using Microsoft.VisualBasic;
+using Microsoft.VisualBasic.CompilerServices;
+
+
+namespace AutoRunService.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;
+ }
+ }
+
+ [System.Configuration.ApplicationScopedSetting()]
+ [DebuggerNonUserCode()]
+ [System.Configuration.SpecialSetting(System.Configuration.SpecialSetting.WebServiceUrl)]
+ [System.Configuration.DefaultSettingValue("http://localhost/MESws_STD/wsInvoke.asmx")]
+ public string AutoRunService_wsInvoke_wsInvoke
+ {
+ get
+ {
+ return Conversions.ToString(this["AutoRunService_wsInvoke_wsInvoke"]);
+ }
+ }
+ }
+}
+
+namespace AutoRunService.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/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/Settings.settings b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/Settings.settings
new file mode 100644
index 0000000..3453767
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/My Project/Settings.settings
@@ -0,0 +1,9 @@
+
+
+
+
+
+ http://localhost/MESws_STD/wsInvoke.asmx
+
+
+
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/ProjectInstaller.Designer.cs b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/ProjectInstaller.Designer.cs
new file mode 100644
index 0000000..b831014
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/ProjectInstaller.Designer.cs
@@ -0,0 +1,89 @@
+using System.Diagnostics;
+using System.Runtime.CompilerServices;
+
+namespace AutoRunService
+{
+ [System.ComponentModel.RunInstaller(true)]
+ public partial class ProjectInstaller : System.Configuration.Install.Installer
+ {
+
+ // Installer 覆寫 Dispose 以清除元件清單。
+ [DebuggerNonUserCode()]
+ protected override void Dispose(bool disposing)
+ {
+ try
+ {
+ if (disposing && components != null)
+ {
+ components.Dispose();
+ }
+ }
+ finally
+ {
+ base.Dispose(disposing);
+ }
+ }
+
+ // 為元件設計工具的必要項
+ private System.ComponentModel.IContainer components;
+
+ // 注意: 以下為元件設計工具所需的程序
+ // 您可以使用元件設計工具進行修改。
+ // 請不要使用程式碼編輯器進行修改。
+ [DebuggerStepThrough()]
+ private void InitializeComponent()
+ {
+ _ServiceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
+ _ServiceInstaller1 = new System.ServiceProcess.ServiceInstaller();
+ //
+ // ServiceProcessInstaller1
+ //
+ _ServiceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
+ _ServiceProcessInstaller1.Password = null;
+ _ServiceProcessInstaller1.Username = null;
+ //
+ // ServiceInstaller1
+ //
+ _ServiceInstaller1.DisplayName = "MES AutoRun Service";
+ _ServiceInstaller1.ServiceName = "MES AutoRun Service";
+ //
+ // ProjectInstaller
+ //
+ Installers.AddRange(new System.Configuration.Install.Installer[] { _ServiceProcessInstaller1, _ServiceInstaller1 });
+
+ }
+ private System.ServiceProcess.ServiceProcessInstaller _ServiceProcessInstaller1;
+
+ internal virtual System.ServiceProcess.ServiceProcessInstaller ServiceProcessInstaller1
+ {
+ [MethodImpl(MethodImplOptions.Synchronized)]
+ get
+ {
+ return _ServiceProcessInstaller1;
+ }
+
+ [MethodImpl(MethodImplOptions.Synchronized)]
+ set
+ {
+ _ServiceProcessInstaller1 = value;
+ }
+ }
+ private System.ServiceProcess.ServiceInstaller _ServiceInstaller1;
+
+ internal virtual System.ServiceProcess.ServiceInstaller ServiceInstaller1
+ {
+ [MethodImpl(MethodImplOptions.Synchronized)]
+ get
+ {
+ return _ServiceInstaller1;
+ }
+
+ [MethodImpl(MethodImplOptions.Synchronized)]
+ set
+ {
+ _ServiceInstaller1 = value;
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/ProjectInstaller.cs b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/ProjectInstaller.cs
new file mode 100644
index 0000000..5fa66fa
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/ProjectInstaller.cs
@@ -0,0 +1,19 @@
+
+namespace AutoRunService
+{
+
+ public partial class ProjectInstaller
+ {
+
+ public ProjectInstaller() : base()
+ {
+
+ // 此為元件設計工具所需的呼叫。
+ InitializeComponent();
+
+ // 在呼叫 InitializeComponent 之後加入初始化程式碼
+
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/ProjectInstaller.resx b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/ProjectInstaller.resx
new file mode 100644
index 0000000..a387ccf
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/ProjectInstaller.resx
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ 17, 56
+
+
+ 17, 17
+
+
+ False
+
+
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/ReplicationTableList.config b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/ReplicationTableList.config
new file mode 100644
index 0000000..e69de29
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/Uninstall_x64.bat b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/Uninstall_x64.bat
new file mode 100644
index 0000000..61d8a39
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/Uninstall_x64.bat
@@ -0,0 +1,4 @@
+%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe "%~dp0AutoRunService.exe" -u
+
+
+Pause
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/Uninstall_x86.bat b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/Uninstall_x86.bat
new file mode 100644
index 0000000..20d4564
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/Uninstall_x86.bat
@@ -0,0 +1,3 @@
+%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe "%~dp0AutoRunService.exe" -u
+
+Pause
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/app.config b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/app.config
new file mode 100644
index 0000000..337334e
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/app.config
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ http://internal.imestech.com/MESws_STD_6033/wsInvoke.asmx
+
+
+ http://localhost/MESEAI_DSC/wsMES.asmx
+
+
+
+
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/modAutoRun.cs b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/modAutoRun.cs
new file mode 100644
index 0000000..8f0838b
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/modAutoRun.cs
@@ -0,0 +1,90 @@
+using System;
+using System.Data;
+using System.Diagnostics;
+using Microsoft.VisualBasic;
+using Microsoft.VisualBasic.CompilerServices;
+using AutoRunLib;
+
+namespace AutoRunService
+{
+ static class modAutoRun
+ {
+
+ // Dim objLic As New iMESLicxManager.clsDBCom
+
+ public static int gIntCurrentJobCount;
+ public static DateTime dateStartTime;
+ public static string gStatus; // 目前是否起動AutoRun
+ public static DataSet dsJobQueue = new DataSet();
+ public static DataSet dsJob = new DataSet();
+ // Public Const defInteger As Integer = -999 '宣告整數使用的常數,用以辨識參數是否有傳入Function中。
+ // Public Const defString As String = "Null" '宣告字串使用的常數,用以辨識參數是否有傳入Function中。
+ // Public Const defDateTime As Date = #12/31/1900# '宣告日期使用的常數,用以辨識參數是否有傳入Function中。
+
+ // Public ConnectionString As String = objLic.GetConnectionString 'app.config要設連線字串
+ public const int cJobList2Queue = 30; // 每隔30秒鐘, 取回一次JOB LIST 到 JOB QUEUE
+ public const int cCheckQueue = 17; // 每隔17秒鐘,到 JOB QUEUE 檢查是否有要執行的
+ public static int gIntMaxRunningJobCount = 5; // 最大允許同時執行數量
+
+
+ public class SomeStateType
+ {
+ public string strJobNo;
+ public string strCommandName;
+ public void SomeState(string strJN, string strCN)
+ {
+ strJobNo = strJN;
+ strCommandName = strCN;
+ }
+ }
+
+ public static bool PrevInstance()
+ {
+ if (Information.UBound(Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName)) > 0)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ #region Invoke
+
+ ///
+ /// 叫用Web Service, 並回傳Response XML
+ ///
+ /// 要呼叫哪一個WebService的方法, ex: wsWIP.LoadLotBasis
+ /// InXml
+ /// 是否客製的WebService
+ ///
+ public static string InvokeSrv(string Method, string InXml, bool Customize = false)
+ {
+
+ object result;
+
+ try
+ {
+
+ using (var ws = new iMESCore.Base.Invoke.wsInvoke.wsInvoke())
+ {
+ ws.Url = modWIN.LocalizeWebService(ws.Url.ToString(), Customize);
+ ws.EnableDecompression = true;
+ result = ws.invokeSrv(Method, new object[] { InXml });
+ }
+ }
+
+ catch (Exception ex)
+ {
+ throw;
+ }
+
+ return Conversions.ToString(result);
+
+ }
+
+ #endregion
+
+ }
+}
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/modWIN.cs b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/modWIN.cs
new file mode 100644
index 0000000..9066ad5
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/modWIN.cs
@@ -0,0 +1,232 @@
+using System;
+using System.Collections;
+using static System.Configuration.ConfigurationSettings;
+using System.Data;
+using System.Runtime.InteropServices;
+using System.Xml;
+using Microsoft.VisualBasic;
+using Microsoft.VisualBasic.CompilerServices;
+
+namespace AutoRunService
+{
+
+ static class modWIN
+ {
+
+ // ReviseDate : 2003/08/07,修改處理AdditionalXML
+ // ReviseDate : 2003/08/05,新增Public gReturnArray
+ // ReviseDate : 2003/07/01,更改AddFlow產生的Error(CInput)
+ // ReviseDate : 2002/11/04,新增CUnInput function
+
+ public static string gComputerName = System.Environment.MachineName;
+ public static string gUserNo = "AUTService";
+ public static string gMESWebServiceHost = GetAppSettings("MesWebServiceHost");
+ public static string gCUSWebServiceHost = GetAppSettings("CusWebServiceHost");
+ public static string gERPWebServiceHost = GetAppSettings("ERPWebServiceHost");
+ public static string gLanguageMode = GetAppSettings("LanguageMode");
+
+ //新增gEnableSSL配置参数
+ public static bool gEnableSSL = Convert.ToBoolean(GetAppSettings("EnableSSL"));
+ // Add By Peter 2005/6/20
+ public static string gSettingMode = "";
+
+
+ public static string PasswordEncoding(ref string Password)
+ {
+ string PasswordEncodingRet = default(string);
+ // 此 Function 將傳入值加以編碼後傳出,編碼後長度不變
+ // 傳入值: 密碼
+ // 傳回值: 編碼後密碼
+
+ // Vernam密碼是由Gilbert Vernam在1918年發明的
+ string g_Key = "xNDFz6LH67LOv7xKbWFpbMu1wejrM7SzvV4tLRvq3X47m708O1xMHLoaMNCqGhoaEN";
+ string strChar, iCryptChar, strEncrypted = default(string);
+ int i, iKeyChar, iStringChar;
+
+ var loopTo = Strings.Len(Password);
+ for (i = 1; i <= loopTo; i++)
+ {
+ iKeyChar = Strings.Asc(Strings.Mid(g_Key, i, 1));
+ iStringChar = Strings.Asc(Strings.Mid(Password, i, 1));
+ iCryptChar = (iKeyChar ^ iStringChar).ToString();
+ strEncrypted = strEncrypted + Strings.Chr(Conversions.ToInteger(iCryptChar));
+ }
+
+ PasswordEncodingRet = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(strEncrypted));
+ return PasswordEncodingRet;
+
+ }
+
+
+ // 2017-06-05, Joe, 依XML標準定義轉換特殊字元
+ public static string CInputWithXMLStandard(ref string strInput)
+ {
+ string CInputWithXMLStandardRet = default(string);
+
+ // 轉換 ' 為 '
+ CInputWithXMLStandardRet = Strings.Replace(strInput, "'", "'");
+
+ // 轉換 & 為 &
+ CInputWithXMLStandardRet = Strings.Replace(CInputWithXMLStandardRet, "&", "&");
+
+ // 轉換 " 為 quot;
+ CInputWithXMLStandardRet = Strings.Replace(CInputWithXMLStandardRet, "\"", """);
+
+ // 轉換 > 為 >
+ CInputWithXMLStandardRet = Strings.Replace(CInputWithXMLStandardRet, ">", ">");
+
+ // 轉換 < 為 <
+ CInputWithXMLStandardRet = Strings.Replace(CInputWithXMLStandardRet, "<", "<");
+ return CInputWithXMLStandardRet;
+
+ }
+
+ // 2017-06-05, Joe, 依XML標準定義反轉換特殊字元
+ public static string CUnInputWithXMLStandard(ref string strInput)
+ {
+ string CUnInputWithXMLStandardRet = default(string);
+
+ // 轉換 ' 為 "'"
+ CUnInputWithXMLStandardRet = Strings.Replace(strInput, "'", "'");
+
+ // 轉換 " 為 quot;
+ CUnInputWithXMLStandardRet = Strings.Replace(CUnInputWithXMLStandardRet, """, "\"");
+
+ // 轉換 & 為 &
+ CUnInputWithXMLStandardRet = Strings.Replace(CUnInputWithXMLStandardRet, "&", "&");
+
+ // 轉換 > 為 >
+ CUnInputWithXMLStandardRet = Strings.Replace(CUnInputWithXMLStandardRet, ">", ">");
+
+ // 轉換 < 為 <
+ CUnInputWithXMLStandardRet = Strings.Replace(CUnInputWithXMLStandardRet, "<", "<");
+ return CUnInputWithXMLStandardRet;
+
+ }
+
+ // **Add by py 2003/12/04,Gary Lu 20120911:以MESWin1~Win4的版本進行替換
+ public static string LocalizeWebService(string wsUrl, bool Customize = false)
+ {
+
+ string[] tmpString;
+ int i;
+ tmpString = wsUrl.Split('/');
+ if (Customize == true)
+ {
+ if (!string.IsNullOrEmpty(Strings.Trim(gCUSWebServiceHost)))
+ {
+ if (tmpString.Length == 6)
+ {
+ wsUrl = tmpString[0].ToString() + "/" + tmpString[1].ToString() + "/" + gCUSWebServiceHost + "/" + tmpString[4].ToString() + "/" + tmpString[5].ToString();
+ }
+ else if (tmpString.Length == 5)
+ {
+ wsUrl = "http://" + gCUSWebServiceHost + "/" + tmpString[tmpString.Length - 1].ToString();
+ }
+ }
+ }
+ else if (!string.IsNullOrEmpty(Strings.Trim(gMESWebServiceHost)))
+ {
+ if (tmpString.Length == 6)
+ {
+ // wsUrl = "http://" & gMESWebServiceHost & "/" & tmpString(tmpString.Length - 2).ToString & "/" & tmpString(tmpString.Length - 1).ToString
+ wsUrl = tmpString[0].ToString() + "/" + tmpString[1].ToString() + "/" + gMESWebServiceHost + "/" + tmpString[4].ToString() + "/" + tmpString[5].ToString();
+ }
+ else if (tmpString.Length == 5)
+ {
+ wsUrl = "http://" + gMESWebServiceHost + "/" + tmpString[tmpString.Length - 1].ToString();
+ }
+ }
+ if (gEnableSSL)
+ {
+ wsUrl = wsUrl.Replace("http://", "https://");
+ }
+ return wsUrl;
+ // Have to assume the web service is on the machine that this application came from
+ } // LocalizeWebService
+
+ public static string LocalizeWebService_ERP(string wsUrl)
+ {
+
+ string[] tmpString;
+ int i;
+ tmpString = wsUrl.Split('/');
+
+ if (!string.IsNullOrEmpty(Strings.Trim(gERPWebServiceHost)))
+ {
+ wsUrl = tmpString[0].ToString() + "/" + tmpString[1].ToString() + "/" + gERPWebServiceHost + "/" + tmpString[4].ToString();
+ }
+ if (gEnableSSL) {
+ wsUrl = wsUrl.Replace("http://", "https://");
+ }
+ return wsUrl;
+
+ }
+
+ // Add By Peter 2005/6/20
+ public static string GetAppSettings(string key, string section = "")
+ {
+ string result = string.Empty;
+
+ try
+ {
+
+ if (!string.IsNullOrEmpty(section))
+ {
+ result = Conversions.ToString(((Hashtable)GetConfig(section))[key]);
+ }
+ else if (string.IsNullOrEmpty(gSettingMode) || string.IsNullOrEmpty(gSettingMode) || gSettingMode.Length == 0)
+ {
+ result = AppSettings[key];
+ }
+ else
+ {
+ Hashtable ht = (Hashtable)GetConfig(gSettingMode);
+ if (ht != null)
+ {
+ result = Conversions.ToString(ht[key]);
+ if (string.IsNullOrEmpty(result))
+ {
+ result = AppSettings[key];
+ if (string.IsNullOrEmpty(result))
+ {
+ result = "";
+ }
+ }
+ }
+ else
+ {
+ result = AppSettings[key];
+ }
+ }
+ }
+
+ catch (Exception ex)
+ {
+ throw ex;
+ }
+
+ return result;
+
+ }
+
+
+ public static string GetSubString(string strValue, int intLength)
+ {
+ int intLen;
+ string strReturn;
+
+ // Dim byteValue As Byte() = System.Text.Encoding.UTF8.GetBytes(strValue)
+ // If intLength > byteValue.Length - 1 Then
+ // intLen = byteValue.Length - 1
+ // End If
+ // Dim strReturn As String = System.Text.Encoding.UTF8.GetString(byteValue, 0, intLen)
+ intLen = (int)Math.Round(Conversion.Int(intLength / 3d));
+ strReturn = Strings.Left(strValue, intLen);
+
+ return strReturn;
+
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/AutoRunService/安裝說明.txt b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/安裝說明.txt
new file mode 100644
index 0000000..2a41d8d
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/AutoRunService/安裝說明.txt
@@ -0,0 +1,29 @@
+wAutoRun
+
+1. ƻsResourcesƧܦؿ
+2. I@~tΪw˧妸
+ 32줸 Install_x86.bat
+ 64줸 Install_x64.bat
+e:
+%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe "D:\TFS\messeries\MESSeries\MESClient\AutoRunServiceInstall\AutoRunService.exe"
+Pause
+
+3. ƹk > Htκz
+4. w
+5. קsurAutoRunService.exe.config
+6. Windows ServiceҰ (qz-A-MES AutoRun ServiceAiҥ)
+7. NCompilerɮAutoRunLib.dllmD:\TFS\messeries\MESSeries\MESClient\AutoRunServiceInstall
+8. miMESLicxManager.dllD:\TFS\messeries\MESSeries\MESClient\AutoRunServiceInstall
+
+-------------------------------------------------------------------------------------------------------------------------------------------------------
+ѰwAutoRun
+1. Windows Service
+2. I@~tΪw˧妸
+ 32줸 Uninstall_x86.bat
+ 64줸 Uninstall_x64.bat
+e:
+%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe "D:\TFS\messeries\MESSeries\MESClient\AutoRunServiceInstall\AutoRunService.exe" -u
+Pause
+
+3. ƹk > Htκz
+4. w
\ No newline at end of file
diff --git a/SRC/MESAgent/MESAutoRun_STD/MESAutoRun.sln b/SRC/MESAgent/MESAutoRun_STD/MESAutoRun.sln
new file mode 100644
index 0000000..2a9b3fa
--- /dev/null
+++ b/SRC/MESAgent/MESAutoRun_STD/MESAutoRun.sln
@@ -0,0 +1,41 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoRunService", "AutoRunService\AutoRunService.csproj", "{1D8229EF-DEED-0C6F-1A45-76DD01FBF457}"
+ ProjectSection(ProjectDependencies) = postProject
+ {7C0468A8-E807-0FF4-0C04-C1AD9B3D7D2A} = {7C0468A8-E807-0FF4-0C04-C1AD9B3D7D2A}
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoRunLib", "AutoRunLib\AutoRunLib.csproj", "{7C0468A8-E807-0FF4-0C04-C1AD9B3D7D2A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x86 = Debug|x86
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {1D8229EF-DEED-0C6F-1A45-76DD01FBF457}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1D8229EF-DEED-0C6F-1A45-76DD01FBF457}.Debug|x86.Build.0 = Debug|Any CPU
+ {1D8229EF-DEED-0C6F-1A45-76DD01FBF457}.Release|x86.ActiveCfg = Release|Any CPU
+ {7C0468A8-E807-0FF4-0C04-C1AD9B3D7D2A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7C0468A8-E807-0FF4-0C04-C1AD9B3D7D2A}.Debug|x86.Build.0 = Debug|Any CPU
+ {7C0468A8-E807-0FF4-0C04-C1AD9B3D7D2A}.Release|x86.ActiveCfg = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(TeamFoundationVersionControl) = preSolution
+ SccNumberOfProjects = 3
+ SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
+ SccTeamFoundationServer = http://tfs.imestech.com:8080/tfs/messeries6
+ SccLocalPath0 = .
+ SccProjectUniqueName1 = AutoRunLib\\AutoRunLib.vbproj
+ SccProjectName1 = AutoRunLib
+ SccLocalPath1 = AutoRunLib
+ SccProjectUniqueName2 = AutoRunService\\AutoRunService.vbproj
+ SccProjectName2 = AutoRunService
+ SccLocalPath2 = AutoRunService
+ EndGlobalSection
+EndGlobal